From 101e9792726a6e2d970e92f160805c5a6de35806 Mon Sep 17 00:00:00 2001 From: =?utf8?q?IOhannes=20m=20zm=C3=B6lnig=20=28Debian/GNU=29?= Date: Tue, 21 Jun 2022 16:20:12 +0200 Subject: [PATCH] New upstream version 7.0.0~ds0 --- BREAKING-CHANGES.txt | 135 + CMakeLists.txt | 32 +- ChangeList.txt | 10 + LICENSE.md | 7 +- README.md | 4 +- docs/CMake API.md | 41 +- docs/JUCE Module Format.md | 11 +- examples/Assets/AudioLiveScrollingDisplay.h | 2 +- examples/Assets/DSPDemos_Common.h | 2 +- examples/Assets/DemoUtilities.h | 2 +- examples/Assets/WavefrontObjParser.h | 2 +- examples/Audio/AudioAppDemo.h | 4 +- examples/Audio/AudioLatencyDemo.h | 4 +- examples/Audio/AudioPlaybackDemo.h | 4 +- examples/Audio/AudioRecordingDemo.h | 4 +- examples/Audio/AudioSettingsDemo.h | 4 +- examples/Audio/AudioSynthesiserDemo.h | 4 +- examples/Audio/CMakeLists.txt | 8 +- examples/Audio/MPEDemo.h | 4 +- examples/Audio/MidiDemo.h | 4 +- examples/Audio/PluckedStringsDemo.h | 4 +- examples/Audio/SimpleFFTDemo.h | 4 +- examples/CMake/CMakeLists.txt | 8 +- examples/CMakeLists.txt | 14 +- examples/DSP/CMakeLists.txt | 8 +- examples/DSP/ConvolutionDemo.h | 4 +- examples/DSP/FIRFilterDemo.h | 4 +- examples/DSP/GainDemo.h | 4 +- examples/DSP/IIRFilterDemo.h | 4 +- examples/DSP/OscillatorDemo.h | 4 +- examples/DSP/OverdriveDemo.h | 4 +- examples/DSP/SIMDRegisterDemo.h | 4 +- examples/DSP/StateVariableFilterDemo.h | 4 +- examples/DSP/WaveShaperTanhDemo.h | 4 +- .../Builds/Android/app/CMakeLists.txt | 3923 +++--- .../Android/app/src/main/AndroidManifest.xml | 4 +- .../main/assets/AudioLiveScrollingDisplay.h | 2 +- .../app/src/main/assets/DSPDemos_Common.h | 2 +- .../app/src/main/assets/DemoUtilities.h | 2 +- .../app/src/main/assets/WavefrontObjParser.h | 2 +- .../DemoRunner/Builds/LinuxMakefile/Makefile | 32 +- .../DemoRunner.xcodeproj/project.pbxproj | 66 +- .../DemoRunner/Builds/MacOSX/Info-App.plist | 4 +- .../Builds/VisualStudio2015/DemoRunner.sln | 21 - .../VisualStudio2015/DemoRunner_App.vcxproj | 3478 ------ .../DemoRunner_App.vcxproj.filters | 6047 --------- .../Builds/VisualStudio2015/icon.ico | Bin 45126 -> 0 bytes .../Builds/VisualStudio2015/resources.rc | 36 - .../VisualStudio2017/DemoRunner_App.vcxproj | 302 +- .../DemoRunner_App.vcxproj.filters | 601 +- .../Builds/VisualStudio2017/resources.rc | 6 +- .../VisualStudio2019/DemoRunner_App.vcxproj | 302 +- .../DemoRunner_App.vcxproj.filters | 601 +- .../Builds/VisualStudio2019/resources.rc | 6 +- .../VisualStudio2022/DemoRunner_App.vcxproj | 302 +- .../DemoRunner_App.vcxproj.filters | 601 +- .../Builds/VisualStudio2022/resources.rc | 6 +- .../iOS/DemoRunner.xcodeproj/project.pbxproj | 62 +- examples/DemoRunner/Builds/iOS/Info-App.plist | 4 +- examples/DemoRunner/CMakeLists.txt | 10 +- examples/DemoRunner/DemoRunner.jucer | 32 +- .../DemoRunner/JuceLibraryCode/JuceHeader.h | 4 +- .../include_juce_audio_processors_ara.cpp | 8 + ...include_juce_audio_processors_lv2_libs.cpp | 8 + .../DemoRunner/Source/Demos/DemoPIPs1.cpp | 8 +- .../DemoRunner/Source/Demos/DemoPIPs2.cpp | 12 +- .../DemoRunner/Source/Demos/IntroScreen.h | 8 +- .../DemoRunner/Source/Demos/JUCEDemos.cpp | 8 +- examples/DemoRunner/Source/Demos/JUCEDemos.h | 8 +- examples/DemoRunner/Source/Main.cpp | 8 +- .../Source/UI/DemoContentComponent.cpp | 8 +- .../Source/UI/DemoContentComponent.h | 8 +- .../DemoRunner/Source/UI/MainComponent.cpp | 8 +- examples/DemoRunner/Source/UI/MainComponent.h | 8 +- .../DemoRunner/Source/UI/SettingsContent.h | 13 +- examples/GUI/AccessibilityDemo.h | 4 +- examples/GUI/AnimationAppDemo.h | 4 +- examples/GUI/AnimationDemo.h | 4 +- examples/GUI/BouncingBallWavetableDemo.h | 4 +- examples/GUI/CMakeLists.txt | 8 +- examples/GUI/CameraDemo.h | 4 +- examples/GUI/CodeEditorDemo.h | 4 +- examples/GUI/ComponentDemo.h | 4 +- examples/GUI/ComponentTransformsDemo.h | 4 +- examples/GUI/DialogsDemo.h | 4 +- examples/GUI/FlexBoxDemo.h | 4 +- examples/GUI/FontsDemo.h | 4 +- examples/GUI/GraphicsDemo.h | 4 +- examples/GUI/GridDemo.h | 4 +- examples/GUI/HelloWorldDemo.h | 4 +- examples/GUI/ImagesDemo.h | 4 +- examples/GUI/KeyMappingsDemo.h | 4 +- examples/GUI/LookAndFeelDemo.h | 4 +- examples/GUI/MDIDemo.h | 4 +- examples/GUI/MenusDemo.h | 4 +- examples/GUI/MultiTouchDemo.h | 4 +- examples/GUI/OpenGLAppDemo.h | 4 +- examples/GUI/OpenGLDemo.h | 4 +- examples/GUI/OpenGLDemo2D.h | 4 +- examples/GUI/PropertiesDemo.h | 4 +- examples/GUI/VideoDemo.h | 4 +- examples/GUI/WebBrowserDemo.h | 4 +- examples/GUI/WidgetsDemo.h | 4 +- examples/GUI/WindowsDemo.h | 4 +- examples/Plugins/ARAPluginDemo.h | 1419 +++ examples/Plugins/AUv3SynthPluginDemo.h | 6 +- examples/Plugins/ArpeggiatorPluginDemo.h | 8 +- examples/Plugins/AudioPluginDemo.h | 56 +- examples/Plugins/CMakeLists.txt | 8 +- examples/Plugins/DSPModulePluginDemo.h | 354 +- examples/Plugins/GainPluginDemo.h | 6 +- examples/Plugins/HostPluginDemo.h | 588 + .../Plugins/InterAppAudioEffectPluginDemo.h | 529 - examples/Plugins/MidiLoggerPluginDemo.h | 4 +- examples/Plugins/MultiOutSynthPluginDemo.h | 21 +- examples/Plugins/NoiseGatePluginDemo.h | 8 +- .../Plugins/ReaperEmbeddedViewPluginDemo.h | 6 +- examples/Plugins/SamplerPluginDemo.h | 11 +- examples/Plugins/SurroundPluginDemo.h | 516 +- examples/Utilities/AnalyticsCollectionDemo.h | 4 +- examples/Utilities/Box2DDemo.h | 4 +- examples/Utilities/CMakeLists.txt | 8 +- examples/Utilities/ChildProcessDemo.h | 4 +- examples/Utilities/CryptographyDemo.h | 4 +- examples/Utilities/InAppPurchasesDemo.h | 40 +- examples/Utilities/JavaScriptDemo.h | 4 +- examples/Utilities/LiveConstantDemo.h | 7 +- examples/Utilities/MultithreadingDemo.h | 4 +- examples/Utilities/NetworkingDemo.h | 4 +- examples/Utilities/OSCDemo.h | 4 +- examples/Utilities/PushNotificationsDemo.h | 2 +- examples/Utilities/SystemInfoDemo.h | 4 +- examples/Utilities/TimersAndEventsDemo.h | 4 +- examples/Utilities/UnitTestsDemo.h | 6 +- examples/Utilities/ValueTreesDemo.h | 4 +- examples/Utilities/XMLandJSONDemo.h | 4 +- .../Builds/Android/app/CMakeLists.txt | 3320 ++--- .../Android/app/src/main/AndroidManifest.xml | 2 +- .../Builds/LinuxMakefile/Makefile | 32 +- .../project.pbxproj | 24 +- .../AudioPerformanceTest_App.vcxproj | 298 +- .../AudioPerformanceTest_App.vcxproj.filters | 601 +- .../project.pbxproj | 20 +- extras/AudioPerformanceTest/CMakeLists.txt | 8 +- .../include_juce_audio_processors_ara.cpp | 8 + ...include_juce_audio_processors_lv2_libs.cpp | 8 + extras/AudioPerformanceTest/Source/Main.cpp | 8 +- .../Source/MainComponent.h | 8 +- extras/AudioPluginHost/AudioPluginHost.jucer | 29 +- .../Builds/Android/app/CMakeLists.txt | 3635 +++--- .../Android/app/src/main/AndroidManifest.xml | 2 +- .../main/assets/AudioLiveScrollingDisplay.h | 2 +- .../app/src/main/assets/DSPDemos_Common.h | 2 +- .../app/src/main/assets/DemoUtilities.h | 2 +- .../app/src/main/assets/WavefrontObjParser.h | 2 +- .../Builds/LinuxMakefile/Makefile | 38 +- .../AudioPluginHost.xcodeproj/project.pbxproj | 60 +- .../VisualStudio2015/AudioPluginHost.sln | 21 - .../AudioPluginHost_App.vcxproj | 3192 ----- .../AudioPluginHost_App.vcxproj.filters | 5537 --------- .../Builds/VisualStudio2015/icon.ico | Bin 42800 -> 0 bytes .../Builds/VisualStudio2015/resources.rc | 36 - .../AudioPluginHost_App.vcxproj | 304 +- .../AudioPluginHost_App.vcxproj.filters | 607 +- .../AudioPluginHost_App.vcxproj | 304 +- .../AudioPluginHost_App.vcxproj.filters | 607 +- .../AudioPluginHost_App.vcxproj | 304 +- .../AudioPluginHost_App.vcxproj.filters | 607 +- .../AudioPluginHost.xcodeproj/project.pbxproj | 56 +- extras/AudioPluginHost/CMakeLists.txt | 16 +- .../JuceLibraryCode/BinaryData.cpp | 6 +- .../include_juce_audio_processors_ara.cpp | 8 + ...include_juce_audio_processors_lv2_libs.cpp | 8 + extras/AudioPluginHost/Source/HostStartup.cpp | 23 +- .../Source/Plugins/ARAPlugin.cpp | 33 + .../Source/Plugins/ARAPlugin.h | 1405 +++ .../Source/Plugins/IOConfigurationWindow.cpp | 8 +- .../Source/Plugins/IOConfigurationWindow.h | 8 +- .../Source/Plugins/InternalPlugins.cpp | 9 +- .../Source/Plugins/InternalPlugins.h | 8 +- .../Source/Plugins/PluginGraph.cpp | 79 +- .../Source/Plugins/PluginGraph.h | 38 +- .../Source/UI/GraphEditorPanel.cpp | 34 +- .../Source/UI/GraphEditorPanel.h | 14 +- .../Source/UI/MainHostWindow.cpp | 271 +- .../Source/UI/MainHostWindow.h | 16 +- .../AudioPluginHost/Source/UI/PluginWindow.h | 31 +- .../Builds/LinuxMakefile/Makefile | 20 +- .../BinaryBuilder.xcodeproj/project.pbxproj | 10 +- .../BinaryBuilder_ConsoleApp.vcxproj | 25 +- .../BinaryBuilder_ConsoleApp.vcxproj.filters | 21 + extras/BinaryBuilder/CMakeLists.txt | 8 +- extras/BinaryBuilder/Source/Main.cpp | 8 +- extras/Build/CMake/JUCECheckAtomic.cmake | 8 +- extras/Build/CMake/JUCEConfig.cmake.in | 2 + extras/Build/CMake/JUCEHelperTargets.cmake | 31 +- extras/Build/CMake/JUCEModuleSupport.cmake | 96 +- extras/Build/CMake/JUCEUtils.cmake | 237 +- extras/Build/CMake/JuceLV2Defines.h.in | 5 + .../CMake/PIPAudioProcessorWithARA.cpp.in | 23 + extras/Build/CMake/checkBundleSigning.cmake | 8 +- extras/Build/CMake/copyDir.cmake | 8 +- .../CMake/juce_runtime_arch_detection.cpp | 25 + extras/Build/CMakeLists.txt | 8 +- .../juce_build_tools/juce_build_tools.cpp | 8 +- .../Build/juce_build_tools/juce_build_tools.h | 10 +- .../utils/juce_BinaryResourceFile.cpp | 16 +- .../utils/juce_BinaryResourceFile.h | 8 +- .../utils/juce_BuildHelperFunctions.cpp | 14 +- .../utils/juce_BuildHelperFunctions.h | 8 +- .../utils/juce_CppTokeniserFunctions.cpp | 8 +- .../utils/juce_Entitlements.cpp | 8 +- .../utils/juce_Entitlements.h | 8 +- .../juce_build_tools/utils/juce_Icons.cpp | 8 +- .../Build/juce_build_tools/utils/juce_Icons.h | 8 +- .../utils/juce_PlistOptions.cpp | 15 +- .../utils/juce_PlistOptions.h | 9 +- .../juce_build_tools/utils/juce_ProjectType.h | 98 +- .../utils/juce_RelativePath.h | 8 +- .../utils/juce_ResourceFileHelpers.cpp | 8 +- .../utils/juce_ResourceFileHelpers.h | 8 +- .../utils/juce_ResourceRc.cpp | 8 +- .../juce_build_tools/utils/juce_ResourceRc.h | 8 +- .../utils/juce_VersionNumbers.cpp | 8 +- .../utils/juce_VersionNumbers.h | 8 +- extras/Build/juceaide/CMakeLists.txt | 8 +- extras/Build/juceaide/Main.cpp | 8 +- extras/CMakeLists.txt | 8 +- .../Builds/Android/app/CMakeLists.txt | 3472 +++--- .../Android/app/src/main/AndroidManifest.xml | 2 +- .../Builds/LinuxMakefile/Makefile | 32 +- .../project.pbxproj | 24 +- .../NetworkGraphicsDemo_App.vcxproj | 298 +- .../NetworkGraphicsDemo_App.vcxproj.filters | 601 +- .../project.pbxproj | 20 +- extras/NetworkGraphicsDemo/CMakeLists.txt | 8 +- .../JuceLibraryCode/BinaryData.cpp | 6 +- .../include_juce_audio_processors_ara.cpp | 8 + ...include_juce_audio_processors_lv2_libs.cpp | 8 + .../Source/ClientComponent.h | 8 +- extras/NetworkGraphicsDemo/Source/Demos.h | 10 +- extras/NetworkGraphicsDemo/Source/Main.cpp | 8 +- .../Source/MasterComponent.h | 8 +- .../NetworkGraphicsDemo/Source/SharedCanvas.h | 8 +- extras/Projucer/Builds/LinuxMakefile/Makefile | 20 +- extras/Projucer/Builds/MacOSX/Info-App.plist | 4 +- .../MacOSX/Projucer.xcodeproj/project.pbxproj | 48 +- .../Builds/VisualStudio2015/Projucer.sln | 21 - .../VisualStudio2015/Projucer_App.vcxproj | 2179 ---- .../Projucer_App.vcxproj.filters | 3878 ------ .../Projucer/Builds/VisualStudio2015/icon.ico | Bin 46009 -> 0 bytes .../Builds/VisualStudio2015/resources.rc | 36 - .../VisualStudio2017/Projucer_App.vcxproj | 46 +- .../Projucer_App.vcxproj.filters | 60 +- .../Builds/VisualStudio2017/resources.rc | 6 +- .../VisualStudio2019/Projucer_App.vcxproj | 46 +- .../Projucer_App.vcxproj.filters | 60 +- .../Builds/VisualStudio2019/resources.rc | 6 +- .../VisualStudio2022/Projucer_App.vcxproj | 46 +- .../Projucer_App.vcxproj.filters | 60 +- .../Builds/VisualStudio2022/resources.rc | 6 +- extras/Projucer/CMakeLists.txt | 15 +- .../Projucer/JuceLibraryCode/BinaryData.cpp | 631 +- extras/Projucer/JuceLibraryCode/BinaryData.h | 27 +- extras/Projucer/JuceLibraryCode/JuceHeader.h | 4 +- extras/Projucer/Projucer.jucer | 37 +- .../StartPage/jucer_ContentComponents.h | 8 +- .../StartPage/jucer_NewProjectTemplates.h | 32 +- .../StartPage/jucer_NewProjectWizard.cpp | 25 +- .../StartPage/jucer_NewProjectWizard.h | 8 +- .../StartPage/jucer_StartPageComponent.cpp | 8 +- .../StartPage/jucer_StartPageComponent.h | 8 +- .../StartPage/jucer_StartPageTreeHolder.h | 8 +- .../UserAccount/jucer_LicenseController.h | 8 +- .../UserAccount/jucer_LicenseQueryThread.h | 8 +- .../UserAccount/jucer_LicenseState.h | 8 +- .../UserAccount/jucer_LoginFormComponent.h | 8 +- .../Windows/jucer_AboutWindowComponent.h | 8 +- .../jucer_EditorColourSchemeWindowComponent.h | 8 +- .../Windows/jucer_FloatingToolWindow.h | 8 +- .../jucer_GlobalPathsWindowComponent.h | 24 +- .../Windows/jucer_PIPCreatorWindowComponent.h | 8 +- .../jucer_SVGPathDataWindowComponent.h | 8 +- .../jucer_TranslationToolWindowComponent.h | 8 +- .../Windows/jucer_UTF8WindowComponent.h | 8 +- .../Source/Application/jucer_Application.cpp | 8 +- .../Source/Application/jucer_Application.h | 8 +- .../Source/Application/jucer_AutoUpdater.cpp | 8 +- .../Source/Application/jucer_AutoUpdater.h | 8 +- .../Source/Application/jucer_CommandIDs.h | 8 +- .../Source/Application/jucer_CommandLine.cpp | 14 +- .../Source/Application/jucer_CommandLine.h | 8 +- .../Source/Application/jucer_CommonHeaders.h | 8 +- .../Source/Application/jucer_Headers.h | 8 +- .../Source/Application/jucer_Main.cpp | 8 +- .../Source/Application/jucer_MainWindow.cpp | 8 +- .../Source/Application/jucer_MainWindow.h | 8 +- .../Source/BinaryData/Icons/export_clion.svg | 34 - ...dioPluginARADocumentControllerTemplate.cpp | 42 + ...AudioPluginARADocumentControllerTemplate.h | 36 + ...AudioPluginARAPlaybackRendererTemplate.cpp | 112 + ...r_AudioPluginARAPlaybackRendererTemplate.h | 45 + .../jucer_AudioPluginFilterTemplate.h | 3 + .../jucer_DocumentEditorComponent.cpp | 8 +- .../jucer_DocumentEditorComponent.h | 8 +- .../CodeEditor/jucer_ItemPreviewComponent.h | 8 +- .../CodeEditor/jucer_OpenDocumentManager.cpp | 8 +- .../CodeEditor/jucer_OpenDocumentManager.h | 8 +- .../CodeEditor/jucer_SourceCodeEditor.cpp | 8 +- .../CodeEditor/jucer_SourceCodeEditor.h | 8 +- .../Components/jucer_ButtonHandler.h | 8 +- .../Components/jucer_ComboBoxHandler.h | 8 +- .../Components/jucer_ComponentNameProperty.h | 8 +- .../Components/jucer_ComponentTypeHandler.cpp | 8 +- .../Components/jucer_ComponentTypeHandler.h | 8 +- .../jucer_ComponentUndoableAction.h | 8 +- .../jucer_GenericComponentHandler.h | 8 +- .../Components/jucer_GroupComponentHandler.h | 8 +- .../Components/jucer_HyperlinkButtonHandler.h | 10 +- .../Components/jucer_ImageButtonHandler.h | 8 +- .../Components/jucer_JucerComponentHandler.h | 8 +- .../Components/jucer_LabelHandler.h | 8 +- .../Components/jucer_SliderHandler.h | 8 +- .../Components/jucer_TabbedComponentHandler.h | 8 +- .../Components/jucer_TextButtonHandler.h | 8 +- .../Components/jucer_TextEditorHandler.h | 8 +- .../Components/jucer_ToggleButtonHandler.h | 8 +- .../Components/jucer_TreeViewHandler.h | 8 +- .../Components/jucer_ViewportHandler.h | 8 +- .../Documents/jucer_ButtonDocument.cpp | 8 +- .../Documents/jucer_ButtonDocument.h | 8 +- .../Documents/jucer_ComponentDocument.cpp | 8 +- .../Documents/jucer_ComponentDocument.h | 8 +- .../PaintElements/jucer_ColouredElement.cpp | 8 +- .../PaintElements/jucer_ColouredElement.h | 8 +- .../jucer_ElementSiblingComponent.h | 8 +- .../PaintElements/jucer_FillType.h | 8 +- .../jucer_GradientPointComponent.h | 8 +- .../jucer_ImageResourceProperty.h | 8 +- .../PaintElements/jucer_PaintElement.cpp | 8 +- .../PaintElements/jucer_PaintElement.h | 8 +- .../PaintElements/jucer_PaintElementEllipse.h | 8 +- .../PaintElements/jucer_PaintElementGroup.cpp | 8 +- .../PaintElements/jucer_PaintElementGroup.h | 8 +- .../PaintElements/jucer_PaintElementImage.cpp | 8 +- .../PaintElements/jucer_PaintElementImage.h | 8 +- .../PaintElements/jucer_PaintElementPath.cpp | 8 +- .../PaintElements/jucer_PaintElementPath.h | 8 +- .../jucer_PaintElementRectangle.h | 8 +- .../jucer_PaintElementRoundedRectangle.h | 8 +- .../PaintElements/jucer_PaintElementText.h | 8 +- .../jucer_PaintElementUndoableAction.h | 8 +- .../PaintElements/jucer_PointComponent.h | 8 +- .../PaintElements/jucer_StrokeType.h | 8 +- .../jucer_ColourPropertyComponent.h | 8 +- .../jucer_ComponentBooleanProperty.h | 8 +- .../jucer_ComponentChoiceProperty.h | 8 +- .../jucer_ComponentColourProperty.h | 8 +- .../Properties/jucer_ComponentTextProperty.h | 8 +- .../Properties/jucer_FilePropertyComponent.h | 8 +- .../Properties/jucer_FontPropertyComponent.h | 8 +- .../Properties/jucer_JustificationProperty.h | 8 +- .../Properties/jucer_PositionPropertyBase.h | 8 +- .../UI/jucer_ComponentLayoutEditor.cpp | 8 +- .../UI/jucer_ComponentLayoutEditor.h | 8 +- .../UI/jucer_ComponentLayoutPanel.h | 8 +- .../UI/jucer_ComponentOverlayComponent.cpp | 8 +- .../UI/jucer_ComponentOverlayComponent.h | 8 +- .../UI/jucer_EditingPanelBase.cpp | 8 +- .../UI/jucer_EditingPanelBase.h | 8 +- .../UI/jucer_JucerCommandIDs.h | 8 +- .../UI/jucer_JucerDocumentEditor.cpp | 8 +- .../UI/jucer_JucerDocumentEditor.h | 8 +- .../UI/jucer_PaintRoutineEditor.cpp | 8 +- .../UI/jucer_PaintRoutineEditor.h | 8 +- .../UI/jucer_PaintRoutinePanel.cpp | 8 +- .../UI/jucer_PaintRoutinePanel.h | 8 +- .../UI/jucer_RelativePositionedRectangle.h | 8 +- .../UI/jucer_ResourceEditorPanel.cpp | 8 +- .../UI/jucer_ResourceEditorPanel.h | 8 +- .../UI/jucer_SnapGridPainter.h | 8 +- .../UI/jucer_TestComponent.cpp | 8 +- .../ComponentEditor/UI/jucer_TestComponent.h | 8 +- .../ComponentEditor/jucer_BinaryResources.cpp | 8 +- .../ComponentEditor/jucer_BinaryResources.h | 8 +- .../ComponentEditor/jucer_ComponentLayout.cpp | 8 +- .../ComponentEditor/jucer_ComponentLayout.h | 8 +- .../ComponentEditor/jucer_GeneratedCode.cpp | 8 +- .../ComponentEditor/jucer_GeneratedCode.h | 8 +- .../ComponentEditor/jucer_JucerDocument.cpp | 8 +- .../ComponentEditor/jucer_JucerDocument.h | 8 +- .../ComponentEditor/jucer_ObjectTypes.cpp | 8 +- .../ComponentEditor/jucer_ObjectTypes.h | 8 +- .../ComponentEditor/jucer_PaintRoutine.cpp | 8 +- .../ComponentEditor/jucer_PaintRoutine.h | 8 +- .../ComponentEditor/jucer_UtilityFunctions.h | 8 +- .../Licenses/jucer_LicenseController.cpp | 8 +- .../UI/jucer_ActivityListComponent.h | 8 +- .../UI/jucer_BuildTabStatusComponent.h | 8 +- .../UI/jucer_ComponentListComponent.h | 8 +- .../Modules/jucer_AvailableModulesList.h | 8 +- .../Project/Modules/jucer_ModuleDescription.h | 8 +- .../Source/Project/Modules/jucer_Modules.cpp | 45 +- .../Source/Project/Modules/jucer_Modules.h | 28 +- .../UI/Sidebar/jucer_ExporterTreeItems.h | 9 +- .../Project/UI/Sidebar/jucer_FileTreeItems.h | 8 +- .../UI/Sidebar/jucer_ModuleTreeItems.h | 11 +- .../UI/Sidebar/jucer_ProjectTreeItemBase.h | 8 +- .../Source/Project/UI/Sidebar/jucer_Sidebar.h | 8 +- .../Project/UI/Sidebar/jucer_TreeItemTypes.h | 8 +- .../Project/UI/jucer_ContentViewComponent.h | 8 +- .../Project/UI/jucer_ContentViewComponents.h | 8 +- .../UI/jucer_FileGroupInformationComponent.h | 8 +- .../Project/UI/jucer_HeaderComponent.cpp | 8 +- .../Source/Project/UI/jucer_HeaderComponent.h | 8 +- .../UI/jucer_ModulesInformationComponent.h | 8 +- .../UI/jucer_ProjectContentComponent.cpp | 8 +- .../UI/jucer_ProjectContentComponent.h | 8 +- .../UI/jucer_ProjectMessagesComponent.h | 8 +- .../Project/UI/jucer_UserAvatarComponent.h | 8 +- .../Projucer/Source/Project/jucer_Project.cpp | 397 +- .../Projucer/Source/Project/jucer_Project.h | 58 +- .../jucer_ProjectExport_Android.h | 26 +- .../ProjectSaving/jucer_ProjectExport_CLion.h | 1216 -- .../jucer_ProjectExport_CodeBlocks.h | 44 +- .../ProjectSaving/jucer_ProjectExport_MSVC.h | 368 +- .../ProjectSaving/jucer_ProjectExport_Make.h | 110 +- .../ProjectSaving/jucer_ProjectExport_Xcode.h | 324 +- .../ProjectSaving/jucer_ProjectExporter.cpp | 200 +- .../ProjectSaving/jucer_ProjectExporter.h | 28 +- .../ProjectSaving/jucer_ProjectSaver.cpp | 87 +- .../Source/ProjectSaving/jucer_ProjectSaver.h | 10 +- .../ProjectSaving/jucer_ResourceFile.cpp | 8 +- .../Source/ProjectSaving/jucer_ResourceFile.h | 8 +- .../ProjectSaving/jucer_XcodeProjectParser.h | 8 +- .../Settings/jucer_AppearanceSettings.cpp | 8 +- .../Settings/jucer_AppearanceSettings.h | 8 +- .../Source/Settings/jucer_StoredSettings.cpp | 61 +- .../Source/Settings/jucer_StoredSettings.h | 8 +- .../Utility/Helpers/jucer_CodeHelpers.cpp | 8 +- .../Utility/Helpers/jucer_CodeHelpers.h | 8 +- .../Source/Utility/Helpers/jucer_Colours.h | 8 +- .../Utility/Helpers/jucer_FileHelpers.cpp | 8 +- .../Utility/Helpers/jucer_FileHelpers.h | 8 +- .../Utility/Helpers/jucer_MiscUtilities.cpp | 8 +- .../Utility/Helpers/jucer_MiscUtilities.h | 8 +- .../Utility/Helpers/jucer_NewFileWizard.cpp | 8 +- .../Utility/Helpers/jucer_NewFileWizard.h | 8 +- .../Source/Utility/Helpers/jucer_PresetIDs.h | 32 +- .../Helpers/jucer_TranslationHelpers.h | 8 +- .../Helpers/jucer_ValueSourceHelpers.h | 8 +- ...ucer_ValueTreePropertyWithDefaultWrapper.h | 8 +- .../Utility/Helpers/jucer_VersionInfo.cpp | 8 +- .../Utility/Helpers/jucer_VersionInfo.h | 8 +- .../Utility/PIPs/jucer_PIPGenerator.cpp | 26 +- .../Source/Utility/PIPs/jucer_PIPGenerator.h | 9 +- .../jucer_ColourPropertyComponent.h | 8 +- .../jucer_FilePathPropertyComponent.h | 8 +- .../jucer_LabelPropertyComponent.h | 8 +- .../jucer_PropertyComponentsWithEnablement.h | 8 +- .../Source/Utility/UI/jucer_IconButton.h | 8 +- .../Source/Utility/UI/jucer_Icons.cpp | 18 +- .../Projucer/Source/Utility/UI/jucer_Icons.h | 10 +- .../Utility/UI/jucer_JucerTreeViewBase.cpp | 8 +- .../Utility/UI/jucer_JucerTreeViewBase.h | 8 +- .../Utility/UI/jucer_ProjucerLookAndFeel.cpp | 8 +- .../Utility/UI/jucer_ProjucerLookAndFeel.h | 8 +- .../UI/jucer_SlidingPanelComponent.cpp | 8 +- .../Utility/UI/jucer_SlidingPanelComponent.h | 8 +- .../Builds/LinuxMakefile/Makefile | 32 +- .../UnitTestRunner.xcodeproj/project.pbxproj | 58 +- .../UnitTestRunner_ConsoleApp.vcxproj | 302 +- .../UnitTestRunner_ConsoleApp.vcxproj.filters | 601 +- .../UnitTestRunner_ConsoleApp.vcxproj | 302 +- .../UnitTestRunner_ConsoleApp.vcxproj.filters | 601 +- .../UnitTestRunner_ConsoleApp.vcxproj | 302 +- .../UnitTestRunner_ConsoleApp.vcxproj.filters | 601 +- extras/UnitTestRunner/CMakeLists.txt | 10 +- .../include_juce_audio_processors_ara.cpp | 8 + ...include_juce_audio_processors_lv2_libs.cpp | 8 + extras/UnitTestRunner/Source/Main.cpp | 8 +- extras/UnitTestRunner/UnitTestRunner.jucer | 2 +- .../WindowsDLL_StaticLibrary.vcxproj | 298 +- .../WindowsDLL_StaticLibrary.vcxproj.filters | 601 +- .../include_juce_audio_processors_ara.cpp | 8 + ...include_juce_audio_processors_lv2_libs.cpp | 8 + modules/CMakeLists.txt | 10 +- .../analytics/juce_Analytics.cpp | 8 +- .../juce_analytics/analytics/juce_Analytics.h | 8 +- .../analytics/juce_ButtonTracker.cpp | 8 +- .../analytics/juce_ButtonTracker.h | 8 +- .../destinations/juce_AnalyticsDestination.h | 8 +- .../juce_ThreadedAnalyticsDestination.cpp | 8 +- .../juce_ThreadedAnalyticsDestination.h | 8 +- modules/juce_analytics/juce_analytics.cpp | 8 +- modules/juce_analytics/juce_analytics.h | 10 +- .../audio_play_head/juce_AudioPlayHead.h | 321 +- .../buffers/juce_AudioChannelSet.cpp | 2 +- .../buffers/juce_AudioChannelSet.h | 10 +- .../buffers/juce_AudioDataConverters.cpp | 2 +- .../buffers/juce_AudioDataConverters.h | 2 +- .../buffers/juce_AudioProcessLoadMeasurer.cpp | 41 +- .../buffers/juce_AudioProcessLoadMeasurer.h | 11 +- .../buffers/juce_AudioSampleBuffer.h | 95 +- .../buffers/juce_FloatVectorOperations.cpp | 204 +- .../buffers/juce_FloatVectorOperations.h | 96 +- .../juce_audio_basics/juce_audio_basics.cpp | 4 +- modules/juce_audio_basics/juce_audio_basics.h | 6 +- .../juce_audio_basics/juce_audio_basics.mm | 2 +- .../midi/juce_MidiBuffer.cpp | 2 +- .../juce_audio_basics/midi/juce_MidiBuffer.h | 2 +- .../midi/juce_MidiDataConcatenator.h | 2 +- .../juce_audio_basics/midi/juce_MidiFile.cpp | 98 +- .../juce_audio_basics/midi/juce_MidiFile.h | 2 +- .../midi/juce_MidiKeyboardState.cpp | 2 +- .../midi/juce_MidiKeyboardState.h | 2 +- .../midi/juce_MidiMessage.cpp | 2 +- .../juce_audio_basics/midi/juce_MidiMessage.h | 2 +- .../midi/juce_MidiMessageSequence.cpp | 58 +- .../midi/juce_MidiMessageSequence.h | 2 +- .../juce_audio_basics/midi/juce_MidiRPN.cpp | 7 +- modules/juce_audio_basics/midi/juce_MidiRPN.h | 7 +- modules/juce_audio_basics/midi/ump/juce_UMP.h | 2 +- .../midi/ump/juce_UMPConversion.h | 2 +- .../midi/ump/juce_UMPConverters.h | 2 +- .../midi/ump/juce_UMPDispatcher.h | 2 +- .../midi/ump/juce_UMPFactory.h | 2 +- .../midi/ump/juce_UMPIterator.h | 2 +- .../ump/juce_UMPMidi1ToBytestreamTranslator.h | 2 +- .../juce_UMPMidi1ToMidi2DefaultTranslator.cpp | 2 +- .../juce_UMPMidi1ToMidi2DefaultTranslator.h | 2 +- .../midi/ump/juce_UMPProtocols.h | 2 +- .../midi/ump/juce_UMPReceiver.h | 2 +- .../midi/ump/juce_UMPSysEx7.cpp | 2 +- .../midi/ump/juce_UMPSysEx7.h | 2 +- .../midi/ump/juce_UMPUtils.cpp | 2 +- .../midi/ump/juce_UMPUtils.h | 2 +- .../midi/ump/juce_UMPView.cpp | 2 +- .../juce_audio_basics/midi/ump/juce_UMPView.h | 2 +- .../{juce_UMPTests.cpp => juce_UMP_test.cpp} | 2 +- .../midi/ump/juce_UMPacket.h | 2 +- .../midi/ump/juce_UMPackets.h | 2 +- .../mpe/juce_MPEInstrument.cpp | 2 +- .../mpe/juce_MPEInstrument.h | 2 +- .../mpe/juce_MPEMessages.cpp | 2 +- .../juce_audio_basics/mpe/juce_MPEMessages.h | 2 +- .../juce_audio_basics/mpe/juce_MPENote.cpp | 2 +- modules/juce_audio_basics/mpe/juce_MPENote.h | 2 +- .../mpe/juce_MPESynthesiser.cpp | 2 +- .../mpe/juce_MPESynthesiser.h | 2 +- .../mpe/juce_MPESynthesiserBase.cpp | 2 +- .../mpe/juce_MPESynthesiserBase.h | 2 +- .../mpe/juce_MPESynthesiserVoice.cpp | 2 +- .../mpe/juce_MPESynthesiserVoice.h | 2 +- .../juce_audio_basics/mpe/juce_MPEUtils.cpp | 2 +- modules/juce_audio_basics/mpe/juce_MPEUtils.h | 2 +- .../juce_audio_basics/mpe/juce_MPEValue.cpp | 2 +- modules/juce_audio_basics/mpe/juce_MPEValue.h | 2 +- .../mpe/juce_MPEZoneLayout.cpp | 2 +- .../mpe/juce_MPEZoneLayout.h | 3 +- .../native/juce_mac_CoreAudioLayouts.h | 2 +- .../juce_mac_CoreAudioTimeConversions.h | 80 + .../sources/juce_AudioSource.h | 2 +- .../sources/juce_BufferingAudioSource.cpp | 6 +- .../sources/juce_BufferingAudioSource.h | 2 +- .../juce_ChannelRemappingAudioSource.cpp | 2 +- .../juce_ChannelRemappingAudioSource.h | 2 +- .../sources/juce_IIRFilterAudioSource.cpp | 2 +- .../sources/juce_IIRFilterAudioSource.h | 2 +- .../sources/juce_MemoryAudioSource.cpp | 2 +- .../sources/juce_MemoryAudioSource.h | 2 +- .../sources/juce_MixerAudioSource.cpp | 2 +- .../sources/juce_MixerAudioSource.h | 2 +- .../sources/juce_PositionableAudioSource.h | 2 +- .../sources/juce_ResamplingAudioSource.cpp | 2 +- .../sources/juce_ResamplingAudioSource.h | 2 +- .../sources/juce_ReverbAudioSource.cpp | 2 +- .../sources/juce_ReverbAudioSource.h | 2 +- .../sources/juce_ToneGeneratorAudioSource.cpp | 2 +- .../sources/juce_ToneGeneratorAudioSource.h | 2 +- .../synthesisers/juce_Synthesiser.cpp | 2 +- .../synthesisers/juce_Synthesiser.h | 2 +- .../juce_audio_basics/utilities/juce_ADSR.h | 81 +- .../utilities/juce_ADSR_test.cpp | 2 +- .../utilities/juce_Decibels.h | 2 +- .../utilities/juce_GenericInterpolator.h | 15 +- .../utilities/juce_IIRFilter.cpp | 2 +- .../utilities/juce_IIRFilter.h | 2 +- .../utilities/juce_Interpolators.cpp | 15 +- .../utilities/juce_Interpolators.h | 15 +- .../utilities/juce_LagrangeInterpolator.cpp | 2 +- .../juce_audio_basics/utilities/juce_Reverb.h | 2 +- .../utilities/juce_SmoothedValue.cpp | 2 +- .../utilities/juce_SmoothedValue.h | 2 +- .../juce_WindowedSincInterpolator.cpp | 15 +- .../audio_io/juce_AudioDeviceManager.cpp | 35 +- .../audio_io/juce_AudioDeviceManager.h | 10 +- .../audio_io/juce_AudioIODevice.cpp | 2 +- .../audio_io/juce_AudioIODevice.h | 31 +- .../audio_io/juce_AudioIODeviceType.cpp | 2 +- .../audio_io/juce_AudioIODeviceType.h | 2 +- .../audio_io/juce_SampleRateHelpers.cpp | 48 + .../audio_io/juce_SystemAudioVolume.h | 2 +- .../juce_audio_devices/juce_audio_devices.cpp | 4 +- .../juce_audio_devices/juce_audio_devices.h | 4 +- .../juce_audio_devices/juce_audio_devices.mm | 2 +- .../midi_io/juce_MidiDevices.cpp | 2 +- .../midi_io/juce_MidiDevices.h | 2 +- .../midi_io/juce_MidiMessageCollector.cpp | 2 +- .../midi_io/juce_MidiMessageCollector.h | 2 +- .../ump/juce_UMPBytestreamInputHandler.h | 2 +- .../midi_io/ump/juce_UMPTests.cpp | 1022 -- .../midi_io/ump/juce_UMPU32InputHandler.h | 2 +- .../app/com/rmsl/juce/JuceMidiSupport.java | 2 +- .../native/juce_android_Audio.cpp | 10 +- ...juce_android_HighPerformanceAudioHelpers.h | 2 +- .../native/juce_android_Midi.cpp | 2 +- .../native/juce_android_Oboe.cpp | 11 +- .../native/juce_android_OpenSL.cpp | 5 +- .../native/juce_ios_Audio.cpp | 257 +- .../native/juce_ios_Audio.h | 2 +- .../native/juce_linux_ALSA.cpp | 27 +- .../native/juce_linux_Bela.cpp | 11 +- .../native/juce_linux_JackAudio.cpp | 10 +- .../native/juce_linux_Midi.cpp | 2 +- .../native/juce_mac_CoreAudio.cpp | 57 +- .../native/juce_mac_CoreMidi.mm | 14 +- .../native/juce_win32_ASIO.cpp | 20 +- .../native/juce_win32_DirectSound.cpp | 13 +- .../native/juce_win32_Midi.cpp | 2 +- .../native/juce_win32_WASAPI.cpp | 22 +- .../sources/juce_AudioSourcePlayer.cpp | 2 +- .../sources/juce_AudioSourcePlayer.h | 2 +- .../sources/juce_AudioTransportSource.cpp | 2 +- .../sources/juce_AudioTransportSource.h | 2 +- .../codecs/juce_AiffAudioFormat.cpp | 8 +- .../codecs/juce_AiffAudioFormat.h | 8 +- .../codecs/juce_CoreAudioFormat.cpp | 8 +- .../codecs/juce_CoreAudioFormat.h | 8 +- .../codecs/juce_FlacAudioFormat.cpp | 15 +- .../codecs/juce_FlacAudioFormat.h | 8 +- .../codecs/juce_LAMEEncoderAudioFormat.cpp | 8 +- .../codecs/juce_LAMEEncoderAudioFormat.h | 8 +- .../codecs/juce_MP3AudioFormat.cpp | 8 +- .../codecs/juce_MP3AudioFormat.h | 8 +- .../codecs/juce_OggVorbisAudioFormat.cpp | 11 +- .../codecs/juce_OggVorbisAudioFormat.h | 8 +- .../codecs/juce_WavAudioFormat.cpp | 310 +- .../codecs/juce_WavAudioFormat.h | 96 +- .../codecs/juce_WindowsMediaAudioFormat.cpp | 8 +- .../codecs/juce_WindowsMediaAudioFormat.h | 8 +- .../format/juce_ARAAudioReaders.cpp | 310 + .../format/juce_ARAAudioReaders.h | 194 + .../format/juce_AudioFormat.cpp | 8 +- .../format/juce_AudioFormat.h | 8 +- .../format/juce_AudioFormatManager.cpp | 8 +- .../format/juce_AudioFormatManager.h | 8 +- .../format/juce_AudioFormatReader.cpp | 104 +- .../format/juce_AudioFormatReader.h | 14 +- .../format/juce_AudioFormatReaderSource.cpp | 8 +- .../format/juce_AudioFormatReaderSource.h | 8 +- .../format/juce_AudioFormatWriter.cpp | 8 +- .../format/juce_AudioFormatWriter.h | 8 +- .../format/juce_AudioSubsectionReader.cpp | 8 +- .../format/juce_AudioSubsectionReader.h | 8 +- .../juce_BufferingAudioFormatReader.cpp | 19 +- .../format/juce_BufferingAudioFormatReader.h | 9 +- .../juce_MemoryMappedAudioFormatReader.h | 8 +- .../juce_audio_formats/juce_audio_formats.cpp | 13 +- .../juce_audio_formats/juce_audio_formats.h | 16 +- .../juce_audio_formats/juce_audio_formats.mm | 8 +- .../sampler/juce_Sampler.cpp | 8 +- .../juce_audio_formats/sampler/juce_Sampler.h | 8 +- .../AAX/juce_AAX_Modifier_Injector.h | 8 +- .../AAX/juce_AAX_Wrapper.cpp | 109 +- .../ARA/juce_ARA_Wrapper.cpp | 68 + .../ARA/juce_ARA_Wrapper.h | 55 + .../juce_audio_plugin_client/CMakeLists.txt | 29 + .../LV2/juce_LV2TurtleDumpProgram.cpp | 78 + .../LV2/juce_LV2_Client.cpp | 1778 +++ .../RTAS/juce_RTAS_DigiCode1.cpp | 73 - .../RTAS/juce_RTAS_DigiCode2.cpp | 61 - .../RTAS/juce_RTAS_DigiCode3.cpp | 74 - .../RTAS/juce_RTAS_DigiCode_Header.h | 68 - .../RTAS/juce_RTAS_MacUtilities.mm | 169 - .../RTAS/juce_RTAS_WinExports.def | 4 - .../RTAS/juce_RTAS_WinResources.rsr | Bin 3198 -> 0 bytes .../RTAS/juce_RTAS_WinUtilities.cpp | 157 - .../RTAS/juce_RTAS_Wrapper.cpp | 1061 -- .../Standalone/juce_StandaloneFilterApp.cpp | 13 +- .../Standalone/juce_StandaloneFilterWindow.h | 65 +- .../Unity/juce_UnityPluginInterface.h | 8 +- .../Unity/juce_Unity_Wrapper.cpp | 34 +- .../VST/juce_VST_Wrapper.cpp | 242 +- .../VST/juce_VST_Wrapper.mm | 15 +- .../VST3/juce_VST3_Wrapper.cpp | 757 +- .../juce_audio_plugin_client.h | 16 +- .../juce_audio_plugin_client_AAX.cpp | 8 +- .../juce_audio_plugin_client_AAX.mm | 8 +- ...3.cpp => juce_audio_plugin_client_ARA.cpp} | 10 +- .../juce_audio_plugin_client_AU.r | 28 +- .../juce_audio_plugin_client_AU_1.mm | 8 +- .../juce_audio_plugin_client_AU_2.mm | 12 +- .../juce_audio_plugin_client_AUv3.mm | 8 +- ...2.cpp => juce_audio_plugin_client_LV2.cpp} | 10 +- ..._4.cpp => juce_audio_plugin_client_LV2.mm} | 10 +- .../juce_audio_plugin_client_RTAS.r | 7 - .../juce_audio_plugin_client_RTAS_utils.cpp | 26 - .../juce_audio_plugin_client_RTAS_utils.mm | 26 - .../juce_audio_plugin_client_Standalone.cpp | 8 +- .../juce_audio_plugin_client_Unity.cpp | 8 +- .../juce_audio_plugin_client_VST2.cpp | 8 +- .../juce_audio_plugin_client_VST3.cpp | 8 +- .../juce_audio_plugin_client_VST_utils.mm | 8 +- .../juce_audio_plugin_client_utils.cpp | 8 +- .../utility/juce_CarbonVisibility.h | 80 - .../utility/juce_CheckSettingMacros.h | 25 +- .../utility/juce_CreatePluginFilter.h | 17 +- .../utility/juce_IncludeModuleHeaders.h | 8 +- .../utility/juce_IncludeSystemHeaders.h | 16 +- .../utility/juce_LinuxMessageThread.h | 37 +- .../utility/juce_PluginUtilities.cpp | 10 +- .../utility/juce_WindowsHooks.h | 8 +- .../format/juce_AudioPluginFormat.cpp | 8 +- .../format/juce_AudioPluginFormat.h | 20 +- .../format/juce_AudioPluginFormatManager.cpp | 78 +- .../format/juce_AudioPluginFormatManager.h | 24 +- .../format_types/LV2_SDK/README.md | 11 + .../LV2_SDK/generate_lv2_bundle_sources.py | 157 + .../format_types/LV2_SDK/juce_lv2_config.h | 78 + .../format_types/LV2_SDK/lilv/COPYING | 13 + .../format_types/LV2_SDK/lilv/lilv/lilv.h | 2117 ++++ .../format_types/LV2_SDK/lilv/lilv/lilvmm.hpp | 440 + .../LV2_SDK/lilv/src/collections.c | 240 + .../LV2_SDK/lilv/src/filesystem.c | 564 + .../LV2_SDK/lilv/src/filesystem.h | 182 + .../format_types/LV2_SDK/lilv/src/instance.c | 115 + .../format_types/LV2_SDK/lilv/src/lib.c | 127 + .../LV2_SDK/lilv/src/lilv_internal.h | 477 + .../format_types/LV2_SDK/lilv/src/node.c | 413 + .../format_types/LV2_SDK/lilv/src/plugin.c | 1140 ++ .../LV2_SDK/lilv/src/pluginclass.c | 91 + .../format_types/LV2_SDK/lilv/src/port.c | 272 + .../format_types/LV2_SDK/lilv/src/query.c | 144 + .../LV2_SDK/lilv/src/scalepoint.c | 53 + .../format_types/LV2_SDK/lilv/src/state.c | 1541 +++ .../format_types/LV2_SDK/lilv/src/ui.c | 115 + .../format_types/LV2_SDK/lilv/src/util.c | 291 + .../format_types/LV2_SDK/lilv/src/world.c | 1249 ++ .../LV2_SDK/lilv/src/zix/common.h | 138 + .../format_types/LV2_SDK/lilv/src/zix/tree.c | 727 ++ .../format_types/LV2_SDK/lilv/src/zix/tree.h | 164 + .../format_types/LV2_SDK/lilv_config.h | 33 + .../format_types/LV2_SDK/lv2/COPYING | 16 + .../LV2_SDK/lv2/lv2/atom/atom-test-utils.c | 73 + .../LV2_SDK/lv2/lv2/atom/atom-test.c | 367 + .../format_types/LV2_SDK/lv2/lv2/atom/atom.h | 260 + .../LV2_SDK/lv2/lv2/atom/atom.meta.ttl | 542 + .../LV2_SDK/lv2/lv2/atom/atom.ttl | 247 + .../lv2/lv2/atom/forge-overflow-test.c | 235 + .../format_types/LV2_SDK/lv2/lv2/atom/forge.h | 683 ++ .../LV2_SDK/lv2/lv2/atom/manifest.ttl | 9 + .../format_types/LV2_SDK/lv2/lv2/atom/util.h | 523 + .../LV2_SDK/lv2/lv2/buf-size/buf-size.h | 51 + .../lv2/lv2/buf-size/buf-size.meta.ttl | 157 + .../LV2_SDK/lv2/lv2/buf-size/buf-size.ttl | 67 + .../LV2_SDK/lv2/lv2/buf-size/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/core/attributes.h | 59 + .../format_types/LV2_SDK/lv2/lv2/core/lv2.h | 484 + .../LV2_SDK/lv2/lv2/core/lv2_util.h | 103 + .../LV2_SDK/lv2/lv2/core/lv2core.meta.ttl | 905 ++ .../LV2_SDK/lv2/lv2/core/lv2core.ttl | 674 + .../LV2_SDK/lv2/lv2/core/manifest.ttl | 15 + .../LV2_SDK/lv2/lv2/core/meta.ttl | 199 + .../LV2_SDK/lv2/lv2/core/people.ttl | 51 + .../LV2_SDK/lv2/lv2/data-access/data-access.h | 73 + .../lv2/lv2/data-access/data-access.meta.ttl | 77 + .../lv2/lv2/data-access/data-access.ttl | 11 + .../LV2_SDK/lv2/lv2/data-access/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h | 160 + .../lv2/lv2/dynmanifest/dynmanifest.meta.ttl | 131 + .../lv2/lv2/dynmanifest/dynmanifest.ttl | 25 + .../LV2_SDK/lv2/lv2/dynmanifest/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/event/event-helpers.h | 255 + .../LV2_SDK/lv2/lv2/event/event.h | 306 + .../LV2_SDK/lv2/lv2/event/event.meta.ttl | 246 + .../LV2_SDK/lv2/lv2/event/event.ttl | 86 + .../LV2_SDK/lv2/lv2/event/manifest.ttl | 9 + .../lv2/lv2/instance-access/instance-access.h | 41 + .../instance-access/instance-access.meta.ttl | 75 + .../lv2/instance-access/instance-access.ttl | 11 + .../lv2/lv2/instance-access/manifest.ttl | 9 + .../format_types/LV2_SDK/lv2/lv2/log/log.h | 113 + .../LV2_SDK/lv2/lv2/log/log.meta.ttl | 126 + .../format_types/LV2_SDK/lv2/lv2/log/log.ttl | 48 + .../format_types/LV2_SDK/lv2/lv2/log/logger.h | 157 + .../LV2_SDK/lv2/lv2/log/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/midi/manifest.ttl | 9 + .../format_types/LV2_SDK/lv2/lv2/midi/midi.h | 248 + .../LV2_SDK/lv2/lv2/midi/midi.meta.ttl | 153 + .../LV2_SDK/lv2/lv2/midi/midi.ttl | 366 + .../LV2_SDK/lv2/lv2/morph/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/morph/morph.h | 48 + .../LV2_SDK/lv2/lv2/morph/morph.meta.ttl | 90 + .../LV2_SDK/lv2/lv2/morph/morph.ttl | 46 + .../LV2_SDK/lv2/lv2/options/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/options/options.h | 149 + .../LV2_SDK/lv2/lv2/options/options.meta.ttl | 129 + .../LV2_SDK/lv2/lv2/options/options.ttl | 44 + .../LV2_SDK/lv2/lv2/parameters/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/parameters/parameters.h | 68 + .../lv2/lv2/parameters/parameters.meta.ttl | 75 + .../LV2_SDK/lv2/lv2/parameters/parameters.ttl | 202 + .../LV2_SDK/lv2/lv2/patch/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/patch/patch.h | 73 + .../LV2_SDK/lv2/lv2/patch/patch.meta.ttl | 374 + .../LV2_SDK/lv2/lv2/patch/patch.ttl | 251 + .../LV2_SDK/lv2/lv2/port-groups/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/port-groups/port-groups.h | 77 + .../lv2/lv2/port-groups/port-groups.meta.ttl | 144 + .../lv2/lv2/port-groups/port-groups.ttl | 807 ++ .../LV2_SDK/lv2/lv2/port-props/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/port-props/port-props.h | 53 + .../lv2/lv2/port-props/port-props.meta.ttl | 202 + .../LV2_SDK/lv2/lv2/port-props/port-props.ttl | 79 + .../LV2_SDK/lv2/lv2/presets/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/presets/presets.h | 48 + .../LV2_SDK/lv2/lv2/presets/presets.meta.ttl | 132 + .../LV2_SDK/lv2/lv2/presets/presets.ttl | 60 + .../LV2_SDK/lv2/lv2/resize-port/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/resize-port/resize-port.h | 89 + .../lv2/lv2/resize-port/resize-port.meta.ttl | 74 + .../lv2/lv2/resize-port/resize-port.ttl | 36 + .../LV2_SDK/lv2/lv2/state/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/state/state.h | 392 + .../LV2_SDK/lv2/lv2/state/state.meta.ttl | 467 + .../LV2_SDK/lv2/lv2/state/state.ttl | 60 + .../LV2_SDK/lv2/lv2/time/manifest.ttl | 9 + .../format_types/LV2_SDK/lv2/lv2/time/time.h | 59 + .../LV2_SDK/lv2/lv2/time/time.meta.ttl | 112 + .../LV2_SDK/lv2/lv2/time/time.ttl | 122 + .../LV2_SDK/lv2/lv2/ui/manifest.ttl | 9 + .../format_types/LV2_SDK/lv2/lv2/ui/ui.h | 543 + .../LV2_SDK/lv2/lv2/ui/ui.meta.ttl | 627 + .../format_types/LV2_SDK/lv2/lv2/ui/ui.ttl | 248 + .../LV2_SDK/lv2/lv2/units/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/units/units.h | 75 + .../LV2_SDK/lv2/lv2/units/units.meta.ttl | 154 + .../LV2_SDK/lv2/lv2/units/units.ttl | 379 + .../LV2_SDK/lv2/lv2/uri-map/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/uri-map/uri-map.h | 121 + .../LV2_SDK/lv2/lv2/uri-map/uri-map.meta.ttl | 72 + .../LV2_SDK/lv2/lv2/uri-map/uri-map.ttl | 14 + .../LV2_SDK/lv2/lv2/urid/manifest.ttl | 9 + .../format_types/LV2_SDK/lv2/lv2/urid/urid.h | 140 + .../LV2_SDK/lv2/lv2/urid/urid.meta.ttl | 84 + .../LV2_SDK/lv2/lv2/urid/urid.ttl | 22 + .../LV2_SDK/lv2/lv2/worker/manifest.ttl | 9 + .../LV2_SDK/lv2/lv2/worker/worker.h | 183 + .../LV2_SDK/lv2/lv2/worker/worker.meta.ttl | 82 + .../LV2_SDK/lv2/lv2/worker/worker.ttl | 25 + .../format_types/LV2_SDK/serd/COPYING | 13 + .../format_types/LV2_SDK/serd/serd/serd.h | 1059 ++ .../format_types/LV2_SDK/serd/src/.clang-tidy | 18 + .../LV2_SDK/serd/src/attributes.h | 26 + .../format_types/LV2_SDK/serd/src/base64.c | 132 + .../format_types/LV2_SDK/serd/src/base64.h | 48 + .../format_types/LV2_SDK/serd/src/byte_sink.h | 98 + .../LV2_SDK/serd/src/byte_source.c | 112 + .../LV2_SDK/serd/src/byte_source.h | 120 + .../format_types/LV2_SDK/serd/src/env.c | 256 + .../format_types/LV2_SDK/serd/src/n3.c | 1720 +++ .../format_types/LV2_SDK/serd/src/node.c | 393 + .../format_types/LV2_SDK/serd/src/node.h | 48 + .../format_types/LV2_SDK/serd/src/reader.c | 425 + .../format_types/LV2_SDK/serd/src/reader.h | 196 + .../LV2_SDK/serd/src/serd_config.h | 98 + .../LV2_SDK/serd/src/serd_internal.h | 46 + .../format_types/LV2_SDK/serd/src/serdi.c | 377 + .../format_types/LV2_SDK/serd/src/stack.h | 119 + .../format_types/LV2_SDK/serd/src/string.c | 179 + .../LV2_SDK/serd/src/string_utils.h | 173 + .../format_types/LV2_SDK/serd/src/system.c | 82 + .../format_types/LV2_SDK/serd/src/system.h | 40 + .../format_types/LV2_SDK/serd/src/uri.c | 506 + .../format_types/LV2_SDK/serd/src/uri_utils.h | 110 + .../format_types/LV2_SDK/serd/src/writer.c | 1114 ++ .../format_types/LV2_SDK/serd_config.h | 33 + .../format_types/LV2_SDK/sord/COPYING | 13 + .../format_types/LV2_SDK/sord/sord/sord.h | 642 + .../format_types/LV2_SDK/sord/sord/sordmm.hpp | 720 ++ .../format_types/LV2_SDK/sord/src/sord.c | 1368 +++ .../LV2_SDK/sord/src/sord_config.h | 61 + .../LV2_SDK/sord/src/sord_internal.h | 53 + .../format_types/LV2_SDK/sord/src/sord_test.c | 767 ++ .../LV2_SDK/sord/src/sord_validate.c | 804 ++ .../format_types/LV2_SDK/sord/src/sordi.c | 216 + .../LV2_SDK/sord/src/sordmm_test.cpp | 25 + .../format_types/LV2_SDK/sord/src/syntax.c | 203 + .../format_types/LV2_SDK/sord/src/zix/btree.c | 936 ++ .../format_types/LV2_SDK/sord/src/zix/btree.h | 187 + .../LV2_SDK/sord/src/zix/common.h | 138 + .../LV2_SDK/sord/src/zix/digest.c | 141 + .../LV2_SDK/sord/src/zix/digest.h | 67 + .../format_types/LV2_SDK/sord/src/zix/hash.c | 230 + .../format_types/LV2_SDK/sord/src/zix/hash.h | 138 + .../format_types/LV2_SDK/sord_config.h | 33 + .../format_types/LV2_SDK/sratom/COPYING | 13 + .../LV2_SDK/sratom/sratom/sratom.h | 220 + .../format_types/LV2_SDK/sratom/src/sratom.c | 919 ++ .../format_types/juce_ARACommon.cpp | 76 + .../format_types/juce_ARACommon.h | 85 + .../format_types/juce_ARAHosting.cpp | 458 + .../format_types/juce_ARAHosting.h | 771 ++ .../format_types/juce_AU_Shared.h | 25 +- .../format_types/juce_AudioUnitPluginFormat.h | 9 +- .../juce_AudioUnitPluginFormat.mm | 685 +- .../format_types/juce_LADSPAPluginFormat.cpp | 8 +- .../format_types/juce_LADSPAPluginFormat.h | 8 +- .../format_types/juce_LV2Common.h | 621 + .../format_types/juce_LV2PluginFormat.cpp | 5614 +++++++++ .../format_types/juce_LV2PluginFormat.h | 78 + .../juce_LV2PluginFormat_test.cpp | 272 + .../format_types/juce_LV2Resources.h | 10235 ++++++++++++++++ .../format_types/juce_LV2SupportLibs.cpp | 100 + .../juce_LegacyAudioParameter.cpp | 8 +- .../format_types/juce_VST3Common.h | 1115 +- .../format_types/juce_VST3Headers.h | 26 +- .../format_types/juce_VST3PluginFormat.cpp | 569 +- .../format_types/juce_VST3PluginFormat.h | 9 +- .../juce_VST3PluginFormat_test.cpp | 658 + .../format_types/juce_VSTCommon.h | 37 +- .../format_types/juce_VSTMidiEventList.h | 8 +- .../format_types/juce_VSTPluginFormat.cpp | 551 +- .../format_types/juce_VSTPluginFormat.h | 8 +- .../pslextensions/ipslcontextinfo.h | 190 + .../pslextensions/ipsleditcontroller.h | 108 + .../pslextensions/ipslgainreduction.h | 53 + .../pslextensions/ipslhostcommands.h | 121 + .../pslextensions/ipslviewembedding.h | 53 + .../pslextensions/ipslviewscaling.h | 67 + .../pslextensions/pslauextensions.h | 57 + .../pslextensions/pslvst2extensions.h | 111 + .../juce_audio_processors.cpp | 67 +- .../juce_audio_processors.h | 53 +- .../juce_audio_processors.mm | 8 +- .../juce_audio_processors_ara.cpp | 40 + .../juce_audio_processors_lv2_libs.cpp | 35 + .../processors/juce_AudioPluginInstance.cpp | 19 +- .../processors/juce_AudioPluginInstance.h | 11 +- .../processors/juce_AudioProcessor.cpp | 29 +- .../processors/juce_AudioProcessor.h | 49 +- .../processors/juce_AudioProcessorEditor.cpp | 12 +- .../processors/juce_AudioProcessorEditor.h | 8 +- .../juce_AudioProcessorEditorHostContext.h | 8 +- .../processors/juce_AudioProcessorGraph.cpp | 25 +- .../processors/juce_AudioProcessorGraph.h | 23 +- .../processors/juce_AudioProcessorListener.h | 8 +- .../processors/juce_AudioProcessorParameter.h | 66 +- .../juce_AudioProcessorParameterGroup.cpp | 8 +- .../juce_AudioProcessorParameterGroup.h | 8 +- .../juce_GenericAudioProcessorEditor.cpp | 8 +- .../juce_GenericAudioProcessorEditor.h | 8 +- .../juce_HostedAudioProcessorParameter.h | 10 +- .../processors/juce_PluginDescription.cpp | 10 +- .../processors/juce_PluginDescription.h | 11 +- .../scanning/juce_KnownPluginList.cpp | 8 +- .../scanning/juce_KnownPluginList.h | 8 +- .../scanning/juce_PluginDirectoryScanner.cpp | 8 +- .../scanning/juce_PluginDirectoryScanner.h | 8 +- .../scanning/juce_PluginListComponent.cpp | 8 +- .../scanning/juce_PluginListComponent.h | 8 +- .../ARA/juce_ARADocumentController.cpp | 971 ++ .../ARA/juce_ARADocumentController.h | 520 + .../ARA/juce_ARADocumentControllerCommon.cpp | 71 + .../utilities/ARA/juce_ARAModelObjects.cpp | 199 + .../utilities/ARA/juce_ARAModelObjects.h | 1145 ++ .../ARA/juce_ARAPlugInInstanceRoles.cpp | 92 + .../ARA/juce_ARAPlugInInstanceRoles.h | 271 + .../utilities/ARA/juce_ARA_utils.cpp | 32 + .../utilities/ARA/juce_ARA_utils.h | 85 + .../ARA/juce_AudioProcessor_ARAExtensions.cpp | 154 + .../ARA/juce_AudioProcessor_ARAExtensions.h | 204 + .../utilities/juce_AudioParameterBool.cpp | 78 +- .../utilities/juce_AudioParameterBool.h | 56 +- .../utilities/juce_AudioParameterChoice.cpp | 34 +- .../utilities/juce_AudioParameterChoice.h | 57 +- .../utilities/juce_AudioParameterFloat.cpp | 32 +- .../utilities/juce_AudioParameterFloat.h | 62 +- .../utilities/juce_AudioParameterInt.cpp | 52 +- .../utilities/juce_AudioParameterInt.h | 64 +- .../juce_AudioProcessorParameterWithID.cpp | 25 +- .../juce_AudioProcessorParameterWithID.h | 137 +- .../juce_AudioProcessorValueTreeState.cpp | 165 +- .../juce_AudioProcessorValueTreeState.h | 115 +- .../utilities/juce_ExtensionsVisitor.h | 28 +- .../utilities/juce_FlagCache.h | 182 + .../juce_NativeScaleFactorNotifier.cpp | 66 + .../juce_NativeScaleFactorNotifier.h | 67 + .../utilities/juce_ParameterAttachments.cpp | 8 +- .../utilities/juce_ParameterAttachments.h | 8 +- .../utilities/juce_PluginHostType.cpp | 8 +- .../utilities/juce_PluginHostType.h | 8 +- .../utilities/juce_RangedAudioParameter.cpp | 16 +- .../utilities/juce_RangedAudioParameter.h | 77 +- .../utilities/juce_VST3ClientExtensions.h | 8 +- .../utilities/juce_VSTCallbackHandler.h | 8 +- .../audio_cd/juce_AudioCDBurner.h | 8 +- .../audio_cd/juce_AudioCDReader.cpp | 8 +- .../audio_cd/juce_AudioCDReader.h | 8 +- .../gui/juce_AudioAppComponent.cpp | 8 +- .../gui/juce_AudioAppComponent.h | 8 +- .../gui/juce_AudioDeviceSelectorComponent.cpp | 19 +- .../gui/juce_AudioDeviceSelectorComponent.h | 12 +- .../gui/juce_AudioThumbnail.cpp | 8 +- .../gui/juce_AudioThumbnail.h | 8 +- .../gui/juce_AudioThumbnailBase.h | 8 +- .../gui/juce_AudioThumbnailCache.cpp | 8 +- .../gui/juce_AudioThumbnailCache.h | 8 +- .../gui/juce_AudioVisualiserComponent.cpp | 8 +- .../gui/juce_AudioVisualiserComponent.h | 8 +- .../juce_BluetoothMidiDevicePairingDialogue.h | 8 +- .../gui/juce_KeyboardComponentBase.cpp | 8 +- .../gui/juce_KeyboardComponentBase.h | 8 +- .../gui/juce_MPEKeyboardComponent.cpp | 8 +- .../gui/juce_MPEKeyboardComponent.h | 8 +- .../gui/juce_MidiKeyboardComponent.cpp | 8 +- .../gui/juce_MidiKeyboardComponent.h | 8 +- modules/juce_audio_utils/juce_audio_utils.cpp | 8 +- modules/juce_audio_utils/juce_audio_utils.h | 10 +- modules/juce_audio_utils/juce_audio_utils.mm | 8 +- ...oid_BluetoothMidiDevicePairingDialogue.cpp | 8 +- ..._ios_BluetoothMidiDevicePairingDialogue.mm | 8 +- .../native/juce_linux_AudioCDReader.cpp | 8 +- ...nux_BluetoothMidiDevicePairingDialogue.cpp | 8 +- .../native/juce_mac_AudioCDBurner.mm | 8 +- .../native/juce_mac_AudioCDReader.mm | 8 +- ..._mac_BluetoothMidiDevicePairingDialogue.mm | 12 +- .../native/juce_win32_AudioCDBurner.cpp | 8 +- .../native/juce_win32_AudioCDReader.cpp | 8 +- ...win_BluetoothMidiDevicePairingDialogue.cpp | 8 +- .../players/juce_AudioProcessorPlayer.cpp | 64 +- .../players/juce_AudioProcessorPlayer.h | 11 +- .../players/juce_SoundPlayer.cpp | 8 +- .../players/juce_SoundPlayer.h | 8 +- modules/juce_box2d/juce_box2d.cpp | 11 +- modules/juce_box2d/juce_box2d.h | 13 +- .../juce_box2d/utils/juce_Box2DRenderer.cpp | 8 +- modules/juce_box2d/utils/juce_Box2DRenderer.h | 8 +- .../containers/juce_AbstractFifo.cpp | 2 +- .../juce_core/containers/juce_AbstractFifo.h | 2 +- modules/juce_core/containers/juce_Array.h | 9 +- .../containers/juce_ArrayAllocationBase.h | 2 +- .../juce_core/containers/juce_ArrayBase.cpp | 2 +- modules/juce_core/containers/juce_ArrayBase.h | 2 +- .../containers/juce_DynamicObject.cpp | 2 +- .../juce_core/containers/juce_DynamicObject.h | 2 +- .../containers/juce_ElementComparator.h | 4 +- modules/juce_core/containers/juce_HashMap.h | 2 +- .../containers/juce_HashMap_test.cpp | 2 +- .../containers/juce_LinkedListPointer.h | 2 +- .../containers/juce_ListenerList.cpp | 321 + .../juce_core/containers/juce_ListenerList.h | 105 +- .../containers/juce_NamedValueSet.cpp | 2 +- .../juce_core/containers/juce_NamedValueSet.h | 2 +- modules/juce_core/containers/juce_Optional.h | 401 + .../containers/juce_Optional_test.cpp | 627 + .../juce_core/containers/juce_OwnedArray.cpp | 2 +- .../juce_core/containers/juce_OwnedArray.h | 2 +- .../juce_core/containers/juce_PropertySet.cpp | 2 +- .../juce_core/containers/juce_PropertySet.h | 2 +- .../containers/juce_ReferenceCountedArray.cpp | 2 +- .../containers/juce_ReferenceCountedArray.h | 2 +- .../containers/juce_ScopedValueSetter.h | 2 +- .../juce_SingleThreadedAbstractFifo.h | 2 +- modules/juce_core/containers/juce_SortedSet.h | 2 +- .../juce_core/containers/juce_SparseSet.cpp | 2 +- modules/juce_core/containers/juce_SparseSet.h | 2 +- modules/juce_core/containers/juce_Variant.cpp | 2 +- modules/juce_core/containers/juce_Variant.h | 2 +- .../juce_core/files/juce_AndroidDocument.h | 476 + .../files/juce_DirectoryIterator.cpp | 2 +- .../juce_core/files/juce_DirectoryIterator.h | 2 +- modules/juce_core/files/juce_File.cpp | 9 +- modules/juce_core/files/juce_File.h | 26 +- modules/juce_core/files/juce_FileFilter.cpp | 2 +- modules/juce_core/files/juce_FileFilter.h | 2 +- .../juce_core/files/juce_FileInputStream.cpp | 2 +- .../juce_core/files/juce_FileInputStream.h | 2 +- .../juce_core/files/juce_FileOutputStream.cpp | 2 +- .../juce_core/files/juce_FileOutputStream.h | 2 +- .../juce_core/files/juce_FileSearchPath.cpp | 2 +- modules/juce_core/files/juce_FileSearchPath.h | 2 +- .../juce_core/files/juce_MemoryMappedFile.h | 2 +- .../files/juce_RangedDirectoryIterator.cpp | 2 +- .../files/juce_RangedDirectoryIterator.h | 2 +- .../juce_core/files/juce_TemporaryFile.cpp | 2 +- modules/juce_core/files/juce_TemporaryFile.h | 2 +- .../files/juce_WildcardFileFilter.cpp | 2 +- .../juce_core/files/juce_WildcardFileFilter.h | 2 +- .../files}/juce_common_MimeTypes.cpp | 31 +- .../files/juce_common_MimeTypes.h} | 18 +- modules/juce_core/javascript/juce_JSON.cpp | 2 +- modules/juce_core/javascript/juce_JSON.h | 2 +- .../juce_core/javascript/juce_Javascript.cpp | 2 +- .../juce_core/javascript/juce_Javascript.h | 2 +- modules/juce_core/juce_core.cpp | 8 +- modules/juce_core/juce_core.h | 6 +- modules/juce_core/juce_core.mm | 2 +- modules/juce_core/logging/juce_FileLogger.cpp | 2 +- modules/juce_core/logging/juce_FileLogger.h | 2 +- modules/juce_core/logging/juce_Logger.cpp | 2 +- modules/juce_core/logging/juce_Logger.h | 2 +- modules/juce_core/maths/juce_BigInteger.cpp | 2 +- modules/juce_core/maths/juce_BigInteger.h | 2 +- modules/juce_core/maths/juce_Expression.cpp | 2 +- modules/juce_core/maths/juce_Expression.h | 2 +- modules/juce_core/maths/juce_MathsFunctions.h | 2 +- .../juce_core/maths/juce_NormalisableRange.h | 2 +- modules/juce_core/maths/juce_Random.cpp | 2 +- modules/juce_core/maths/juce_Random.h | 2 +- modules/juce_core/maths/juce_Range.h | 2 +- .../maths/juce_StatisticsAccumulator.h | 2 +- .../juce_core/memory/juce_AllocationHooks.cpp | 2 +- .../juce_core/memory/juce_AllocationHooks.h | 2 +- modules/juce_core/memory/juce_Atomic.h | 2 +- modules/juce_core/memory/juce_ByteOrder.h | 2 +- .../memory/juce_ContainerDeletePolicy.h | 2 +- modules/juce_core/memory/juce_HeapBlock.h | 2 +- .../juce_HeavyweightLeakedObjectDetector.h | 2 +- .../memory/juce_LeakedObjectDetector.h | 2 +- modules/juce_core/memory/juce_Memory.h | 2 +- modules/juce_core/memory/juce_MemoryBlock.cpp | 2 +- modules/juce_core/memory/juce_MemoryBlock.h | 2 +- .../memory/juce_OptionalScopedPointer.h | 2 +- .../memory/juce_ReferenceCountedObject.h | 2 +- modules/juce_core/memory/juce_Reservoir.h | 15 +- modules/juce_core/memory/juce_ScopedPointer.h | 2 +- .../memory/juce_SharedResourcePointer.h | 2 +- modules/juce_core/memory/juce_Singleton.h | 4 +- modules/juce_core/memory/juce_WeakReference.h | 2 +- .../misc/juce_ConsoleApplication.cpp | 2 +- .../juce_core/misc/juce_ConsoleApplication.h | 2 +- modules/juce_core/misc/juce_Functional.h | 29 +- modules/juce_core/misc/juce_Result.cpp | 2 +- modules/juce_core/misc/juce_Result.h | 2 +- .../misc/juce_RuntimePermissions.cpp | 2 +- .../juce_core/misc/juce_RuntimePermissions.h | 2 +- modules/juce_core/misc/juce_Uuid.cpp | 2 +- modules/juce_core/misc/juce_Uuid.h | 2 +- modules/juce_core/misc/juce_WindowsRegistry.h | 2 +- .../app/com/rmsl/juce/FragmentOverlay.java | 2 +- .../app/com/rmsl/juce/JuceHTTPStream.java | 2 +- .../com/rmsl/juce/JuceInvocationHandler.java | 2 +- .../javacore/app/com/rmsl/juce/JuceApp.java | 2 +- .../javacore/init/com/rmsl/juce/Java.java | 2 +- .../native/juce_BasicNativeHeaders.h | 4 +- .../native/juce_android_AndroidDocument.cpp | 1085 ++ .../juce_core/native/juce_android_Files.cpp | 200 +- .../native/juce_android_JNIHelpers.cpp | 75 +- .../native/juce_android_JNIHelpers.h | 89 +- .../juce_core/native/juce_android_Misc.cpp | 2 +- .../juce_core/native/juce_android_Network.cpp | 34 +- .../juce_android_RuntimePermissions.cpp | 2 +- .../native/juce_android_SystemStats.cpp | 2 +- .../juce_core/native/juce_android_Threads.cpp | 4 +- .../juce_core/native/juce_curl_Network.cpp | 2 +- .../juce_core/native/juce_intel_SharedCode.h | 2 +- .../native/juce_linux_CommonFile.cpp | 2 +- modules/juce_core/native/juce_linux_Files.cpp | 2 +- .../juce_core/native/juce_linux_Network.cpp | 2 +- .../native/juce_linux_SystemStats.cpp | 2 +- .../juce_core/native/juce_linux_Threads.cpp | 2 +- modules/juce_core/native/juce_mac_CFHelpers.h | 2 +- modules/juce_core/native/juce_mac_Files.mm | 7 +- modules/juce_core/native/juce_mac_Network.mm | 4 +- .../juce_core/native/juce_mac_ObjCHelpers.h | 9 +- modules/juce_core/native/juce_mac_Strings.mm | 2 +- .../juce_core/native/juce_mac_SystemStats.mm | 2 +- modules/juce_core/native/juce_mac_Threads.mm | 2 +- .../juce_core/native/juce_posix_IPAddress.h | 2 +- .../juce_core/native/juce_posix_NamedPipe.cpp | 23 +- .../juce_core/native/juce_posix_SharedCode.h | 8 +- .../native/juce_wasm_SystemStats.cpp | 2 +- .../juce_core/native/juce_win32_ComSmartPtr.h | 2 +- modules/juce_core/native/juce_win32_Files.cpp | 127 +- .../juce_core/native/juce_win32_Network.cpp | 2 +- .../juce_core/native/juce_win32_Registry.cpp | 2 +- .../native/juce_win32_SystemStats.cpp | 3 +- .../juce_core/native/juce_win32_Threads.cpp | 4 +- modules/juce_core/network/juce_IPAddress.cpp | 2 +- modules/juce_core/network/juce_IPAddress.h | 2 +- modules/juce_core/network/juce_MACAddress.cpp | 2 +- modules/juce_core/network/juce_MACAddress.h | 2 +- modules/juce_core/network/juce_NamedPipe.cpp | 2 +- modules/juce_core/network/juce_NamedPipe.h | 2 +- modules/juce_core/network/juce_Socket.cpp | 2 +- modules/juce_core/network/juce_Socket.h | 2 +- modules/juce_core/network/juce_URL.cpp | 15 +- modules/juce_core/network/juce_URL.h | 5 +- .../juce_core/network/juce_WebInputStream.cpp | 2 +- .../juce_core/network/juce_WebInputStream.h | 2 +- .../streams/juce_BufferedInputStream.cpp | 2 +- .../streams/juce_BufferedInputStream.h | 2 +- .../streams/juce_FileInputSource.cpp | 2 +- .../juce_core/streams/juce_FileInputSource.h | 2 +- modules/juce_core/streams/juce_InputSource.h | 2 +- .../juce_core/streams/juce_InputStream.cpp | 2 +- modules/juce_core/streams/juce_InputStream.h | 2 +- .../streams/juce_MemoryInputStream.cpp | 2 +- .../streams/juce_MemoryInputStream.h | 2 +- .../streams/juce_MemoryOutputStream.cpp | 2 +- .../streams/juce_MemoryOutputStream.h | 2 +- .../juce_core/streams/juce_OutputStream.cpp | 2 +- modules/juce_core/streams/juce_OutputStream.h | 2 +- .../streams/juce_SubregionStream.cpp | 2 +- .../juce_core/streams/juce_SubregionStream.h | 2 +- .../juce_core/streams/juce_URLInputSource.cpp | 2 +- .../juce_core/streams/juce_URLInputSource.h | 2 +- .../juce_core/system/juce_CompilerSupport.h | 6 +- .../juce_core/system/juce_CompilerWarnings.h | 2 +- modules/juce_core/system/juce_PlatformDefs.h | 2 +- .../juce_core/system/juce_StandardHeader.h | 14 +- modules/juce_core/system/juce_SystemStats.cpp | 2 +- modules/juce_core/system/juce_SystemStats.h | 2 +- .../juce_core/system/juce_TargetPlatform.h | 6 +- modules/juce_core/text/juce_Base64.cpp | 2 +- modules/juce_core/text/juce_Base64.h | 2 +- .../juce_core/text/juce_CharPointer_ASCII.h | 2 +- .../juce_core/text/juce_CharPointer_UTF16.h | 2 +- .../juce_core/text/juce_CharPointer_UTF32.h | 2 +- .../juce_core/text/juce_CharPointer_UTF8.h | 2 +- .../text/juce_CharacterFunctions.cpp | 2 +- .../juce_core/text/juce_CharacterFunctions.h | 2 +- modules/juce_core/text/juce_Identifier.cpp | 2 +- modules/juce_core/text/juce_Identifier.h | 2 +- .../juce_core/text/juce_LocalisedStrings.cpp | 2 +- .../juce_core/text/juce_LocalisedStrings.h | 2 +- modules/juce_core/text/juce_NewLine.h | 2 +- modules/juce_core/text/juce_String.cpp | 123 +- modules/juce_core/text/juce_String.h | 2 +- modules/juce_core/text/juce_StringArray.cpp | 2 +- modules/juce_core/text/juce_StringArray.h | 2 +- .../juce_core/text/juce_StringPairArray.cpp | 2 +- modules/juce_core/text/juce_StringPairArray.h | 2 +- modules/juce_core/text/juce_StringPool.cpp | 2 +- modules/juce_core/text/juce_StringPool.h | 2 +- modules/juce_core/text/juce_StringRef.h | 2 +- modules/juce_core/text/juce_TextDiff.cpp | 2 +- modules/juce_core/text/juce_TextDiff.h | 2 +- .../juce_core/threads/juce_ChildProcess.cpp | 2 +- modules/juce_core/threads/juce_ChildProcess.h | 2 +- .../juce_core/threads/juce_CriticalSection.h | 2 +- .../juce_core/threads/juce_DynamicLibrary.h | 2 +- .../threads/juce_HighResolutionTimer.cpp | 2 +- .../threads/juce_HighResolutionTimer.h | 2 +- .../juce_core/threads/juce_InterProcessLock.h | 2 +- modules/juce_core/threads/juce_Process.h | 2 +- .../juce_core/threads/juce_ReadWriteLock.cpp | 2 +- .../juce_core/threads/juce_ReadWriteLock.h | 6 +- modules/juce_core/threads/juce_ScopedLock.h | 2 +- .../juce_core/threads/juce_ScopedReadLock.h | 88 +- .../juce_core/threads/juce_ScopedWriteLock.h | 88 +- modules/juce_core/threads/juce_SpinLock.h | 2 +- modules/juce_core/threads/juce_Thread.cpp | 2 +- modules/juce_core/threads/juce_Thread.h | 2 +- .../juce_core/threads/juce_ThreadLocalValue.h | 2 +- modules/juce_core/threads/juce_ThreadPool.cpp | 2 +- modules/juce_core/threads/juce_ThreadPool.h | 2 +- .../threads/juce_TimeSliceThread.cpp | 2 +- .../juce_core/threads/juce_TimeSliceThread.h | 2 +- .../juce_core/threads/juce_WaitableEvent.cpp | 2 +- .../juce_core/threads/juce_WaitableEvent.h | 2 +- .../time/juce_PerformanceCounter.cpp | 2 +- .../juce_core/time/juce_PerformanceCounter.h | 2 +- modules/juce_core/time/juce_RelativeTime.cpp | 2 +- modules/juce_core/time/juce_RelativeTime.h | 2 +- modules/juce_core/time/juce_Time.cpp | 2 +- modules/juce_core/time/juce_Time.h | 2 +- .../juce_core/unit_tests/juce_UnitTest.cpp | 2 +- modules/juce_core/unit_tests/juce_UnitTest.h | 2 +- .../unit_tests/juce_UnitTestCategories.h | 3 +- modules/juce_core/xml/juce_XmlDocument.cpp | 2 +- modules/juce_core/xml/juce_XmlDocument.h | 2 +- modules/juce_core/xml/juce_XmlElement.cpp | 2 +- modules/juce_core/xml/juce_XmlElement.h | 2 +- .../zip/juce_GZIPCompressorOutputStream.cpp | 2 +- .../zip/juce_GZIPCompressorOutputStream.h | 2 +- .../zip/juce_GZIPDecompressorInputStream.cpp | 2 +- .../zip/juce_GZIPDecompressorInputStream.h | 2 +- modules/juce_core/zip/juce_ZipFile.cpp | 2 +- modules/juce_core/zip/juce_ZipFile.h | 2 +- .../encryption/juce_BlowFish.cpp | 8 +- .../encryption/juce_BlowFish.h | 8 +- .../encryption/juce_Primes.cpp | 8 +- .../encryption/juce_Primes.h | 8 +- .../encryption/juce_RSAKey.cpp | 8 +- .../encryption/juce_RSAKey.h | 8 +- .../juce_cryptography/hashing/juce_MD5.cpp | 8 +- modules/juce_cryptography/hashing/juce_MD5.h | 8 +- .../juce_cryptography/hashing/juce_SHA256.cpp | 8 +- .../juce_cryptography/hashing/juce_SHA256.h | 8 +- .../hashing/juce_Whirlpool.cpp | 8 +- .../hashing/juce_Whirlpool.h | 8 +- .../juce_cryptography/juce_cryptography.cpp | 8 +- modules/juce_cryptography/juce_cryptography.h | 10 +- .../juce_cryptography/juce_cryptography.mm | 8 +- .../juce_ApplicationProperties.cpp | 8 +- .../juce_ApplicationProperties.h | 8 +- .../app_properties/juce_PropertiesFile.cpp | 8 +- .../app_properties/juce_PropertiesFile.h | 8 +- .../juce_data_structures.cpp | 8 +- .../juce_data_structures.h | 10 +- .../juce_data_structures.mm | 8 +- .../undomanager/juce_UndoManager.cpp | 8 +- .../undomanager/juce_UndoManager.h | 8 +- .../undomanager/juce_UndoableAction.h | 8 +- .../values/juce_CachedValue.cpp | 8 +- .../values/juce_CachedValue.h | 8 +- .../values/juce_Value.cpp | 8 +- .../juce_data_structures/values/juce_Value.h | 11 +- .../values/juce_ValueTree.cpp | 8 +- .../values/juce_ValueTree.h | 8 +- .../juce_ValueTreePropertyWithDefault.h | 8 +- ...juce_ValueTreePropertyWithDefault_test.cpp | 8 +- .../values/juce_ValueTreeSynchroniser.cpp | 8 +- .../values/juce_ValueTreeSynchroniser.h | 8 +- modules/juce_dsp/containers/juce_AudioBlock.h | 8 +- .../containers/juce_AudioBlock_test.cpp | 8 +- .../containers/juce_FixedSizeFunction.h | 8 +- .../juce_FixedSizeFunction_test.cpp | 8 +- .../juce_dsp/containers/juce_SIMDRegister.h | 11 +- .../containers/juce_SIMDRegister_Impl.h | 8 +- .../containers/juce_SIMDRegister_test.cpp | 257 +- .../filter_design/juce_FilterDesign.cpp | 8 +- .../filter_design/juce_FilterDesign.h | 8 +- .../juce_dsp/frequency/juce_Convolution.cpp | 8 +- modules/juce_dsp/frequency/juce_Convolution.h | 8 +- .../frequency/juce_Convolution_test.cpp | 8 +- modules/juce_dsp/frequency/juce_FFT.cpp | 8 +- modules/juce_dsp/frequency/juce_FFT.h | 8 +- modules/juce_dsp/frequency/juce_FFT_test.cpp | 8 +- modules/juce_dsp/frequency/juce_Windowing.cpp | 8 +- modules/juce_dsp/frequency/juce_Windowing.h | 8 +- modules/juce_dsp/juce_dsp.cpp | 8 +- modules/juce_dsp/juce_dsp.h | 12 +- modules/juce_dsp/juce_dsp.mm | 8 +- .../maths/juce_FastMathApproximations.h | 8 +- modules/juce_dsp/maths/juce_LogRampedValue.h | 8 +- .../maths/juce_LogRampedValue_test.cpp | 8 +- modules/juce_dsp/maths/juce_LookupTable.cpp | 8 +- modules/juce_dsp/maths/juce_LookupTable.h | 8 +- modules/juce_dsp/maths/juce_Matrix.cpp | 8 +- modules/juce_dsp/maths/juce_Matrix.h | 8 +- modules/juce_dsp/maths/juce_Matrix_test.cpp | 8 +- modules/juce_dsp/maths/juce_Phase.h | 8 +- modules/juce_dsp/maths/juce_Polynomial.h | 8 +- .../juce_dsp/maths/juce_SpecialFunctions.cpp | 8 +- .../juce_dsp/maths/juce_SpecialFunctions.h | 8 +- .../native/juce_avx_SIMDNativeOps.cpp | 8 +- .../juce_dsp/native/juce_avx_SIMDNativeOps.h | 8 +- .../native/juce_fallback_SIMDNativeOps.h | 8 +- .../native/juce_neon_SIMDNativeOps.cpp | 8 +- .../juce_dsp/native/juce_neon_SIMDNativeOps.h | 8 +- .../native/juce_sse_SIMDNativeOps.cpp | 8 +- .../juce_dsp/native/juce_sse_SIMDNativeOps.h | 16 +- .../processors/juce_BallisticsFilter.cpp | 8 +- .../processors/juce_BallisticsFilter.h | 8 +- .../juce_dsp/processors/juce_DelayLine.cpp | 8 +- modules/juce_dsp/processors/juce_DelayLine.h | 8 +- .../juce_dsp/processors/juce_DryWetMixer.cpp | 8 +- .../juce_dsp/processors/juce_DryWetMixer.h | 8 +- .../juce_dsp/processors/juce_FIRFilter.cpp | 8 +- modules/juce_dsp/processors/juce_FIRFilter.h | 8 +- .../processors/juce_FIRFilter_test.cpp | 8 +- .../processors/juce_FirstOrderTPTFilter.cpp | 8 +- .../processors/juce_FirstOrderTPTFilter.h | 8 +- .../juce_dsp/processors/juce_IIRFilter.cpp | 8 +- modules/juce_dsp/processors/juce_IIRFilter.h | 8 +- .../juce_dsp/processors/juce_IIRFilter_Impl.h | 8 +- .../processors/juce_LinkwitzRileyFilter.cpp | 8 +- .../processors/juce_LinkwitzRileyFilter.h | 8 +- .../juce_dsp/processors/juce_Oversampling.cpp | 8 +- .../juce_dsp/processors/juce_Oversampling.h | 8 +- modules/juce_dsp/processors/juce_Panner.cpp | 8 +- modules/juce_dsp/processors/juce_Panner.h | 8 +- .../juce_dsp/processors/juce_ProcessContext.h | 8 +- .../juce_dsp/processors/juce_ProcessorChain.h | 8 +- .../processors/juce_ProcessorChain_test.cpp | 8 +- .../processors/juce_ProcessorDuplicator.h | 8 +- .../processors/juce_ProcessorWrapper.h | 8 +- .../processors/juce_StateVariableFilter.h | 8 +- .../juce_StateVariableTPTFilter.cpp | 8 +- .../processors/juce_StateVariableTPTFilter.h | 8 +- modules/juce_dsp/widgets/juce_Bias.h | 8 +- modules/juce_dsp/widgets/juce_Chorus.cpp | 8 +- modules/juce_dsp/widgets/juce_Chorus.h | 8 +- modules/juce_dsp/widgets/juce_Compressor.cpp | 8 +- modules/juce_dsp/widgets/juce_Compressor.h | 8 +- modules/juce_dsp/widgets/juce_Gain.h | 8 +- .../juce_dsp/widgets/juce_LadderFilter.cpp | 8 +- modules/juce_dsp/widgets/juce_LadderFilter.h | 8 +- modules/juce_dsp/widgets/juce_Limiter.cpp | 8 +- modules/juce_dsp/widgets/juce_Limiter.h | 8 +- modules/juce_dsp/widgets/juce_NoiseGate.cpp | 8 +- modules/juce_dsp/widgets/juce_NoiseGate.h | 8 +- modules/juce_dsp/widgets/juce_Oscillator.h | 8 +- modules/juce_dsp/widgets/juce_Phaser.cpp | 8 +- modules/juce_dsp/widgets/juce_Phaser.h | 8 +- modules/juce_dsp/widgets/juce_Reverb.h | 8 +- modules/juce_dsp/widgets/juce_WaveShaper.h | 10 +- .../broadcasters/juce_ActionBroadcaster.cpp | 2 +- .../broadcasters/juce_ActionBroadcaster.h | 2 +- .../broadcasters/juce_ActionListener.h | 2 +- .../broadcasters/juce_AsyncUpdater.cpp | 2 +- .../broadcasters/juce_AsyncUpdater.h | 2 +- .../broadcasters/juce_ChangeBroadcaster.cpp | 2 +- .../broadcasters/juce_ChangeBroadcaster.h | 2 +- .../broadcasters/juce_ChangeListener.h | 2 +- .../juce_ConnectedChildProcess.cpp | 7 +- .../interprocess/juce_ConnectedChildProcess.h | 2 +- .../juce_InterprocessConnection.cpp | 2 +- .../juce_InterprocessConnection.h | 2 +- .../juce_InterprocessConnectionServer.cpp | 2 +- .../juce_InterprocessConnectionServer.h | 2 +- .../juce_NetworkServiceDiscovery.cpp | 2 +- .../juce_NetworkServiceDiscovery.h | 2 +- modules/juce_events/juce_events.cpp | 3 +- modules/juce_events/juce_events.h | 4 +- modules/juce_events/juce_events.mm | 2 +- .../messages/juce_ApplicationBase.cpp | 2 +- .../messages/juce_ApplicationBase.h | 2 +- .../messages/juce_CallbackMessage.h | 2 +- .../messages/juce_DeletedAtShutdown.cpp | 2 +- .../messages/juce_DeletedAtShutdown.h | 2 +- .../messages/juce_Initialisation.h | 2 +- modules/juce_events/messages/juce_Message.h | 2 +- .../messages/juce_MessageListener.cpp | 2 +- .../messages/juce_MessageListener.h | 2 +- .../messages/juce_MessageManager.cpp | 4 +- .../messages/juce_MessageManager.h | 2 +- .../juce_MountedVolumeListChangeDetector.h | 2 +- .../messages/juce_NotificationType.h | 2 +- .../juce_ScopedLowPowerModeDisabler.cpp | 19 +- .../native/juce_ScopedLowPowerModeDisabler.h | 2 +- .../native/juce_android_Messaging.cpp | 3 +- .../native/juce_ios_MessageManager.mm | 2 +- .../juce_events/native/juce_linux_EventLoop.h | 2 +- .../native/juce_linux_EventLoopInternal.h | 55 + .../native/juce_linux_Messaging.cpp | 227 +- .../native/juce_mac_MessageManager.mm | 2 +- .../native/juce_osx_MessageQueue.h | 2 +- .../native/juce_win32_HiddenMessageWindow.h | 2 +- .../native/juce_win32_Messaging.cpp | 2 +- .../native/juce_win32_WinRTWrapper.cpp | 2 +- .../native/juce_win32_WinRTWrapper.h | 2 +- .../juce_events/timers/juce_MultiTimer.cpp | 2 +- modules/juce_events/timers/juce_MultiTimer.h | 2 +- modules/juce_events/timers/juce_Timer.cpp | 2 +- modules/juce_events/timers/juce_Timer.h | 2 +- modules/juce_graphics/colour/juce_Colour.cpp | 8 +- modules/juce_graphics/colour/juce_Colour.h | 8 +- .../colour/juce_ColourGradient.cpp | 8 +- .../colour/juce_ColourGradient.h | 8 +- modules/juce_graphics/colour/juce_Colours.cpp | 8 +- modules/juce_graphics/colour/juce_Colours.h | 8 +- .../juce_graphics/colour/juce_FillType.cpp | 8 +- modules/juce_graphics/colour/juce_FillType.h | 8 +- .../juce_graphics/colour/juce_PixelFormats.h | 8 +- .../contexts/juce_GraphicsContext.cpp | 278 +- .../contexts/juce_GraphicsContext.h | 8 +- .../contexts/juce_LowLevelGraphicsContext.h | 8 +- ...uce_LowLevelGraphicsPostScriptRenderer.cpp | 8 +- .../juce_LowLevelGraphicsPostScriptRenderer.h | 9 +- .../juce_LowLevelGraphicsSoftwareRenderer.cpp | 8 +- .../juce_LowLevelGraphicsSoftwareRenderer.h | 8 +- .../effects/juce_DropShadowEffect.cpp | 8 +- .../effects/juce_DropShadowEffect.h | 8 +- .../juce_graphics/effects/juce_GlowEffect.cpp | 8 +- .../juce_graphics/effects/juce_GlowEffect.h | 8 +- .../effects/juce_ImageEffectFilter.h | 8 +- .../fonts/juce_AttributedString.cpp | 8 +- .../fonts/juce_AttributedString.h | 8 +- .../fonts/juce_CustomTypeface.cpp | 8 +- .../juce_graphics/fonts/juce_CustomTypeface.h | 8 +- modules/juce_graphics/fonts/juce_Font.cpp | 30 +- modules/juce_graphics/fonts/juce_Font.h | 17 +- .../fonts/juce_GlyphArrangement.cpp | 8 +- .../fonts/juce_GlyphArrangement.h | 8 +- .../juce_graphics/fonts/juce_TextLayout.cpp | 8 +- modules/juce_graphics/fonts/juce_TextLayout.h | 8 +- modules/juce_graphics/fonts/juce_Typeface.cpp | 8 +- modules/juce_graphics/fonts/juce_Typeface.h | 8 +- .../geometry/juce_AffineTransform.cpp | 8 +- .../geometry/juce_AffineTransform.h | 8 +- .../juce_graphics/geometry/juce_BorderSize.h | 58 +- .../juce_graphics/geometry/juce_EdgeTable.cpp | 8 +- .../juce_graphics/geometry/juce_EdgeTable.h | 8 +- modules/juce_graphics/geometry/juce_Line.h | 31 +- .../geometry/juce_Parallelogram.h | 8 +- modules/juce_graphics/geometry/juce_Path.cpp | 8 +- modules/juce_graphics/geometry/juce_Path.h | 8 +- .../geometry/juce_PathIterator.cpp | 8 +- .../geometry/juce_PathIterator.h | 8 +- .../geometry/juce_PathStrokeType.cpp | 8 +- .../geometry/juce_PathStrokeType.h | 8 +- modules/juce_graphics/geometry/juce_Point.h | 8 +- .../juce_graphics/geometry/juce_Rectangle.h | 8 +- .../geometry/juce_RectangleList.h | 8 +- .../geometry/juce_Rectangle_test.cpp | 8 +- .../image_formats/juce_GIFLoader.cpp | 8 +- .../image_formats/juce_JPEGLoader.cpp | 8 +- .../image_formats/juce_PNGLoader.cpp | 11 +- modules/juce_graphics/images/juce_Image.cpp | 8 +- modules/juce_graphics/images/juce_Image.h | 8 +- .../juce_graphics/images/juce_ImageCache.cpp | 8 +- .../juce_graphics/images/juce_ImageCache.h | 8 +- .../images/juce_ImageConvolutionKernel.cpp | 8 +- .../images/juce_ImageConvolutionKernel.h | 8 +- .../images/juce_ImageFileFormat.cpp | 8 +- .../images/juce_ImageFileFormat.h | 8 +- .../juce_graphics/images/juce_ScaledImage.h | 8 +- modules/juce_graphics/juce_graphics.cpp | 8 +- modules/juce_graphics/juce_graphics.h | 10 +- modules/juce_graphics/juce_graphics.mm | 8 +- .../native/juce_RenderingHelpers.h | 8 +- .../native/juce_android_Fonts.cpp | 8 +- .../native/juce_android_GraphicsContext.cpp | 14 +- .../native/juce_android_IconHelpers.cpp | 9 +- .../native/juce_freetype_Fonts.cpp | 8 +- .../juce_graphics/native/juce_linux_Fonts.cpp | 110 +- .../native/juce_linux_IconHelpers.cpp | 9 +- .../native/juce_mac_CoreGraphicsContext.h | 8 +- .../native/juce_mac_CoreGraphicsContext.mm | 27 +- .../native/juce_mac_CoreGraphicsHelpers.h | 8 +- .../juce_graphics/native/juce_mac_Fonts.mm | 11 +- .../native/juce_mac_IconHelpers.cpp | 8 +- .../juce_win32_Direct2DGraphicsContext.cpp | 8 +- .../juce_win32_Direct2DGraphicsContext.h | 8 +- .../juce_win32_DirectWriteTypeLayout.cpp | 50 +- .../native/juce_win32_DirectWriteTypeface.cpp | 8 +- .../juce_graphics/native/juce_win32_Fonts.cpp | 8 +- .../native/juce_win32_IconHelpers.cpp | 9 +- .../placement/juce_Justification.h | 8 +- .../placement/juce_RectanglePlacement.cpp | 8 +- .../placement/juce_RectanglePlacement.h | 8 +- .../enums/juce_AccessibilityActions.h | 8 +- .../enums/juce_AccessibilityEvent.h | 8 +- .../enums/juce_AccessibilityRole.h | 8 +- .../juce_AccessibilityCellInterface.h | 8 +- .../juce_AccessibilityTableInterface.h | 8 +- .../juce_AccessibilityTextInterface.h | 11 +- .../juce_AccessibilityValueInterface.h | 8 +- .../juce_AccessibilityHandler.cpp | 9 +- .../accessibility/juce_AccessibilityHandler.h | 8 +- .../accessibility/juce_AccessibilityState.h | 8 +- .../application/juce_Application.cpp | 8 +- .../application/juce_Application.h | 8 +- .../buttons/juce_ArrowButton.cpp | 8 +- .../buttons/juce_ArrowButton.h | 8 +- .../juce_gui_basics/buttons/juce_Button.cpp | 8 +- modules/juce_gui_basics/buttons/juce_Button.h | 8 +- .../buttons/juce_DrawableButton.cpp | 8 +- .../buttons/juce_DrawableButton.h | 8 +- .../buttons/juce_HyperlinkButton.cpp | 8 +- .../buttons/juce_HyperlinkButton.h | 8 +- .../buttons/juce_ImageButton.cpp | 8 +- .../buttons/juce_ImageButton.h | 8 +- .../buttons/juce_ShapeButton.cpp | 8 +- .../buttons/juce_ShapeButton.h | 8 +- .../buttons/juce_TextButton.cpp | 8 +- .../juce_gui_basics/buttons/juce_TextButton.h | 8 +- .../buttons/juce_ToggleButton.cpp | 8 +- .../buttons/juce_ToggleButton.h | 8 +- .../buttons/juce_ToolbarButton.cpp | 8 +- .../buttons/juce_ToolbarButton.h | 8 +- .../commands/juce_ApplicationCommandID.h | 8 +- .../commands/juce_ApplicationCommandInfo.cpp | 8 +- .../commands/juce_ApplicationCommandInfo.h | 8 +- .../juce_ApplicationCommandManager.cpp | 8 +- .../commands/juce_ApplicationCommandManager.h | 8 +- .../juce_ApplicationCommandTarget.cpp | 8 +- .../commands/juce_ApplicationCommandTarget.h | 8 +- .../commands/juce_KeyPressMappingSet.cpp | 8 +- .../commands/juce_KeyPressMappingSet.h | 8 +- .../components/juce_CachedComponentImage.h | 8 +- .../components/juce_Component.cpp | 46 +- .../components/juce_Component.h | 14 +- .../components/juce_ComponentListener.cpp | 8 +- .../components/juce_ComponentListener.h | 8 +- .../components/juce_ComponentTraverser.h | 8 +- .../components/juce_FocusTraverser.cpp | 8 +- .../components/juce_FocusTraverser.h | 8 +- .../components/juce_ModalComponentManager.cpp | 8 +- .../components/juce_ModalComponentManager.h | 8 +- .../juce_gui_basics/desktop/juce_Desktop.cpp | 8 +- .../juce_gui_basics/desktop/juce_Desktop.h | 8 +- .../juce_gui_basics/desktop/juce_Displays.cpp | 8 +- .../juce_gui_basics/desktop/juce_Displays.h | 10 +- .../drawables/juce_Drawable.cpp | 8 +- .../juce_gui_basics/drawables/juce_Drawable.h | 8 +- .../drawables/juce_DrawableComposite.cpp | 8 +- .../drawables/juce_DrawableComposite.h | 8 +- .../drawables/juce_DrawableImage.cpp | 8 +- .../drawables/juce_DrawableImage.h | 8 +- .../drawables/juce_DrawablePath.cpp | 8 +- .../drawables/juce_DrawablePath.h | 8 +- .../drawables/juce_DrawableRectangle.cpp | 8 +- .../drawables/juce_DrawableRectangle.h | 8 +- .../drawables/juce_DrawableShape.cpp | 8 +- .../drawables/juce_DrawableShape.h | 8 +- .../drawables/juce_DrawableText.cpp | 8 +- .../drawables/juce_DrawableText.h | 8 +- .../drawables/juce_SVGParser.cpp | 9 +- .../filebrowser/juce_ContentSharer.cpp | 8 +- .../filebrowser/juce_ContentSharer.h | 8 +- ...juce_DirectoryContentsDisplayComponent.cpp | 8 +- .../juce_DirectoryContentsDisplayComponent.h | 8 +- .../juce_DirectoryContentsList.cpp | 18 +- .../filebrowser/juce_DirectoryContentsList.h | 10 +- .../filebrowser/juce_FileBrowserComponent.cpp | 8 +- .../filebrowser/juce_FileBrowserComponent.h | 8 +- .../filebrowser/juce_FileBrowserListener.h | 8 +- .../filebrowser/juce_FileChooser.cpp | 8 +- .../filebrowser/juce_FileChooser.h | 8 +- .../filebrowser/juce_FileChooserDialogBox.cpp | 8 +- .../filebrowser/juce_FileChooserDialogBox.h | 8 +- .../filebrowser/juce_FileListComponent.cpp | 8 +- .../filebrowser/juce_FileListComponent.h | 8 +- .../filebrowser/juce_FilePreviewComponent.h | 8 +- .../juce_FileSearchPathListComponent.cpp | 8 +- .../juce_FileSearchPathListComponent.h | 8 +- .../filebrowser/juce_FileTreeComponent.cpp | 8 +- .../filebrowser/juce_FileTreeComponent.h | 8 +- .../filebrowser/juce_FilenameComponent.cpp | 8 +- .../filebrowser/juce_FilenameComponent.h | 8 +- .../juce_ImagePreviewComponent.cpp | 8 +- .../filebrowser/juce_ImagePreviewComponent.h | 8 +- modules/juce_gui_basics/juce_gui_basics.cpp | 49 +- modules/juce_gui_basics/juce_gui_basics.h | 17 +- modules/juce_gui_basics/juce_gui_basics.mm | 8 +- .../keyboard/juce_CaretComponent.cpp | 8 +- .../keyboard/juce_CaretComponent.h | 8 +- .../keyboard/juce_KeyListener.cpp | 8 +- .../keyboard/juce_KeyListener.h | 8 +- .../keyboard/juce_KeyPress.cpp | 8 +- .../juce_gui_basics/keyboard/juce_KeyPress.h | 8 +- .../keyboard/juce_KeyboardFocusTraverser.cpp | 8 +- .../keyboard/juce_KeyboardFocusTraverser.h | 8 +- .../keyboard/juce_ModifierKeys.cpp | 8 +- .../keyboard/juce_ModifierKeys.h | 8 +- .../keyboard/juce_SystemClipboard.h | 8 +- .../keyboard/juce_TextEditorKeyMapper.h | 8 +- .../keyboard/juce_TextInputTarget.h | 8 +- .../layout/juce_AnimatedPosition.h | 8 +- .../layout/juce_AnimatedPositionBehaviours.h | 8 +- .../layout/juce_ComponentAnimator.cpp | 8 +- .../layout/juce_ComponentAnimator.h | 8 +- .../juce_ComponentBoundsConstrainer.cpp | 12 +- .../layout/juce_ComponentBoundsConstrainer.h | 8 +- .../layout/juce_ComponentBuilder.cpp | 8 +- .../layout/juce_ComponentBuilder.h | 8 +- .../layout/juce_ComponentMovementWatcher.cpp | 8 +- .../layout/juce_ComponentMovementWatcher.h | 8 +- .../layout/juce_ConcertinaPanel.cpp | 8 +- .../layout/juce_ConcertinaPanel.h | 8 +- .../juce_gui_basics/layout/juce_FlexBox.cpp | 8 +- modules/juce_gui_basics/layout/juce_FlexBox.h | 8 +- .../juce_gui_basics/layout/juce_FlexItem.h | 8 +- modules/juce_gui_basics/layout/juce_Grid.cpp | 8 +- modules/juce_gui_basics/layout/juce_Grid.h | 8 +- .../juce_gui_basics/layout/juce_GridItem.cpp | 8 +- .../juce_gui_basics/layout/juce_GridItem.h | 8 +- .../layout/juce_GroupComponent.cpp | 8 +- .../layout/juce_GroupComponent.h | 8 +- .../layout/juce_MultiDocumentPanel.cpp | 8 +- .../layout/juce_MultiDocumentPanel.h | 8 +- .../layout/juce_ResizableBorderComponent.cpp | 8 +- .../layout/juce_ResizableBorderComponent.h | 8 +- .../layout/juce_ResizableCornerComponent.cpp | 8 +- .../layout/juce_ResizableCornerComponent.h | 8 +- .../layout/juce_ResizableEdgeComponent.cpp | 8 +- .../layout/juce_ResizableEdgeComponent.h | 8 +- .../juce_gui_basics/layout/juce_ScrollBar.cpp | 8 +- .../juce_gui_basics/layout/juce_ScrollBar.h | 8 +- .../juce_gui_basics/layout/juce_SidePanel.cpp | 8 +- .../juce_gui_basics/layout/juce_SidePanel.h | 8 +- .../layout/juce_StretchableLayoutManager.cpp | 8 +- .../layout/juce_StretchableLayoutManager.h | 8 +- .../juce_StretchableLayoutResizerBar.cpp | 8 +- .../layout/juce_StretchableLayoutResizerBar.h | 8 +- .../layout/juce_StretchableObjectResizer.cpp | 8 +- .../layout/juce_StretchableObjectResizer.h | 8 +- .../layout/juce_TabbedButtonBar.cpp | 8 +- .../layout/juce_TabbedButtonBar.h | 8 +- .../layout/juce_TabbedComponent.cpp | 8 +- .../layout/juce_TabbedComponent.h | 8 +- .../juce_gui_basics/layout/juce_Viewport.cpp | 10 +- .../juce_gui_basics/layout/juce_Viewport.h | 18 +- .../lookandfeel/juce_LookAndFeel.cpp | 8 +- .../lookandfeel/juce_LookAndFeel.h | 8 +- .../lookandfeel/juce_LookAndFeel_V1.cpp | 8 +- .../lookandfeel/juce_LookAndFeel_V1.h | 8 +- .../lookandfeel/juce_LookAndFeel_V2.cpp | 8 +- .../lookandfeel/juce_LookAndFeel_V2.h | 8 +- .../lookandfeel/juce_LookAndFeel_V3.cpp | 8 +- .../lookandfeel/juce_LookAndFeel_V3.h | 8 +- .../lookandfeel/juce_LookAndFeel_V4.cpp | 8 +- .../lookandfeel/juce_LookAndFeel_V4.h | 8 +- .../menus/juce_BurgerMenuComponent.cpp | 8 +- .../menus/juce_BurgerMenuComponent.h | 8 +- .../menus/juce_MenuBarComponent.cpp | 8 +- .../menus/juce_MenuBarComponent.h | 8 +- .../menus/juce_MenuBarModel.cpp | 8 +- .../juce_gui_basics/menus/juce_MenuBarModel.h | 8 +- .../juce_gui_basics/menus/juce_PopupMenu.cpp | 63 +- .../juce_gui_basics/menus/juce_PopupMenu.h | 8 +- .../misc/juce_BubbleComponent.cpp | 8 +- .../misc/juce_BubbleComponent.h | 8 +- .../misc/juce_DropShadower.cpp | 34 +- .../juce_gui_basics/misc/juce_DropShadower.h | 8 +- .../misc/juce_FocusOutline.cpp | 8 +- .../juce_gui_basics/misc/juce_FocusOutline.h | 8 +- .../misc/juce_JUCESplashScreen.cpp | 12 +- .../misc/juce_JUCESplashScreen.h | 12 +- .../mouse/juce_ComponentDragger.cpp | 8 +- .../mouse/juce_ComponentDragger.h | 8 +- .../mouse/juce_DragAndDropContainer.cpp | 20 +- .../mouse/juce_DragAndDropContainer.h | 8 +- .../mouse/juce_DragAndDropTarget.h | 8 +- .../mouse/juce_FileDragAndDropTarget.h | 8 +- .../mouse/juce_LassoComponent.h | 8 +- .../mouse/juce_MouseCursor.cpp | 8 +- .../juce_gui_basics/mouse/juce_MouseCursor.h | 8 +- .../juce_gui_basics/mouse/juce_MouseEvent.cpp | 8 +- .../juce_gui_basics/mouse/juce_MouseEvent.h | 8 +- .../mouse/juce_MouseInactivityDetector.cpp | 8 +- .../mouse/juce_MouseInactivityDetector.h | 8 +- .../mouse/juce_MouseInputSource.cpp | 8 +- .../mouse/juce_MouseInputSource.h | 8 +- .../mouse/juce_MouseListener.cpp | 8 +- .../mouse/juce_MouseListener.h | 8 +- .../juce_gui_basics/mouse/juce_PointerState.h | 8 +- .../mouse/juce_SelectedItemSet.h | 8 +- .../mouse/juce_TextDragAndDropTarget.h | 8 +- .../mouse/juce_TooltipClient.h | 8 +- .../juce_AccessibilityTextHelpers.h | 246 +- .../juce_AccessibilityTextHelpers_test.cpp | 155 + .../juce_android_Accessibility.cpp | 283 +- .../accessibility/juce_ios_Accessibility.mm | 50 +- .../accessibility/juce_mac_Accessibility.mm | 52 +- .../juce_mac_AccessibilitySharedCode.mm | 8 +- .../juce_win32_Accessibility.cpp | 24 +- .../juce_win32_AccessibilityElement.cpp | 8 +- .../juce_win32_AccessibilityElement.h | 8 +- .../accessibility/juce_win32_ComInterfaces.h | 8 +- .../juce_win32_UIAExpandCollapseProvider.h | 8 +- .../juce_win32_UIAGridItemProvider.h | 8 +- .../juce_win32_UIAGridProvider.h | 8 +- .../accessibility/juce_win32_UIAHelpers.h | 22 +- .../juce_win32_UIAInvokeProvider.h | 8 +- .../juce_win32_UIAProviderBase.h | 8 +- .../accessibility/juce_win32_UIAProviders.h | 8 +- .../juce_win32_UIARangeValueProvider.h | 8 +- .../juce_win32_UIASelectionProvider.h | 8 +- .../juce_win32_UIATextProvider.h | 110 +- .../juce_win32_UIAToggleProvider.h | 8 +- .../juce_win32_UIATransformProvider.h | 8 +- .../juce_win32_UIAValueProvider.h | 8 +- .../juce_win32_UIAWindowProvider.h | 8 +- .../juce_win32_WindowsUIAWrapper.h | 8 +- .../app/com/rmsl/juce/ComponentPeerView.java | 8 +- .../rmsl/juce/JuceContentProviderCursor.java | 8 +- .../juce/JuceContentProviderFileObserver.java | 8 +- .../app/com/rmsl/juce/JuceActivity.java | 17 +- .../rmsl/juce/JuceSharingContentProvider.java | 8 +- .../native/juce_MultiTouchMapper.h | 8 +- .../native/juce_ScopedDPIAwarenessDisabler.h | 8 +- .../native/juce_android_ContentSharer.cpp | 14 +- .../native/juce_android_FileChooser.cpp | 70 +- .../native/juce_android_Windowing.cpp | 42 +- .../native/juce_ios_ContentSharer.cpp | 8 +- .../native/juce_ios_FileChooser.mm | 8 +- .../native/juce_ios_UIViewComponentPeer.mm | 156 +- .../native/juce_ios_Windowing.mm | 8 +- .../native/juce_linux_FileChooser.cpp | 8 +- .../native/juce_linux_Windowing.cpp | 80 +- .../native/juce_mac_CGMetalLayerRenderer.h | 365 + .../native/juce_mac_FileChooser.mm | 17 +- .../native/juce_mac_MainMenu.mm | 8 +- .../native/juce_mac_MouseCursor.mm | 8 +- .../native/juce_mac_NSViewComponentPeer.mm | 301 +- .../native/juce_mac_Windowing.mm | 8 +- .../native/juce_win32_DragAndDrop.cpp | 10 +- .../native/juce_win32_FileChooser.cpp | 8 +- ...uce_win32_ScopedThreadDPIAwarenessSetter.h | 8 +- .../native/juce_win32_Windowing.cpp | 487 +- .../native/x11/juce_linux_X11_DragAndDrop.cpp | 8 +- .../native/x11/juce_linux_X11_Symbols.cpp | 8 +- .../native/x11/juce_linux_X11_Symbols.h | 8 +- .../native/x11/juce_linux_XWindowSystem.cpp | 15 +- .../native/x11/juce_linux_XWindowSystem.h | 8 +- .../positioning/juce_MarkerList.cpp | 8 +- .../positioning/juce_MarkerList.h | 8 +- .../positioning/juce_RelativeCoordinate.cpp | 8 +- .../positioning/juce_RelativeCoordinate.h | 8 +- .../juce_RelativeCoordinatePositioner.cpp | 8 +- .../juce_RelativeCoordinatePositioner.h | 8 +- .../juce_RelativeParallelogram.cpp | 8 +- .../positioning/juce_RelativeParallelogram.h | 8 +- .../positioning/juce_RelativePoint.cpp | 8 +- .../positioning/juce_RelativePoint.h | 8 +- .../positioning/juce_RelativePointPath.cpp | 8 +- .../positioning/juce_RelativePointPath.h | 8 +- .../positioning/juce_RelativeRectangle.cpp | 8 +- .../positioning/juce_RelativeRectangle.h | 8 +- .../juce_BooleanPropertyComponent.cpp | 8 +- .../juce_BooleanPropertyComponent.h | 8 +- .../juce_ButtonPropertyComponent.cpp | 8 +- .../properties/juce_ButtonPropertyComponent.h | 8 +- .../juce_ChoicePropertyComponent.cpp | 8 +- .../properties/juce_ChoicePropertyComponent.h | 8 +- .../juce_MultiChoicePropertyComponent.cpp | 8 +- .../juce_MultiChoicePropertyComponent.h | 8 +- .../properties/juce_PropertyComponent.cpp | 8 +- .../properties/juce_PropertyComponent.h | 8 +- .../properties/juce_PropertyPanel.cpp | 8 +- .../properties/juce_PropertyPanel.h | 8 +- .../juce_SliderPropertyComponent.cpp | 8 +- .../properties/juce_SliderPropertyComponent.h | 8 +- .../properties/juce_TextPropertyComponent.cpp | 8 +- .../properties/juce_TextPropertyComponent.h | 8 +- .../juce_gui_basics/widgets/juce_ComboBox.cpp | 8 +- .../juce_gui_basics/widgets/juce_ComboBox.h | 8 +- .../widgets/juce_ImageComponent.cpp | 8 +- .../widgets/juce_ImageComponent.h | 8 +- .../juce_gui_basics/widgets/juce_Label.cpp | 11 +- modules/juce_gui_basics/widgets/juce_Label.h | 8 +- .../juce_gui_basics/widgets/juce_ListBox.cpp | 51 +- .../juce_gui_basics/widgets/juce_ListBox.h | 46 +- .../widgets/juce_ProgressBar.cpp | 8 +- .../widgets/juce_ProgressBar.h | 8 +- .../juce_gui_basics/widgets/juce_Slider.cpp | 61 +- modules/juce_gui_basics/widgets/juce_Slider.h | 10 +- .../widgets/juce_TableHeaderComponent.cpp | 12 +- .../widgets/juce_TableHeaderComponent.h | 8 +- .../widgets/juce_TableListBox.cpp | 10 +- .../widgets/juce_TableListBox.h | 8 +- .../widgets/juce_TextEditor.cpp | 85 +- .../juce_gui_basics/widgets/juce_TextEditor.h | 27 +- .../juce_gui_basics/widgets/juce_Toolbar.cpp | 8 +- .../juce_gui_basics/widgets/juce_Toolbar.h | 8 +- .../widgets/juce_ToolbarItemComponent.cpp | 10 +- .../widgets/juce_ToolbarItemComponent.h | 8 +- .../widgets/juce_ToolbarItemFactory.h | 8 +- .../widgets/juce_ToolbarItemPalette.cpp | 8 +- .../widgets/juce_ToolbarItemPalette.h | 8 +- .../juce_gui_basics/widgets/juce_TreeView.cpp | 8 +- .../juce_gui_basics/widgets/juce_TreeView.h | 8 +- .../windows/juce_AlertWindow.cpp | 8 +- .../windows/juce_AlertWindow.h | 8 +- .../windows/juce_CallOutBox.cpp | 8 +- .../juce_gui_basics/windows/juce_CallOutBox.h | 8 +- .../windows/juce_ComponentPeer.cpp | 38 +- .../windows/juce_ComponentPeer.h | 104 +- .../windows/juce_DialogWindow.cpp | 8 +- .../windows/juce_DialogWindow.h | 8 +- .../windows/juce_DocumentWindow.cpp | 8 +- .../windows/juce_DocumentWindow.h | 8 +- .../windows/juce_MessageBoxOptions.h | 8 +- .../windows/juce_NativeMessageBox.h | 8 +- .../windows/juce_ResizableWindow.cpp | 12 +- .../windows/juce_ResizableWindow.h | 8 +- .../windows/juce_ThreadWithProgressWindow.cpp | 8 +- .../windows/juce_ThreadWithProgressWindow.h | 8 +- .../windows/juce_TooltipWindow.cpp | 8 +- .../windows/juce_TooltipWindow.h | 8 +- .../windows/juce_TopLevelWindow.cpp | 10 +- .../windows/juce_TopLevelWindow.h | 8 +- .../juce_CPlusPlusCodeTokeniser.cpp | 8 +- .../code_editor/juce_CPlusPlusCodeTokeniser.h | 8 +- .../juce_CPlusPlusCodeTokeniserFunctions.h | 10 +- .../code_editor/juce_CodeDocument.cpp | 8 +- .../code_editor/juce_CodeDocument.h | 8 +- .../code_editor/juce_CodeEditorComponent.cpp | 19 +- .../code_editor/juce_CodeEditorComponent.h | 8 +- .../code_editor/juce_CodeTokeniser.h | 8 +- .../code_editor/juce_LuaCodeTokeniser.cpp | 10 +- .../code_editor/juce_LuaCodeTokeniser.h | 8 +- .../code_editor/juce_XMLCodeTokeniser.cpp | 8 +- .../code_editor/juce_XMLCodeTokeniser.h | 8 +- .../documents/juce_FileBasedDocument.cpp | 8 +- .../documents/juce_FileBasedDocument.h | 8 +- .../embedding/juce_ActiveXControlComponent.h | 8 +- .../embedding/juce_AndroidViewComponent.h | 8 +- .../embedding/juce_HWNDComponent.h | 11 +- .../embedding/juce_NSViewComponent.h | 8 +- .../embedding/juce_UIViewComponent.h | 8 +- .../embedding/juce_XEmbedComponent.h | 11 +- modules/juce_gui_extra/juce_gui_extra.cpp | 8 +- modules/juce_gui_extra/juce_gui_extra.h | 10 +- modules/juce_gui_extra/juce_gui_extra.mm | 8 +- .../misc/juce_AnimatedAppComponent.cpp | 8 +- .../misc/juce_AnimatedAppComponent.h | 8 +- .../juce_gui_extra/misc/juce_AppleRemote.h | 8 +- .../misc/juce_BubbleMessageComponent.cpp | 8 +- .../misc/juce_BubbleMessageComponent.h | 8 +- .../misc/juce_ColourSelector.cpp | 12 +- .../juce_gui_extra/misc/juce_ColourSelector.h | 8 +- .../misc/juce_KeyMappingEditorComponent.cpp | 8 +- .../misc/juce_KeyMappingEditorComponent.h | 8 +- .../misc/juce_LiveConstantEditor.cpp | 8 +- .../misc/juce_LiveConstantEditor.h | 8 +- .../misc/juce_PreferencesPanel.cpp | 8 +- .../misc/juce_PreferencesPanel.h | 8 +- .../misc/juce_PushNotifications.cpp | 8 +- .../misc/juce_PushNotifications.h | 8 +- .../misc/juce_RecentlyOpenedFilesList.cpp | 8 +- .../misc/juce_RecentlyOpenedFilesList.h | 8 +- .../juce_gui_extra/misc/juce_SplashScreen.cpp | 8 +- .../juce_gui_extra/misc/juce_SplashScreen.h | 8 +- .../misc/juce_SystemTrayIconComponent.cpp | 8 +- .../misc/juce_SystemTrayIconComponent.h | 8 +- .../misc/juce_WebBrowserComponent.h | 8 +- .../java/app/com/rmsl/juce/JuceWebView.java | 8 +- .../java/app/com/rmsl/juce/JuceWebView21.java | 8 +- .../juce/JuceFirebaseInstanceIdService.java | 8 +- .../juce/JuceFirebaseMessagingService.java | 8 +- .../native/juce_AndroidViewComponent.cpp | 8 +- .../native/juce_android_PushNotifications.cpp | 8 +- .../juce_android_WebBrowserComponent.cpp | 8 +- .../native/juce_ios_PushNotifications.cpp | 8 +- .../native/juce_ios_UIViewComponent.mm | 8 +- .../native/juce_linux_X11_SystemTrayIcon.cpp | 8 +- .../juce_linux_X11_WebBrowserComponent.cpp | 8 +- .../native/juce_linux_XEmbedComponent.cpp | 16 +- .../native/juce_mac_AppleRemote.mm | 8 +- .../juce_mac_CarbonViewWrapperComponent.h | 346 - .../native/juce_mac_NSViewComponent.mm | 8 +- .../native/juce_mac_NSViewFrameWatcher.h | 8 +- .../native/juce_mac_PushNotifications.cpp | 8 +- .../native/juce_mac_SystemTrayIcon.cpp | 14 +- .../native/juce_mac_WebBrowserComponent.mm | 19 +- .../native/juce_win32_ActiveXComponent.cpp | 9 +- .../native/juce_win32_HWNDComponent.cpp | 14 +- .../native/juce_win32_SystemTrayIcon.cpp | 8 +- .../native/juce_win32_WebBrowserComponent.cpp | 8 +- .../geometry/juce_Draggable3DOrientation.h | 8 +- modules/juce_opengl/geometry/juce_Matrix3D.h | 8 +- .../juce_opengl/geometry/juce_Quaternion.h | 8 +- modules/juce_opengl/geometry/juce_Vector3D.h | 8 +- modules/juce_opengl/juce_opengl.cpp | 8 +- modules/juce_opengl/juce_opengl.h | 10 +- modules/juce_opengl/juce_opengl.mm | 8 +- .../app/com/rmsl/juce/JuceOpenGLView.java | 17 +- .../native/juce_OpenGLExtensions.h | 8 +- .../juce_opengl/native/juce_OpenGL_android.h | 100 +- modules/juce_opengl/native/juce_OpenGL_ios.h | 8 +- .../native/juce_OpenGL_linux_X11.h | 8 +- modules/juce_opengl/native/juce_OpenGL_osx.h | 21 +- .../juce_opengl/native/juce_OpenGL_win32.h | 8 +- .../juce_opengl/opengl/juce_OpenGLContext.cpp | 8 +- .../juce_opengl/opengl/juce_OpenGLContext.h | 8 +- .../opengl/juce_OpenGLFrameBuffer.cpp | 8 +- .../opengl/juce_OpenGLFrameBuffer.h | 8 +- .../opengl/juce_OpenGLGraphicsContext.cpp | 8 +- .../opengl/juce_OpenGLGraphicsContext.h | 8 +- .../juce_opengl/opengl/juce_OpenGLHelpers.cpp | 8 +- .../juce_opengl/opengl/juce_OpenGLHelpers.h | 8 +- .../juce_opengl/opengl/juce_OpenGLImage.cpp | 8 +- modules/juce_opengl/opengl/juce_OpenGLImage.h | 8 +- .../opengl/juce_OpenGLPixelFormat.cpp | 8 +- .../opengl/juce_OpenGLPixelFormat.h | 8 +- .../juce_opengl/opengl/juce_OpenGLRenderer.h | 8 +- .../opengl/juce_OpenGLShaderProgram.cpp | 8 +- .../opengl/juce_OpenGLShaderProgram.h | 8 +- .../juce_opengl/opengl/juce_OpenGLTexture.cpp | 8 +- .../juce_opengl/opengl/juce_OpenGLTexture.h | 8 +- modules/juce_opengl/opengl/juce_gl.cpp | 8 +- modules/juce_opengl/opengl/juce_gl.h | 8 +- modules/juce_opengl/opengl/juce_gles2.cpp | 8 +- modules/juce_opengl/opengl/juce_gles2.h | 8 +- modules/juce_opengl/opengl/juce_wgl.h | 8 +- .../utils/juce_OpenGLAppComponent.cpp | 8 +- .../utils/juce_OpenGLAppComponent.h | 8 +- modules/juce_osc/juce_osc.cpp | 8 +- modules/juce_osc/juce_osc.h | 10 +- modules/juce_osc/osc/juce_OSCAddress.cpp | 8 +- modules/juce_osc/osc/juce_OSCAddress.h | 8 +- modules/juce_osc/osc/juce_OSCArgument.cpp | 8 +- modules/juce_osc/osc/juce_OSCArgument.h | 8 +- modules/juce_osc/osc/juce_OSCBundle.cpp | 8 +- modules/juce_osc/osc/juce_OSCBundle.h | 8 +- modules/juce_osc/osc/juce_OSCMessage.cpp | 8 +- modules/juce_osc/osc/juce_OSCMessage.h | 8 +- modules/juce_osc/osc/juce_OSCReceiver.cpp | 8 +- modules/juce_osc/osc/juce_OSCReceiver.h | 8 +- modules/juce_osc/osc/juce_OSCSender.cpp | 8 +- modules/juce_osc/osc/juce_OSCSender.h | 8 +- modules/juce_osc/osc/juce_OSCTimeTag.cpp | 8 +- modules/juce_osc/osc/juce_OSCTimeTag.h | 8 +- modules/juce_osc/osc/juce_OSCTypes.cpp | 8 +- modules/juce_osc/osc/juce_OSCTypes.h | 8 +- .../in_app_purchases/juce_InAppPurchases.cpp | 8 +- .../in_app_purchases/juce_InAppPurchases.h | 20 +- .../juce_product_unlocking.cpp | 8 +- .../juce_product_unlocking.h | 10 +- .../juce_product_unlocking.mm | 8 +- .../marketplace/juce_KeyFileGeneration.h | 8 +- .../marketplace/juce_OnlineUnlockForm.cpp | 8 +- .../marketplace/juce_OnlineUnlockForm.h | 8 +- .../marketplace/juce_OnlineUnlockStatus.cpp | 8 +- .../marketplace/juce_OnlineUnlockStatus.h | 8 +- .../juce_TracktionMarketplaceStatus.cpp | 8 +- .../juce_TracktionMarketplaceStatus.h | 8 +- .../app/com/rmsl/juce/JuceBillingClient.java | 105 +- .../native/juce_android_InAppPurchases.cpp | 411 +- .../native/juce_ios_InAppPurchases.cpp | 8 +- .../juce_video/capture/juce_CameraDevice.cpp | 12 +- .../juce_video/capture/juce_CameraDevice.h | 8 +- modules/juce_video/juce_video.cpp | 8 +- modules/juce_video/juce_video.h | 10 +- modules/juce_video/juce_video.mm | 8 +- .../CameraCaptureSessionCaptureCallback.java | 8 +- .../CameraCaptureSessionStateCallback.java | 8 +- .../rmsl/juce/CameraDeviceStateCallback.java | 8 +- .../juce/JuceOrientationEventListener.java | 8 +- .../rmsl/juce/MediaControllerCallback.java | 8 +- .../com/rmsl/juce/MediaSessionCallback.java | 8 +- .../com/rmsl/juce/SystemVolumeObserver.java | 8 +- .../native/juce_android_CameraDevice.h | 8 +- .../juce_video/native/juce_android_Video.h | 8 +- .../juce_video/native/juce_ios_CameraDevice.h | 11 +- .../juce_video/native/juce_mac_CameraDevice.h | 14 +- modules/juce_video/native/juce_mac_Video.h | 141 +- .../native/juce_win32_CameraDevice.h | 8 +- .../juce_video/native/juce_win32_ComTypes.h | 8 +- modules/juce_video/native/juce_win32_Video.h | 8 +- .../playback/juce_VideoComponent.cpp | 8 +- .../juce_video/playback/juce_VideoComponent.h | 8 +- 2040 files changed, 112267 insertions(+), 47892 deletions(-) delete mode 100644 examples/DemoRunner/Builds/VisualStudio2015/DemoRunner.sln delete mode 100644 examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj delete mode 100644 examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters delete mode 100644 examples/DemoRunner/Builds/VisualStudio2015/icon.ico delete mode 100644 examples/DemoRunner/Builds/VisualStudio2015/resources.rc create mode 100644 examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp create mode 100644 examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp create mode 100644 examples/Plugins/ARAPluginDemo.h create mode 100644 examples/Plugins/HostPluginDemo.h delete mode 100644 examples/Plugins/InterAppAudioEffectPluginDemo.h create mode 100644 extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_ara.cpp create mode 100644 extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp delete mode 100644 extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost.sln delete mode 100644 extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj delete mode 100644 extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters delete mode 100644 extras/AudioPluginHost/Builds/VisualStudio2015/icon.ico delete mode 100644 extras/AudioPluginHost/Builds/VisualStudio2015/resources.rc create mode 100644 extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_ara.cpp create mode 100644 extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp create mode 100644 extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp create mode 100644 extras/AudioPluginHost/Source/Plugins/ARAPlugin.h create mode 100644 extras/Build/CMake/JuceLV2Defines.h.in create mode 100644 extras/Build/CMake/PIPAudioProcessorWithARA.cpp.in create mode 100644 extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_ara.cpp create mode 100644 extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp delete mode 100644 extras/Projucer/Builds/VisualStudio2015/Projucer.sln delete mode 100644 extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj delete mode 100644 extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters delete mode 100644 extras/Projucer/Builds/VisualStudio2015/icon.ico delete mode 100644 extras/Projucer/Builds/VisualStudio2015/resources.rc delete mode 100644 extras/Projucer/Source/BinaryData/Icons/export_clion.svg create mode 100644 extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.cpp create mode 100644 extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.h create mode 100644 extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.cpp create mode 100644 extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.h delete mode 100644 extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h create mode 100644 extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp create mode 100644 extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp create mode 100644 extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_ara.cpp create mode 100644 extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp rename modules/juce_audio_basics/midi/ump/{juce_UMPTests.cpp => juce_UMP_test.cpp} (97%) create mode 100644 modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h create mode 100644 modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp delete mode 100644 modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp create mode 100644 modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp create mode 100644 modules/juce_audio_formats/format/juce_ARAAudioReaders.h create mode 100644 modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.cpp create mode 100644 modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.h create mode 100644 modules/juce_audio_plugin_client/CMakeLists.txt create mode 100644 modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp create mode 100644 modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp delete mode 100644 modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp delete mode 100644 modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp delete mode 100644 modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp delete mode 100644 modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h delete mode 100644 modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm delete mode 100644 modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def delete mode 100644 modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinResources.rsr delete mode 100644 modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp delete mode 100644 modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp rename modules/juce_audio_plugin_client/{juce_audio_plugin_client_RTAS_3.cpp => juce_audio_plugin_client_ARA.cpp} (66%) rename modules/juce_audio_plugin_client/{juce_audio_plugin_client_RTAS_2.cpp => juce_audio_plugin_client_LV2.cpp} (66%) rename modules/juce_audio_plugin_client/{juce_audio_plugin_client_RTAS_4.cpp => juce_audio_plugin_client_LV2.mm} (66%) delete mode 100644 modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r delete mode 100644 modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.cpp delete mode 100644 modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.mm delete mode 100644 modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/README.md create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/generate_lv2_bundle_sources.py create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/COPYING create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/COPYING create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/people.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/manifest.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.meta.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.ttl create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/COPYING create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/.clang-tidy create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/COPYING create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sratom/COPYING create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h create mode 100644 modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c create mode 100644 modules/juce_audio_processors/format_types/juce_ARACommon.cpp create mode 100644 modules/juce_audio_processors/format_types/juce_ARACommon.h create mode 100644 modules/juce_audio_processors/format_types/juce_ARAHosting.cpp create mode 100644 modules/juce_audio_processors/format_types/juce_ARAHosting.h create mode 100644 modules/juce_audio_processors/format_types/juce_LV2Common.h create mode 100644 modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp create mode 100644 modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h create mode 100644 modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp create mode 100644 modules/juce_audio_processors/format_types/juce_LV2Resources.h create mode 100644 modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp create mode 100644 modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp create mode 100644 modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h create mode 100644 modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h create mode 100644 modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h create mode 100644 modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h create mode 100644 modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h create mode 100644 modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h create mode 100644 modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h create mode 100644 modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h create mode 100644 modules/juce_audio_processors/juce_audio_processors_ara.cpp create mode 100644 modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp create mode 100644 modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp create mode 100644 modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h create mode 100644 modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp create mode 100644 modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp create mode 100644 modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h create mode 100644 modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp create mode 100644 modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h create mode 100644 modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp create mode 100644 modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h create mode 100644 modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp create mode 100644 modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h create mode 100644 modules/juce_audio_processors/utilities/juce_FlagCache.h create mode 100644 modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp create mode 100644 modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h create mode 100644 modules/juce_core/containers/juce_ListenerList.cpp create mode 100644 modules/juce_core/containers/juce_Optional.h create mode 100644 modules/juce_core/containers/juce_Optional_test.cpp create mode 100644 modules/juce_core/files/juce_AndroidDocument.h rename modules/{juce_gui_basics/native => juce_core/files}/juce_common_MimeTypes.cpp (94%) rename modules/{juce_audio_plugin_client/juce_audio_plugin_client_RTAS_1.cpp => juce_core/files/juce_common_MimeTypes.h} (73%) create mode 100644 modules/juce_core/native/juce_android_AndroidDocument.cpp create mode 100644 modules/juce_events/native/juce_linux_EventLoopInternal.h create mode 100644 modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp create mode 100644 modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h delete mode 100644 modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h diff --git a/BREAKING-CHANGES.txt b/BREAKING-CHANGES.txt index 29aa4155..90568f22 100644 --- a/BREAKING-CHANGES.txt +++ b/BREAKING-CHANGES.txt @@ -1,6 +1,141 @@ JUCE breaking changes ===================== +Version 7.0.0 +============= + +Change +------ +AudioProcessor::getHostTimeNs() and AudioProcessor::setHostTimeNanos() have +been removed. + +Possible Issues +--------------- +Code that used these functions will no longer compile. + +Workaround +---------- +Set and get the system time corresponding to the current audio callback using +the new functions AudioPlayHead::PositionInfo::getHostTimeNs() and +AudioPlayHead::PositionInfo::setHostTimeNs(). + +Rationale +--------- +This change consolidates callback-related timing information into the +PositionInfo type, improving the consistency of the AudioProcessor and +AudioPlayHead APIs. + + +Change +------ +AudioPlayHead::getCurrentPosition() has been deprecated and replaced with +AudioPlayHead::getPosition(). + +Possible Issues +--------------- +Hosts that implemented custom playhead types may no longer compile. Plugins +that used host-provided timing information may trigger deprecation warnings +when building. + +Workaround +---------- +Classes that derive from AudioPlayHead must now override getPosition() instead +of getCurrentPosition(). Code that used to use the playhead's +CurrentPositionInfo must switch to using the new PositionInfo type. + +Rationale +--------- +Not all hosts and plugin formats are capable of providing the full complement +of timing information contained in the old CurrentPositionInfo class. +Previously, in the case that some information could not be provided, fallback +values would be used instead, but it was not possible for clients to distinguish +between "real" values set explicitly by the host, and "fallback" values set by +a plugin wrapper. The new PositionInfo type keeps track of which members have +been explicitly set, so clients can implement their own fallback behaviour. +The new PositionInfo type also includes a new "barCount" member, which is +currently only used by the LV2 host and client. + + +Change +------ +The optional JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS preprocessor +flag will now use a new Metal layer renderer when running on macOS 10.14 or +later. The minimum requirements for building macOS and iOS software are now +macOS 10.13.6 and Xcode 10.1. + +Possible Issues +--------------- +Previously enabling JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS had no +negative effect on performance. Now it may slow rendering down. + +Workaround +---------- +Disable JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS. + +Rationale +--------- +JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS has been ineffective when +running on macOS 10.13 or later. Enabling this flag, and hence using the new +Metal layer renderer when running on macOS 10.14, restores the previous +behaviour and fixes problems where Core Graphics will render much larger +regions than necessary. However, the new renderer will may be slower than the +recently introduced default of asynchronous Core Graphics rendering, depending +on the regions that Core Graphcis is redrawing. Whether +JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS improves or degrades +performance is specific to an application. + + +Change +------ +The optional JUCE_COREGRAPHICS_DRAW_ASYNC preprocessor flag has been removed +and asynchronous Core Graphics rendering is now the default. The helper +function setComponentAsyncLayerBackedViewDisabled has also been removed. + +Possible Issues +--------------- +Components that were previously using setComponentAsyncLayerBackedViewDisabled +to conditionally opt out of asynchronous Core Graphics rendering will no longer +be able to do so. + +Workaround +---------- +To opt out of asynchronous Core Graphics rendering the +windowRequiresSynchronousCoreGraphicsRendering ComponentPeer style flag can be +used when adding a component to the desktop. + +Rationale +--------- +Asynchronous Core Graphics rendering provides a substantial performance +benefit. Asynchronous rendering is a property of a Peer, rather than a +Component, so a Peer style flag to conditionally opt out of asynchronous +rendering is more appropriate. + + +Change +------ +Constructors of AudioParameterBool, AudioParameterChoice, AudioParameterFloat, +AudioParameterInt, and AudioProcessorParameterWithID have been deprecated and +replaced with new constructors taking an 'Attributes' argument. + +Possible Issues +--------------- +The compiler may issue a deprecation warning upon encountering usages of the +old constructors. + +Workaround +---------- +Update code to pass an 'Attributes' instance instead. Example usages of the new +constructors are given in the constructor documentation, and in the plugin +example projects. + +Rationale +--------- +Parameter types have many different properties. Setting a non-default property +using the old constructors required explicitly setting other normally-defaulted +properties, which was redundant. The new Attributes types allow non-default +properties to be set in isolation. + + Version 6.1.6 ============= diff --git a/CMakeLists.txt b/CMakeLists.txt index f9c8f408..3f5d2a12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -23,7 +23,7 @@ cmake_minimum_required(VERSION 3.15) -project(JUCE VERSION 6.1.6 LANGUAGES C CXX) +project(JUCE VERSION 7.0.0 LANGUAGES C CXX) include(CMakeDependentOption) @@ -62,7 +62,7 @@ include(extras/Build/CMake/JUCEUtils.cmake) set_directory_properties(PROPERTIES JUCE_COMPANY_NAME "JUCE" - JUCE_COMPANY_WEBSITE "juce.com" + JUCE_COMPANY_WEBSITE "https://juce.com" JUCE_COMPANY_EMAIL "info@juce.com" JUCE_COMPANY_COPYRIGHT "Copyright (c) 2020 - Raw Material Software Limited") @@ -76,10 +76,11 @@ juce_disable_default_flags() add_subdirectory(extras/Build) -# If you want to build the JUCE examples with VST2/AAX support, you'll need to make the VST2/AAX -# headers visible to the juce_audio_processors module. You can either set the paths on the command -# line, (e.g. -DJUCE_GLOBAL_AAX_SDK_PATH=/path/to/sdk) if you're just building the JUCE examples, or -# you can call the `juce_set_*_sdk_path` functions in your own CMakeLists after importing JUCE. +# If you want to build the JUCE examples with VST2/AAX/ARA support, you'll need to make the +# VST2/AAX/ARA headers visible to the juce_audio_processors module. You can either set the paths on +# the command line, (e.g. -DJUCE_GLOBAL_AAX_SDK_PATH=/path/to/sdk) if you're just building the JUCE +# examples, or you can call the `juce_set_*_sdk_path` functions in your own CMakeLists after +# importing JUCE. if(JUCE_GLOBAL_AAX_SDK_PATH) juce_set_aax_sdk_path("${JUCE_GLOBAL_AAX_SDK_PATH}") @@ -89,6 +90,13 @@ if(JUCE_GLOBAL_VST2_SDK_PATH) juce_set_vst2_sdk_path("${JUCE_GLOBAL_VST2_SDK_PATH}") endif() +# The ARA_SDK path should point to the "Umbrella installer" ARA_SDK directory. +# The directory can be obtained by recursively cloning https://github.com/Celemony/ARA_SDK and +# checking out the tag releases/2.1.0. +if(JUCE_GLOBAL_ARA_SDK_PATH) + juce_set_ara_sdk_path("${JUCE_GLOBAL_ARA_SDK_PATH}") +endif() + # We don't build anything other than the juceaide by default, because we want to keep configuration # speedy and the number of targets low. If you want to add targets for the extra projects and # example PIPs (there's a lot of them!), specify -DJUCE_BUILD_EXAMPLES=ON and/or @@ -145,8 +153,10 @@ install(FILES "${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake" "${JUCE_CMAKE_UTILS_DIR}/JUCEHelperTargets.cmake" "${JUCE_CMAKE_UTILS_DIR}/JUCEModuleSupport.cmake" "${JUCE_CMAKE_UTILS_DIR}/JUCEUtils.cmake" + "${JUCE_CMAKE_UTILS_DIR}/JuceLV2Defines.h.in" "${JUCE_CMAKE_UTILS_DIR}/LaunchScreen.storyboard" "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessor.cpp.in" + "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessorWithARA.cpp.in" "${JUCE_CMAKE_UTILS_DIR}/PIPComponent.cpp.in" "${JUCE_CMAKE_UTILS_DIR}/PIPConsole.cpp.in" "${JUCE_CMAKE_UTILS_DIR}/RecentFilesMenuTemplate.nib" @@ -155,3 +165,5 @@ install(FILES "${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake" "${JUCE_CMAKE_UTILS_DIR}/copyDir.cmake" "${JUCE_CMAKE_UTILS_DIR}/juce_runtime_arch_detection.cpp" DESTINATION "${JUCE_INSTALL_DESTINATION}") + +install(EXPORT LV2_HELPER NAMESPACE juce:: DESTINATION "${JUCE_INSTALL_DESTINATION}") diff --git a/ChangeList.txt b/ChangeList.txt index b664abe7..254b2342 100644 --- a/ChangeList.txt +++ b/ChangeList.txt @@ -3,6 +3,16 @@ This file just lists the more notable headline features. For more detailed info about changes and bugfixes please see the git log and BREAKING-CHANGES.txt. +Version 7.0.0 + - Added Audio Random Access (ARA) SDK support + - Added support for authoring and hosting LV2 plug-ins + - Added a default renderer for macOS and iOS + - Added new macOS and iOS rendering options + - Added hardware synchronised drawing on Windows, macOS and iOS + - Updated the Android billing and file access APIs + - Revamped AudioPlayHead functionality + - Improved accessibility support + Version 6.1.6 - Improved the handling of AU multichannel layouts - Added JUCE_NODISCARD to builder-patten functions diff --git a/LICENSE.md b/LICENSE.md index 75e59b30..9cf15481 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,7 +1,7 @@ # The JUCE Library **BY DOWNLOADING, INSTALLING OR USING ANY PART OF THE JUCE LIBRARY, YOU AGREE -TO THE [JUCE 6 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-6-licence) +TO THE [JUCE 7 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-7-licence) AND THE [JUCE PRIVACY POLICY](https://www.juce.com/juce-privacy-policy), WHICH ARE BINDING AGREEMENTS BETWEEN YOU AND RAW MATERIAL SOFTWARE LIMITED. IF YOU DO NOT AGREE TO THE TERMS, DO NOT USE THE JUCE LIBRARY.** @@ -14,7 +14,7 @@ and JUCE Educational (no Revenue Limit; free for bona fide educational institutions). All licenses allow you to commercially release applications as long as you do not exceed the Revenue Limit and pay the applicable Fees. Once your business hits the Revenue Limit for your JUCE license tier, to continue -distributing your Applications you will either have to upgrade your JUCE +distributing your Applications you will either have to upgrade your JUCE license, or instead release your Applications under the [GNU General Public License v.3](https://www.gnu.org/licenses/gpl-3.0.en.html), which means, amongst other things, that you must make the source code of your @@ -32,5 +32,6 @@ For more information, visit the website: [www.juce.com](https://www.juce.com) FULL JUCE TERMS: -- [JUCE 6 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-6-licence) +- [JUCE 7 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-7-licence) - [JUCE PRIVACY POLICY](https://www.juce.com/juce-privacy-policy) + diff --git a/README.md b/README.md index 0f0eaa83..744b78eb 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![alt text](https://assets.juce.com/juce/JUCE_banner_github.png "JUCE") JUCE is an open-source cross-platform C++ application framework for creating high quality -desktop and mobile applications, including VST, VST3, AU, AUv3, RTAS and AAX audio plug-ins. +desktop and mobile applications, including VST, VST3, AU, AUv3 and AAX audio plug-ins. JUCE can be easily integrated with existing projects via CMake, or can be used as a project generation tool via the [Projucer](https://juce.com/discover/projucer), which supports exporting projects for Xcode (macOS and iOS), Visual Studio, Android Studio, Code::Blocks @@ -56,7 +56,7 @@ of the target you wish to build. #### Building JUCE Projects -- __macOS/iOS__: Xcode 9.2 (macOS 10.12.6) +- __macOS/iOS__: Xcode 10.1 (macOS 10.13.6) - __Windows__: Windows 8.1 and Visual Studio 2015 Update 3 64-bit - __Linux__: g++ 5.0 or Clang 3.4 (for a full list of dependencies, see [here](/docs/Linux%20Dependencies.md)). diff --git a/docs/CMake API.md b/docs/CMake API.md index c1e90ae1..f03752b6 100644 --- a/docs/CMake API.md +++ b/docs/CMake API.md @@ -599,6 +599,40 @@ attributes directly to these creation functions, rather than adding them later. Unlike the other `COPY_DIR` arguments, this argument does not have a default value so be sure to set it if you have enabled `COPY_PLUGIN_AFTER_BUILD` and the `Unity` format. +`IS_ARA_EFFECT` +- May be either TRUE or FALSE (defaults to FALSE). If TRUE it enables additional codepaths in the + VST3 and AU plugin wrappers allowing compatible hosts to load the plugin with additional ARA + functionality. It will also add the preprocessor definition `JucePlugin_Enable_ARA=1`, which can + be used in preprocessor conditions inside the plugin code. You should not add this definition + using `target_compile_definitions` manually. + +`ARA_FACTORY_ID` +- A globally unique and versioned identifier string. If not provided a sensible default will be + generated using the `BUNDLE_ID` and `VERSION` values. The version must be updated if e.g. the + plugin's (compatible) document archive ID(s) or its analysis or playback transformation + capabilities change. + +`ARA_DOCUMENT_ARCHIVE_ID` +- Identifier string for document archives created by the document controller. This ID must be + globally unique and is shared only amongst document controllers that create the same archives and + produce the same render results based upon the same input data. This means that the ID must be + updated if the archive format changes in any way that is no longer downwards compatible. If not + provided a version independent default will be created that is only appropriate as long as the + format remains unchanged. + +`ARA_ANALYSIS_TYPES` +- Defaults to having no analyzable types. Should be one or more of the following values if the + document controller has the corresponding analysis capability: `kARAContentTypeNotes`, + `kARAContentTypeTempoEntries`, `kARAContentTypeBarSignatures`, `kARAContentTypeStaticTuning `, + `kARAContentTypeKeySignatures`, `kARAContentTypeSheetChords` + +`ARA_TRANSFORMATION_FLAGS` +- Defaults to `kARAPlaybackTransformationNoChanges`. If the document controller has the ability to + provide the corresponding change it should be one or more of: + `kARAPlaybackTransformationTimestretch`, `kARAPlaybackTransformationTimestretchReflectingTempo`, + `kARAPlaybackTransformationContentBasedFadeAtTail`, + `kARAPlaybackTransformationContentBasedFadeAtHead` + #### `juce_add_binary_data` juce_add_binary_data( @@ -664,10 +698,11 @@ target!). juce_set_aax_sdk_path() juce_set_vst2_sdk_path() juce_set_vst3_sdk_path() + juce_set_ara_sdk_path() -Call these functions from your CMakeLists to set up your local AAX, VST2, and VST3 SDKs. These -functions should be called *before* adding any targets that may depend on the AAX/VST2/VST3 SDKs -(plugin hosts, AAX/VST2/VST3 plugins etc.). +Call these functions from your CMakeLists to set up your local AAX, VST2, VST3 and ARA SDKs. These +functions should be called *before* adding any targets that may depend on the AAX/VST2/VST3/ARA SDKs +(plugin hosts, AAX/VST2/VST3/ARA plugins etc.). #### `juce_add_module` diff --git a/docs/JUCE Module Format.md b/docs/JUCE Module Format.md index 60bacd4e..c114b302 100644 --- a/docs/JUCE Module Format.md +++ b/docs/JUCE Module Format.md @@ -185,11 +185,18 @@ Possible values: parent folder, which need to be added to a project's header search path - OSXFrameworks - - (Optional) A list (space or comma-separated) of OSX frameworks that are needed + - (Optional) A list (space or comma-separated) of OSX frameworks that are needed by this module + +- WeakOSXFrameworks + - (Optional) A list (space or comma-separated) of weak linked OSX frameworks that are needed by this module - iOSFrameworks - - (Optional) Like OSXFrameworks, but for iOS targets + - (Optional) A list (space or comma-separated) of iOS frameworks that are needed by this module + +- WeakiOSFrameworks + - (Optional) A list (space or comma-separated) of weak linked iOS frameworks that are needed + by this module - linuxPackages - (Optional) A list (space or comma-separated) pkg-config packages that should be used to pass diff --git a/examples/Assets/AudioLiveScrollingDisplay.h b/examples/Assets/AudioLiveScrollingDisplay.h index 463dfc85..dc75464e 100644 --- a/examples/Assets/AudioLiveScrollingDisplay.h +++ b/examples/Assets/AudioLiveScrollingDisplay.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff --git a/examples/Assets/DSPDemos_Common.h b/examples/Assets/DSPDemos_Common.h index 07a2bd7c..49ccc278 100644 --- a/examples/Assets/DSPDemos_Common.h +++ b/examples/Assets/DSPDemos_Common.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff --git a/examples/Assets/DemoUtilities.h b/examples/Assets/DemoUtilities.h index 73ac930a..bfc1c5d2 100644 --- a/examples/Assets/DemoUtilities.h +++ b/examples/Assets/DemoUtilities.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff --git a/examples/Assets/WavefrontObjParser.h b/examples/Assets/WavefrontObjParser.h index 396c9c7a..01f51770 100644 --- a/examples/Assets/WavefrontObjParser.h +++ b/examples/Assets/WavefrontObjParser.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff --git a/examples/Audio/AudioAppDemo.h b/examples/Audio/AudioAppDemo.h index 17dfcb22..933edb53 100644 --- a/examples/Audio/AudioAppDemo.h +++ b/examples/Audio/AudioAppDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Audio/AudioLatencyDemo.h b/examples/Audio/AudioLatencyDemo.h index 8e7e4e7c..171accb4 100644 --- a/examples/Audio/AudioLatencyDemo.h +++ b/examples/Audio/AudioLatencyDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Audio/AudioPlaybackDemo.h b/examples/Audio/AudioPlaybackDemo.h index e62dc93c..b3745609 100644 --- a/examples/Audio/AudioPlaybackDemo.h +++ b/examples/Audio/AudioPlaybackDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone type: Component mainClass: AudioPlaybackDemo diff --git a/examples/Audio/AudioRecordingDemo.h b/examples/Audio/AudioRecordingDemo.h index e04db4b3..6bfa622e 100644 --- a/examples/Audio/AudioRecordingDemo.h +++ b/examples/Audio/AudioRecordingDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Audio/AudioSettingsDemo.h b/examples/Audio/AudioSettingsDemo.h index 8c587b92..6865a086 100644 --- a/examples/Audio/AudioSettingsDemo.h +++ b/examples/Audio/AudioSettingsDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Audio/AudioSynthesiserDemo.h b/examples/Audio/AudioSynthesiserDemo.h index 30040997..11891911 100644 --- a/examples/Audio/AudioSynthesiserDemo.h +++ b/examples/Audio/AudioSynthesiserDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Audio/CMakeLists.txt b/examples/Audio/CMakeLists.txt index 272e8475..dc6880ef 100644 --- a/examples/Audio/CMakeLists.txt +++ b/examples/Audio/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/Audio/MPEDemo.h b/examples/Audio/MPEDemo.h index 9305d465..35a51c4b 100644 --- a/examples/Audio/MPEDemo.h +++ b/examples/Audio/MPEDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Audio/MidiDemo.h b/examples/Audio/MidiDemo.h index 5581d1f2..b5e732e9 100644 --- a/examples/Audio/MidiDemo.h +++ b/examples/Audio/MidiDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Audio/PluckedStringsDemo.h b/examples/Audio/PluckedStringsDemo.h index 11ec4c1f..e6d5e092 100644 --- a/examples/Audio/PluckedStringsDemo.h +++ b/examples/Audio/PluckedStringsDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Audio/SimpleFFTDemo.h b/examples/Audio/SimpleFFTDemo.h index fdc4c256..9fef62ca 100644 --- a/examples/Audio/SimpleFFTDemo.h +++ b/examples/Audio/SimpleFFTDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/CMake/CMakeLists.txt b/examples/CMake/CMakeLists.txt index c9aabdc3..ba52b811 100644 --- a/examples/CMake/CMakeLists.txt +++ b/examples/CMake/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 42115cf7..51f433f0 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -41,6 +41,12 @@ function(_juce_add_pips) "${CMAKE_CURRENT_SOURCE_DIR}/PushNotificationsDemo.h") endif() + if(NOT (TARGET juce_ara_sdk + AND (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR CMAKE_SYSTEM_NAME STREQUAL "Darwin"))) + list(REMOVE_ITEM headers + "${CMAKE_CURRENT_SOURCE_DIR}/ARAPluginDemo.h") + endif() + foreach(header IN ITEMS ${headers}) juce_add_pip(${header} added_target) target_link_libraries(${added_target} PUBLIC diff --git a/examples/DSP/CMakeLists.txt b/examples/DSP/CMakeLists.txt index 272e8475..dc6880ef 100644 --- a/examples/DSP/CMakeLists.txt +++ b/examples/DSP/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/DSP/ConvolutionDemo.h b/examples/DSP/ConvolutionDemo.h index 5aa84409..dbcf63ea 100644 --- a/examples/DSP/ConvolutionDemo.h +++ b/examples/DSP/ConvolutionDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/DSP/FIRFilterDemo.h b/examples/DSP/FIRFilterDemo.h index fbe1e117..a0fa4148 100644 --- a/examples/DSP/FIRFilterDemo.h +++ b/examples/DSP/FIRFilterDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/DSP/GainDemo.h b/examples/DSP/GainDemo.h index fec0b5c9..4c59c240 100644 --- a/examples/DSP/GainDemo.h +++ b/examples/DSP/GainDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/DSP/IIRFilterDemo.h b/examples/DSP/IIRFilterDemo.h index 3e20ba94..b12f0e70 100644 --- a/examples/DSP/IIRFilterDemo.h +++ b/examples/DSP/IIRFilterDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/DSP/OscillatorDemo.h b/examples/DSP/OscillatorDemo.h index 9c6be00c..131b6d24 100644 --- a/examples/DSP/OscillatorDemo.h +++ b/examples/DSP/OscillatorDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/DSP/OverdriveDemo.h b/examples/DSP/OverdriveDemo.h index c2f039aa..c00f700e 100644 --- a/examples/DSP/OverdriveDemo.h +++ b/examples/DSP/OverdriveDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/DSP/SIMDRegisterDemo.h b/examples/DSP/SIMDRegisterDemo.h index 02755c89..f1ba7cde 100644 --- a/examples/DSP/SIMDRegisterDemo.h +++ b/examples/DSP/SIMDRegisterDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/DSP/StateVariableFilterDemo.h b/examples/DSP/StateVariableFilterDemo.h index db40e304..e9b97b54 100644 --- a/examples/DSP/StateVariableFilterDemo.h +++ b/examples/DSP/StateVariableFilterDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/DSP/WaveShaperTanhDemo.h b/examples/DSP/WaveShaperTanhDemo.h index 5f5df793..9f512e14 100644 --- a/examples/DSP/WaveShaperTanhDemo.h +++ b/examples/DSP/WaveShaperTanhDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt index 01cc0b28..e677784a 100644 --- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt +++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt @@ -12,9 +12,18 @@ add_subdirectory (${OBOE_DIR} ./oboe) add_library("cpufeatures" STATIC "${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c") set_source_files_properties("${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c" PROPERTIES COMPILE_FLAGS "-Wno-sign-conversion -Wno-gnu-statement-expression") -add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_CONTENT_SHARING=1]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.6]] [[-DJUCE_APP_VERSION_HEX=0x60106]]) +add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_CONTENT_SHARING=1]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.0]] [[-DJUCE_APP_VERSION_HEX=0x70000]]) include_directories( AFTER + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK" "../../../JuceLibraryCode" "../../../../../modules" "${ANDROID_NDK}/sources/android/cpufeatures" @@ -23,9 +32,9 @@ include_directories( AFTER enable_language(ASM) if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60106]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.6]] [[-DJUCE_APP_VERSION_HEX=0x60106]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.0]] [[-DJUCE_APP_VERSION_HEX=0x70000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60106]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.6]] [[-DJUCE_APP_VERSION_HEX=0x60106]] [[-DNDEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.0]] [[-DJUCE_APP_VERSION_HEX=0x70000]] [[-DNDEBUG=1]]) else() message( FATAL_ERROR "No matching build-configuration found." ) endif() @@ -66,6 +75,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" @@ -80,7 +90,6 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" - "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" @@ -117,6 +126,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" + "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h" "../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" @@ -159,9 +169,9 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp" "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" - "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" @@ -455,6 +465,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.h" "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" @@ -479,6 +491,116 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" @@ -576,16 +698,27 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.h" "../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" "../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" "../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" "../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" @@ -614,6 +747,17 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h" "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" @@ -627,6 +771,9 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" "../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" @@ -637,6 +784,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" @@ -784,9 +933,12 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/containers/juce_HashMap.h" "../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" "../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" + "../../../../../modules/juce_core/containers/juce_ListenerList.cpp" "../../../../../modules/juce_core/containers/juce_ListenerList.h" "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" "../../../../../modules/juce_core/containers/juce_NamedValueSet.h" + "../../../../../modules/juce_core/containers/juce_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.h" "../../../../../modules/juce_core/containers/juce_PropertySet.cpp" @@ -800,6 +952,9 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/containers/juce_SparseSet.h" "../../../../../modules/juce_core/containers/juce_Variant.cpp" "../../../../../modules/juce_core/containers/juce_Variant.h" + "../../../../../modules/juce_core/files/juce_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.h" "../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" "../../../../../modules/juce_core/files/juce_DirectoryIterator.h" "../../../../../modules/juce_core/files/juce_File.cpp" @@ -866,6 +1021,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/misc/juce_Uuid.h" "../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" "../../../../../modules/juce_core/native/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" "../../../../../modules/juce_core/native/juce_android_Files.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" @@ -1177,6 +1333,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_events/native/juce_android_Messaging.cpp" "../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" "../../../../../modules/juce_events/native/juce_linux_EventLoop.h" + "../../../../../modules/juce_events/native/juce_linux_EventLoopInternal.h" "../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" "../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" "../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" @@ -1559,6 +1716,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" "../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" @@ -1590,13 +1748,13 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" "../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" "../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" - "../../../../../modules/juce_gui_basics/native/juce_common_MimeTypes.cpp" "../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" "../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" "../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" "../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" "../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" "../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" "../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" "../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" "../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" @@ -1739,7 +1897,6 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" "../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" "../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" - "../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" "../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" @@ -1842,6 +1999,8 @@ add_library( ${BINARY_NAME} "../../../JuceLibraryCode/include_juce_audio_devices.cpp" "../../../JuceLibraryCode/include_juce_audio_formats.cpp" "../../../JuceLibraryCode/include_juce_audio_processors.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_ara.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp" "../../../JuceLibraryCode/include_juce_audio_utils.cpp" "../../../JuceLibraryCode/include_juce_box2d.cpp" "../../../JuceLibraryCode/include_juce_core.cpp" @@ -1859,1813 +2018,1963 @@ add_library( ${BINARY_NAME} "../../../JuceLibraryCode/JuceHeader.h" ) -set_source_files_properties("../../../Source/Demos/IntroScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/Demos/JUCEDemos.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/UI/DemoContentComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/UI/MainComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/UI/SettingsContent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/JUCEAppIcon.png" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/analytics/juce_Analytics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/analytics/juce_Analytics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/analytics/juce_ButtonTracker.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/analytics/juce_ButtonTracker.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/destinations/juce_AnalyticsDestination.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/juce_analytics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_analytics/juce_analytics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Bela.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/assert.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/callback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/compat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/export.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterfunctionname.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2ChainShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2ChainShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2CircleShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2CircleShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2EdgeShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2EdgeShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2PolygonShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2PolygonShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2Shape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2BroadPhase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2BroadPhase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2CollideCircle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2CollideEdge.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2CollidePolygon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2Collision.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2Collision.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2Distance.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2Distance.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2DynamicTree.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2DynamicTree.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2TimeOfImpact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Collision/b2TimeOfImpact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2BlockAllocator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2BlockAllocator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Draw.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Draw.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2GrowableStack.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Math.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Math.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Settings.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Settings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2StackAllocator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2StackAllocator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Timer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Common/b2Timer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndCircleContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndCircleContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndPolygonContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndPolygonContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2CircleContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2CircleContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2Contact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2Contact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ContactSolver.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ContactSolver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndCircleContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndCircleContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndPolygonContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonAndCircleContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonAndCircleContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonContact.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonContact.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2DistanceJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2DistanceJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2FrictionJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2FrictionJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2GearJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2GearJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2Joint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2Joint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2MouseJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2MouseJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2PrismaticJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2PrismaticJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2PulleyJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2PulleyJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2RevoluteJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2RevoluteJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2RopeJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2RopeJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2WeldJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2WeldJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2WheelJoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2WheelJoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2Body.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2Body.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2ContactManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2ContactManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2Fixture.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2Fixture.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2Island.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2Island.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2TimeStep.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2World.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2World.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2WorldCallbacks.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Dynamics/b2WorldCallbacks.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Rope/b2Rope.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Rope/b2Rope.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/Box2D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/box2d/README.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/utils/juce_Box2DRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/utils/juce_Box2DRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/juce_box2d.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_box2d/juce_box2d.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_MathsFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_NormalisableRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Range.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Atomic.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Reservoir.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Functional.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/java/README.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Misc.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_curl_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_intel_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_CFHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Files.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Network.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Strings.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Registry.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerSupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerWarnings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_PlatformDefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_StandardHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_TargetPlatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_NewLine.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringRef.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_CriticalSection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_DynamicLibrary.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_InterProcessLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Process.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedReadLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_SpinLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTestCategories.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/adler32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/compress.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/infback.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/uncompr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.in.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zlib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_BlowFish.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_BlowFish.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_Primes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_Primes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_RSAKey.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_RSAKey.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_MD5.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_MD5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_SHA256.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_SHA256.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_AudioBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_AudioBlock_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister_Impl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Windowing.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_FastMathApproximations.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LogRampedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LogRampedValue_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LookupTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LookupTable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Phase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Polynomial.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DelayLine.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DelayLine.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DryWetMixer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DryWetMixer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter_Impl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Panner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Panner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Bias.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Chorus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Chorus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Compressor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Compressor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Gain.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_LadderFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_LadderFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Limiter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Limiter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_NoiseGate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_NoiseGate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Oscillator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Phaser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Phaser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_WaveShaper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Initialisation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Message.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_NotificationType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_android_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_EventLoop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_PixelFormats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_BorderSize.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Line.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Parallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Point.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ScaledImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_Justification.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_common_MimeTypes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_MessageBoxOptions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_HWNDComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Draggable3DOrientation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Matrix3D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Quaternion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Vector3D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_android.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_ios.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_linux_X11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_osx.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_win32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGLExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gl.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gles2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gles2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_khrplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_wgl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCArgument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCArgument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCBundle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCBundle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCMessage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCReceiver.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCSender.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCSender.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTimeTag.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTimeTag.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTypes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/juce_osc.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/juce_osc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_KeyFileGeneration.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/juce_product_unlocking.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/juce_product_unlocking.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_product_unlocking/juce_product_unlocking.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_android_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_android_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_ios_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_win32_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_win32_ComTypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/native/juce_win32_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/playback/juce_VideoComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/playback/juce_VideoComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/juce_video.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/juce_video.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_video/juce_video.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../JuceLibraryCode/JuceHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties( + "../../../Source/Demos/IntroScreen.h" + "../../../Source/Demos/JUCEDemos.h" + "../../../Source/UI/DemoContentComponent.h" + "../../../Source/UI/MainComponent.h" + "../../../Source/UI/SettingsContent.h" + "../../../Source/JUCEAppIcon.png" + "../../../../../modules/juce_analytics/analytics/juce_Analytics.cpp" + "../../../../../modules/juce_analytics/analytics/juce_Analytics.h" + "../../../../../modules/juce_analytics/analytics/juce_ButtonTracker.cpp" + "../../../../../modules/juce_analytics/analytics/juce_ButtonTracker.h" + "../../../../../modules/juce_analytics/destinations/juce_AnalyticsDestination.h" + "../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp" + "../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h" + "../../../../../modules/juce_analytics/juce_analytics.cpp" + "../../../../../modules/juce_analytics/juce_analytics.h" + "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" + "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiFile.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiFile.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPENote.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPENote.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" + "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" + "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h" + "../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h" + "../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" + "../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" + "../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" + "../../../../../modules/juce_audio_basics/utilities/juce_ADSR_test.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" + "../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" + "../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" + "../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" + "../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.mm" + "../../../../../modules/juce_audio_basics/juce_audio_basics.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" + "../../../../../modules/juce_audio_devices/native/oboe/README.md" + "../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" + "../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp" + "../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_ios_Audio.h" + "../../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp" + "../../../../../modules/juce_audio_devices/native/juce_linux_Bela.cpp" + "../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" + "../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" + "../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" + "../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" + "../../../../../modules/juce_audio_devices/native/juce_win32_Midi.cpp" + "../../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp" + "../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp" + "../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h" + "../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp" + "../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h" + "../../../../../modules/juce_audio_devices/juce_audio_devices.cpp" + "../../../../../modules/juce_audio_devices/juce_audio_devices.mm" + "../../../../../modules/juce_audio_devices/juce_audio_devices.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/assert.h" + "../../../../../modules/juce_audio_formats/codecs/flac/callback.h" + "../../../../../modules/juce_audio_formats/codecs/flac/compat.h" + "../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" + "../../../../../modules/juce_audio_formats/codecs/flac/export.h" + "../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/flac/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h" + "../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.h" + "../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp" + "../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h" + "../../../../../modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h" + "../../../../../modules/juce_audio_formats/sampler/juce_Sampler.cpp" + "../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" + "../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" + "../../../../../modules/juce_audio_formats/juce_audio_formats.mm" + "../../../../../modules/juce_audio_formats/juce_audio_formats.h" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterfunctionname.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.h" + "../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" + "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" + "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" + "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" + "../../../../../modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h" + "../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.h" + "../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp" + "../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" + "../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" + "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.h" + "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" + "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" + "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" + "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" + "../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" + "../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" + "../../../../../modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm" + "../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm" + "../../../../../modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm" + "../../../../../modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp" + "../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp" + "../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h" + "../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.cpp" + "../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.h" + "../../../../../modules/juce_audio_utils/juce_audio_utils.cpp" + "../../../../../modules/juce_audio_utils/juce_audio_utils.mm" + "../../../../../modules/juce_audio_utils/juce_audio_utils.h" + "../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2ChainShape.cpp" + "../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2ChainShape.h" + "../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2CircleShape.cpp" + "../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2CircleShape.h" + "../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2EdgeShape.cpp" + "../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2EdgeShape.h" + "../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2PolygonShape.cpp" + "../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2PolygonShape.h" + "../../../../../modules/juce_box2d/box2d/Collision/Shapes/b2Shape.h" + "../../../../../modules/juce_box2d/box2d/Collision/b2BroadPhase.cpp" + "../../../../../modules/juce_box2d/box2d/Collision/b2BroadPhase.h" + "../../../../../modules/juce_box2d/box2d/Collision/b2CollideCircle.cpp" + "../../../../../modules/juce_box2d/box2d/Collision/b2CollideEdge.cpp" + "../../../../../modules/juce_box2d/box2d/Collision/b2CollidePolygon.cpp" + "../../../../../modules/juce_box2d/box2d/Collision/b2Collision.cpp" + "../../../../../modules/juce_box2d/box2d/Collision/b2Collision.h" + "../../../../../modules/juce_box2d/box2d/Collision/b2Distance.cpp" + "../../../../../modules/juce_box2d/box2d/Collision/b2Distance.h" + "../../../../../modules/juce_box2d/box2d/Collision/b2DynamicTree.cpp" + "../../../../../modules/juce_box2d/box2d/Collision/b2DynamicTree.h" + "../../../../../modules/juce_box2d/box2d/Collision/b2TimeOfImpact.cpp" + "../../../../../modules/juce_box2d/box2d/Collision/b2TimeOfImpact.h" + "../../../../../modules/juce_box2d/box2d/Common/b2BlockAllocator.cpp" + "../../../../../modules/juce_box2d/box2d/Common/b2BlockAllocator.h" + "../../../../../modules/juce_box2d/box2d/Common/b2Draw.cpp" + "../../../../../modules/juce_box2d/box2d/Common/b2Draw.h" + "../../../../../modules/juce_box2d/box2d/Common/b2GrowableStack.h" + "../../../../../modules/juce_box2d/box2d/Common/b2Math.cpp" + "../../../../../modules/juce_box2d/box2d/Common/b2Math.h" + "../../../../../modules/juce_box2d/box2d/Common/b2Settings.cpp" + "../../../../../modules/juce_box2d/box2d/Common/b2Settings.h" + "../../../../../modules/juce_box2d/box2d/Common/b2StackAllocator.cpp" + "../../../../../modules/juce_box2d/box2d/Common/b2StackAllocator.h" + "../../../../../modules/juce_box2d/box2d/Common/b2Timer.cpp" + "../../../../../modules/juce_box2d/box2d/Common/b2Timer.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndCircleContact.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndCircleContact.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndPolygonContact.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndPolygonContact.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2CircleContact.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2CircleContact.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2Contact.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2Contact.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ContactSolver.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2ContactSolver.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndCircleContact.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndCircleContact.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndPolygonContact.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonAndCircleContact.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonAndCircleContact.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonContact.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonContact.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2DistanceJoint.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2DistanceJoint.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2FrictionJoint.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2FrictionJoint.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2GearJoint.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2GearJoint.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2Joint.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2Joint.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2MouseJoint.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2MouseJoint.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2PrismaticJoint.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2PrismaticJoint.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2PulleyJoint.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2PulleyJoint.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2RevoluteJoint.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2RevoluteJoint.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2RopeJoint.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2RopeJoint.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2WeldJoint.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2WeldJoint.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2WheelJoint.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/Joints/b2WheelJoint.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/b2Body.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/b2Body.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/b2ContactManager.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/b2ContactManager.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/b2Fixture.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/b2Fixture.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/b2Island.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/b2Island.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/b2TimeStep.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/b2World.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/b2World.h" + "../../../../../modules/juce_box2d/box2d/Dynamics/b2WorldCallbacks.cpp" + "../../../../../modules/juce_box2d/box2d/Dynamics/b2WorldCallbacks.h" + "../../../../../modules/juce_box2d/box2d/Rope/b2Rope.cpp" + "../../../../../modules/juce_box2d/box2d/Rope/b2Rope.h" + "../../../../../modules/juce_box2d/box2d/Box2D.h" + "../../../../../modules/juce_box2d/box2d/README.txt" + "../../../../../modules/juce_box2d/utils/juce_Box2DRenderer.cpp" + "../../../../../modules/juce_box2d/utils/juce_Box2DRenderer.h" + "../../../../../modules/juce_box2d/juce_box2d.cpp" + "../../../../../modules/juce_box2d/juce_box2d.h" + "../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp" + "../../../../../modules/juce_core/containers/juce_AbstractFifo.h" + "../../../../../modules/juce_core/containers/juce_Array.h" + "../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" + "../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" + "../../../../../modules/juce_core/containers/juce_ArrayBase.h" + "../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" + "../../../../../modules/juce_core/containers/juce_DynamicObject.h" + "../../../../../modules/juce_core/containers/juce_ElementComparator.h" + "../../../../../modules/juce_core/containers/juce_HashMap.h" + "../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" + "../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" + "../../../../../modules/juce_core/containers/juce_ListenerList.cpp" + "../../../../../modules/juce_core/containers/juce_ListenerList.h" + "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" + "../../../../../modules/juce_core/containers/juce_NamedValueSet.h" + "../../../../../modules/juce_core/containers/juce_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" + "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" + "../../../../../modules/juce_core/containers/juce_OwnedArray.h" + "../../../../../modules/juce_core/containers/juce_PropertySet.cpp" + "../../../../../modules/juce_core/containers/juce_PropertySet.h" + "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" + "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" + "../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" + "../../../../../modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h" + "../../../../../modules/juce_core/containers/juce_SortedSet.h" + "../../../../../modules/juce_core/containers/juce_SparseSet.cpp" + "../../../../../modules/juce_core/containers/juce_SparseSet.h" + "../../../../../modules/juce_core/containers/juce_Variant.cpp" + "../../../../../modules/juce_core/containers/juce_Variant.h" + "../../../../../modules/juce_core/files/juce_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.h" + "../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_DirectoryIterator.h" + "../../../../../modules/juce_core/files/juce_File.cpp" + "../../../../../modules/juce_core/files/juce_File.h" + "../../../../../modules/juce_core/files/juce_FileFilter.cpp" + "../../../../../modules/juce_core/files/juce_FileFilter.h" + "../../../../../modules/juce_core/files/juce_FileInputStream.cpp" + "../../../../../modules/juce_core/files/juce_FileInputStream.h" + "../../../../../modules/juce_core/files/juce_FileOutputStream.cpp" + "../../../../../modules/juce_core/files/juce_FileOutputStream.h" + "../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" + "../../../../../modules/juce_core/files/juce_FileSearchPath.h" + "../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" + "../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" + "../../../../../modules/juce_core/files/juce_TemporaryFile.h" + "../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" + "../../../../../modules/juce_core/files/juce_WildcardFileFilter.h" + "../../../../../modules/juce_core/javascript/juce_Javascript.cpp" + "../../../../../modules/juce_core/javascript/juce_Javascript.h" + "../../../../../modules/juce_core/javascript/juce_JSON.cpp" + "../../../../../modules/juce_core/javascript/juce_JSON.h" + "../../../../../modules/juce_core/logging/juce_FileLogger.cpp" + "../../../../../modules/juce_core/logging/juce_FileLogger.h" + "../../../../../modules/juce_core/logging/juce_Logger.cpp" + "../../../../../modules/juce_core/logging/juce_Logger.h" + "../../../../../modules/juce_core/maths/juce_BigInteger.cpp" + "../../../../../modules/juce_core/maths/juce_BigInteger.h" + "../../../../../modules/juce_core/maths/juce_Expression.cpp" + "../../../../../modules/juce_core/maths/juce_Expression.h" + "../../../../../modules/juce_core/maths/juce_MathsFunctions.h" + "../../../../../modules/juce_core/maths/juce_NormalisableRange.h" + "../../../../../modules/juce_core/maths/juce_Random.cpp" + "../../../../../modules/juce_core/maths/juce_Random.h" + "../../../../../modules/juce_core/maths/juce_Range.h" + "../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h" + "../../../../../modules/juce_core/memory/juce_AllocationHooks.cpp" + "../../../../../modules/juce_core/memory/juce_AllocationHooks.h" + "../../../../../modules/juce_core/memory/juce_Atomic.h" + "../../../../../modules/juce_core/memory/juce_ByteOrder.h" + "../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" + "../../../../../modules/juce_core/memory/juce_HeapBlock.h" + "../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" + "../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" + "../../../../../modules/juce_core/memory/juce_Memory.h" + "../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" + "../../../../../modules/juce_core/memory/juce_MemoryBlock.h" + "../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h" + "../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h" + "../../../../../modules/juce_core/memory/juce_Reservoir.h" + "../../../../../modules/juce_core/memory/juce_ScopedPointer.h" + "../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" + "../../../../../modules/juce_core/memory/juce_Singleton.h" + "../../../../../modules/juce_core/memory/juce_WeakReference.h" + "../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" + "../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" + "../../../../../modules/juce_core/misc/juce_Functional.h" + "../../../../../modules/juce_core/misc/juce_Result.cpp" + "../../../../../modules/juce_core/misc/juce_Result.h" + "../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" + "../../../../../modules/juce_core/misc/juce_RuntimePermissions.h" + "../../../../../modules/juce_core/misc/juce_Uuid.cpp" + "../../../../../modules/juce_core/misc/juce_Uuid.h" + "../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" + "../../../../../modules/juce_core/native/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" + "../../../../../modules/juce_core/native/juce_android_Files.cpp" + "../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" + "../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" + "../../../../../modules/juce_core/native/juce_android_Misc.cpp" + "../../../../../modules/juce_core/native/juce_android_Network.cpp" + "../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp" + "../../../../../modules/juce_core/native/juce_android_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_android_Threads.cpp" + "../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h" + "../../../../../modules/juce_core/native/juce_curl_Network.cpp" + "../../../../../modules/juce_core/native/juce_intel_SharedCode.h" + "../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp" + "../../../../../modules/juce_core/native/juce_linux_Files.cpp" + "../../../../../modules/juce_core/native/juce_linux_Network.cpp" + "../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_linux_Threads.cpp" + "../../../../../modules/juce_core/native/juce_mac_CFHelpers.h" + "../../../../../modules/juce_core/native/juce_mac_Files.mm" + "../../../../../modules/juce_core/native/juce_mac_Network.mm" + "../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" + "../../../../../modules/juce_core/native/juce_mac_Strings.mm" + "../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" + "../../../../../modules/juce_core/native/juce_mac_Threads.mm" + "../../../../../modules/juce_core/native/juce_posix_IPAddress.h" + "../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" + "../../../../../modules/juce_core/native/juce_posix_SharedCode.h" + "../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" + "../../../../../modules/juce_core/native/juce_win32_Files.cpp" + "../../../../../modules/juce_core/native/juce_win32_Network.cpp" + "../../../../../modules/juce_core/native/juce_win32_Registry.cpp" + "../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_win32_Threads.cpp" + "../../../../../modules/juce_core/network/juce_IPAddress.cpp" + "../../../../../modules/juce_core/network/juce_IPAddress.h" + "../../../../../modules/juce_core/network/juce_MACAddress.cpp" + "../../../../../modules/juce_core/network/juce_MACAddress.h" + "../../../../../modules/juce_core/network/juce_NamedPipe.cpp" + "../../../../../modules/juce_core/network/juce_NamedPipe.h" + "../../../../../modules/juce_core/network/juce_Socket.cpp" + "../../../../../modules/juce_core/network/juce_Socket.h" + "../../../../../modules/juce_core/network/juce_URL.cpp" + "../../../../../modules/juce_core/network/juce_URL.h" + "../../../../../modules/juce_core/network/juce_WebInputStream.cpp" + "../../../../../modules/juce_core/network/juce_WebInputStream.h" + "../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp" + "../../../../../modules/juce_core/streams/juce_BufferedInputStream.h" + "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp" + "../../../../../modules/juce_core/streams/juce_FileInputSource.h" + "../../../../../modules/juce_core/streams/juce_InputSource.h" + "../../../../../modules/juce_core/streams/juce_InputStream.cpp" + "../../../../../modules/juce_core/streams/juce_InputStream.h" + "../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp" + "../../../../../modules/juce_core/streams/juce_MemoryInputStream.h" + "../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp" + "../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h" + "../../../../../modules/juce_core/streams/juce_OutputStream.cpp" + "../../../../../modules/juce_core/streams/juce_OutputStream.h" + "../../../../../modules/juce_core/streams/juce_SubregionStream.cpp" + "../../../../../modules/juce_core/streams/juce_SubregionStream.h" + "../../../../../modules/juce_core/streams/juce_URLInputSource.cpp" + "../../../../../modules/juce_core/streams/juce_URLInputSource.h" + "../../../../../modules/juce_core/system/juce_CompilerSupport.h" + "../../../../../modules/juce_core/system/juce_CompilerWarnings.h" + "../../../../../modules/juce_core/system/juce_PlatformDefs.h" + "../../../../../modules/juce_core/system/juce_StandardHeader.h" + "../../../../../modules/juce_core/system/juce_SystemStats.cpp" + "../../../../../modules/juce_core/system/juce_SystemStats.h" + "../../../../../modules/juce_core/system/juce_TargetPlatform.h" + "../../../../../modules/juce_core/text/juce_Base64.cpp" + "../../../../../modules/juce_core/text/juce_Base64.h" + "../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp" + "../../../../../modules/juce_core/text/juce_CharacterFunctions.h" + "../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h" + "../../../../../modules/juce_core/text/juce_Identifier.cpp" + "../../../../../modules/juce_core/text/juce_Identifier.h" + "../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp" + "../../../../../modules/juce_core/text/juce_LocalisedStrings.h" + "../../../../../modules/juce_core/text/juce_NewLine.h" + "../../../../../modules/juce_core/text/juce_String.cpp" + "../../../../../modules/juce_core/text/juce_String.h" + "../../../../../modules/juce_core/text/juce_StringArray.cpp" + "../../../../../modules/juce_core/text/juce_StringArray.h" + "../../../../../modules/juce_core/text/juce_StringPairArray.cpp" + "../../../../../modules/juce_core/text/juce_StringPairArray.h" + "../../../../../modules/juce_core/text/juce_StringPool.cpp" + "../../../../../modules/juce_core/text/juce_StringPool.h" + "../../../../../modules/juce_core/text/juce_StringRef.h" + "../../../../../modules/juce_core/text/juce_TextDiff.cpp" + "../../../../../modules/juce_core/text/juce_TextDiff.h" + "../../../../../modules/juce_core/threads/juce_ChildProcess.cpp" + "../../../../../modules/juce_core/threads/juce_ChildProcess.h" + "../../../../../modules/juce_core/threads/juce_CriticalSection.h" + "../../../../../modules/juce_core/threads/juce_DynamicLibrary.h" + "../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp" + "../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h" + "../../../../../modules/juce_core/threads/juce_InterProcessLock.h" + "../../../../../modules/juce_core/threads/juce_Process.h" + "../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp" + "../../../../../modules/juce_core/threads/juce_ReadWriteLock.h" + "../../../../../modules/juce_core/threads/juce_ScopedLock.h" + "../../../../../modules/juce_core/threads/juce_ScopedReadLock.h" + "../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h" + "../../../../../modules/juce_core/threads/juce_SpinLock.h" + "../../../../../modules/juce_core/threads/juce_Thread.cpp" + "../../../../../modules/juce_core/threads/juce_Thread.h" + "../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h" + "../../../../../modules/juce_core/threads/juce_ThreadPool.cpp" + "../../../../../modules/juce_core/threads/juce_ThreadPool.h" + "../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp" + "../../../../../modules/juce_core/threads/juce_TimeSliceThread.h" + "../../../../../modules/juce_core/threads/juce_WaitableEvent.cpp" + "../../../../../modules/juce_core/threads/juce_WaitableEvent.h" + "../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp" + "../../../../../modules/juce_core/time/juce_PerformanceCounter.h" + "../../../../../modules/juce_core/time/juce_RelativeTime.cpp" + "../../../../../modules/juce_core/time/juce_RelativeTime.h" + "../../../../../modules/juce_core/time/juce_Time.cpp" + "../../../../../modules/juce_core/time/juce_Time.h" + "../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp" + "../../../../../modules/juce_core/unit_tests/juce_UnitTest.h" + "../../../../../modules/juce_core/unit_tests/juce_UnitTestCategories.h" + "../../../../../modules/juce_core/xml/juce_XmlDocument.cpp" + "../../../../../modules/juce_core/xml/juce_XmlDocument.h" + "../../../../../modules/juce_core/xml/juce_XmlElement.cpp" + "../../../../../modules/juce_core/xml/juce_XmlElement.h" + "../../../../../modules/juce_core/zip/zlib/adler32.c" + "../../../../../modules/juce_core/zip/zlib/compress.c" + "../../../../../modules/juce_core/zip/zlib/crc32.c" + "../../../../../modules/juce_core/zip/zlib/crc32.h" + "../../../../../modules/juce_core/zip/zlib/deflate.c" + "../../../../../modules/juce_core/zip/zlib/deflate.h" + "../../../../../modules/juce_core/zip/zlib/infback.c" + "../../../../../modules/juce_core/zip/zlib/inffast.c" + "../../../../../modules/juce_core/zip/zlib/inffast.h" + "../../../../../modules/juce_core/zip/zlib/inffixed.h" + "../../../../../modules/juce_core/zip/zlib/inflate.c" + "../../../../../modules/juce_core/zip/zlib/inflate.h" + "../../../../../modules/juce_core/zip/zlib/inftrees.c" + "../../../../../modules/juce_core/zip/zlib/inftrees.h" + "../../../../../modules/juce_core/zip/zlib/trees.c" + "../../../../../modules/juce_core/zip/zlib/trees.h" + "../../../../../modules/juce_core/zip/zlib/uncompr.c" + "../../../../../modules/juce_core/zip/zlib/zconf.h" + "../../../../../modules/juce_core/zip/zlib/zconf.in.h" + "../../../../../modules/juce_core/zip/zlib/zlib.h" + "../../../../../modules/juce_core/zip/zlib/zutil.c" + "../../../../../modules/juce_core/zip/zlib/zutil.h" + "../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp" + "../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h" + "../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp" + "../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h" + "../../../../../modules/juce_core/zip/juce_ZipFile.cpp" + "../../../../../modules/juce_core/zip/juce_ZipFile.h" + "../../../../../modules/juce_core/juce_core.cpp" + "../../../../../modules/juce_core/juce_core.mm" + "../../../../../modules/juce_core/juce_core.h" + "../../../../../modules/juce_cryptography/encryption/juce_BlowFish.cpp" + "../../../../../modules/juce_cryptography/encryption/juce_BlowFish.h" + "../../../../../modules/juce_cryptography/encryption/juce_Primes.cpp" + "../../../../../modules/juce_cryptography/encryption/juce_Primes.h" + "../../../../../modules/juce_cryptography/encryption/juce_RSAKey.cpp" + "../../../../../modules/juce_cryptography/encryption/juce_RSAKey.h" + "../../../../../modules/juce_cryptography/hashing/juce_MD5.cpp" + "../../../../../modules/juce_cryptography/hashing/juce_MD5.h" + "../../../../../modules/juce_cryptography/hashing/juce_SHA256.cpp" + "../../../../../modules/juce_cryptography/hashing/juce_SHA256.h" + "../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.cpp" + "../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.h" + "../../../../../modules/juce_cryptography/juce_cryptography.cpp" + "../../../../../modules/juce_cryptography/juce_cryptography.mm" + "../../../../../modules/juce_cryptography/juce_cryptography.h" + "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp" + "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" + "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" + "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" + "../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp" + "../../../../../modules/juce_data_structures/values/juce_CachedValue.h" + "../../../../../modules/juce_data_structures/values/juce_Value.cpp" + "../../../../../modules/juce_data_structures/values/juce_Value.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTree.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" + "../../../../../modules/juce_data_structures/juce_data_structures.cpp" + "../../../../../modules/juce_data_structures/juce_data_structures.mm" + "../../../../../modules/juce_data_structures/juce_data_structures.h" + "../../../../../modules/juce_dsp/containers/juce_AudioBlock.h" + "../../../../../modules/juce_dsp/containers/juce_AudioBlock_test.cpp" + "../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction.h" + "../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp" + "../../../../../modules/juce_dsp/containers/juce_SIMDRegister.h" + "../../../../../modules/juce_dsp/containers/juce_SIMDRegister_Impl.h" + "../../../../../modules/juce_dsp/containers/juce_SIMDRegister_test.cpp" + "../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.cpp" + "../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.h" + "../../../../../modules/juce_dsp/frequency/juce_Convolution.cpp" + "../../../../../modules/juce_dsp/frequency/juce_Convolution.h" + "../../../../../modules/juce_dsp/frequency/juce_Convolution_test.cpp" + "../../../../../modules/juce_dsp/frequency/juce_FFT.cpp" + "../../../../../modules/juce_dsp/frequency/juce_FFT.h" + "../../../../../modules/juce_dsp/frequency/juce_FFT_test.cpp" + "../../../../../modules/juce_dsp/frequency/juce_Windowing.cpp" + "../../../../../modules/juce_dsp/frequency/juce_Windowing.h" + "../../../../../modules/juce_dsp/maths/juce_FastMathApproximations.h" + "../../../../../modules/juce_dsp/maths/juce_LogRampedValue.h" + "../../../../../modules/juce_dsp/maths/juce_LogRampedValue_test.cpp" + "../../../../../modules/juce_dsp/maths/juce_LookupTable.cpp" + "../../../../../modules/juce_dsp/maths/juce_LookupTable.h" + "../../../../../modules/juce_dsp/maths/juce_Matrix.cpp" + "../../../../../modules/juce_dsp/maths/juce_Matrix.h" + "../../../../../modules/juce_dsp/maths/juce_Matrix_test.cpp" + "../../../../../modules/juce_dsp/maths/juce_Phase.h" + "../../../../../modules/juce_dsp/maths/juce_Polynomial.h" + "../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.cpp" + "../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.h" + "../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp" + "../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.h" + "../../../../../modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h" + "../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp" + "../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.h" + "../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp" + "../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.h" + "../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.h" + "../../../../../modules/juce_dsp/processors/juce_DelayLine.cpp" + "../../../../../modules/juce_dsp/processors/juce_DelayLine.h" + "../../../../../modules/juce_dsp/processors/juce_DryWetMixer.cpp" + "../../../../../modules/juce_dsp/processors/juce_DryWetMixer.h" + "../../../../../modules/juce_dsp/processors/juce_FIRFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_FIRFilter.h" + "../../../../../modules/juce_dsp/processors/juce_FIRFilter_test.cpp" + "../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h" + "../../../../../modules/juce_dsp/processors/juce_IIRFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_IIRFilter.h" + "../../../../../modules/juce_dsp/processors/juce_IIRFilter_Impl.h" + "../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h" + "../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp" + "../../../../../modules/juce_dsp/processors/juce_Oversampling.h" + "../../../../../modules/juce_dsp/processors/juce_Panner.cpp" + "../../../../../modules/juce_dsp/processors/juce_Panner.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessContext.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp" + "../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h" + "../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h" + "../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.h" + "../../../../../modules/juce_dsp/widgets/juce_Bias.h" + "../../../../../modules/juce_dsp/widgets/juce_Chorus.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Chorus.h" + "../../../../../modules/juce_dsp/widgets/juce_Compressor.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Compressor.h" + "../../../../../modules/juce_dsp/widgets/juce_Gain.h" + "../../../../../modules/juce_dsp/widgets/juce_LadderFilter.cpp" + "../../../../../modules/juce_dsp/widgets/juce_LadderFilter.h" + "../../../../../modules/juce_dsp/widgets/juce_Limiter.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Limiter.h" + "../../../../../modules/juce_dsp/widgets/juce_NoiseGate.cpp" + "../../../../../modules/juce_dsp/widgets/juce_NoiseGate.h" + "../../../../../modules/juce_dsp/widgets/juce_Oscillator.h" + "../../../../../modules/juce_dsp/widgets/juce_Phaser.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Phaser.h" + "../../../../../modules/juce_dsp/widgets/juce_Reverb.h" + "../../../../../modules/juce_dsp/widgets/juce_WaveShaper.h" + "../../../../../modules/juce_dsp/juce_dsp.cpp" + "../../../../../modules/juce_dsp/juce_dsp.mm" + "../../../../../modules/juce_dsp/juce_dsp.h" + "../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" + "../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" + "../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" + "../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp" + "../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h" + "../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp" + "../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h" + "../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h" + "../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp" + "../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" + "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" + "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" + "../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" + "../../../../../modules/juce_events/messages/juce_ApplicationBase.h" + "../../../../../modules/juce_events/messages/juce_CallbackMessage.h" + "../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp" + "../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h" + "../../../../../modules/juce_events/messages/juce_Initialisation.h" + "../../../../../modules/juce_events/messages/juce_Message.h" + "../../../../../modules/juce_events/messages/juce_MessageListener.cpp" + "../../../../../modules/juce_events/messages/juce_MessageListener.h" + "../../../../../modules/juce_events/messages/juce_MessageManager.cpp" + "../../../../../modules/juce_events/messages/juce_MessageManager.h" + "../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h" + "../../../../../modules/juce_events/messages/juce_NotificationType.h" + "../../../../../modules/juce_events/native/juce_android_Messaging.cpp" + "../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" + "../../../../../modules/juce_events/native/juce_linux_EventLoop.h" + "../../../../../modules/juce_events/native/juce_linux_EventLoopInternal.h" + "../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" + "../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" + "../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" + "../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp" + "../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h" + "../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h" + "../../../../../modules/juce_events/native/juce_win32_Messaging.cpp" + "../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp" + "../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h" + "../../../../../modules/juce_events/timers/juce_MultiTimer.cpp" + "../../../../../modules/juce_events/timers/juce_MultiTimer.h" + "../../../../../modules/juce_events/timers/juce_Timer.cpp" + "../../../../../modules/juce_events/timers/juce_Timer.h" + "../../../../../modules/juce_events/juce_events.cpp" + "../../../../../modules/juce_events/juce_events.mm" + "../../../../../modules/juce_events/juce_events.h" + "../../../../../modules/juce_graphics/colour/juce_Colour.cpp" + "../../../../../modules/juce_graphics/colour/juce_Colour.h" + "../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp" + "../../../../../modules/juce_graphics/colour/juce_ColourGradient.h" + "../../../../../modules/juce_graphics/colour/juce_Colours.cpp" + "../../../../../modules/juce_graphics/colour/juce_Colours.h" + "../../../../../modules/juce_graphics/colour/juce_FillType.cpp" + "../../../../../modules/juce_graphics/colour/juce_FillType.h" + "../../../../../modules/juce_graphics/colour/juce_PixelFormats.h" + "../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp" + "../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" + "../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp" + "../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h" + "../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp" + "../../../../../modules/juce_graphics/effects/juce_GlowEffect.h" + "../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h" + "../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp" + "../../../../../modules/juce_graphics/fonts/juce_AttributedString.h" + "../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp" + "../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h" + "../../../../../modules/juce_graphics/fonts/juce_Font.cpp" + "../../../../../modules/juce_graphics/fonts/juce_Font.h" + "../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp" + "../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h" + "../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp" + "../../../../../modules/juce_graphics/fonts/juce_TextLayout.h" + "../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp" + "../../../../../modules/juce_graphics/fonts/juce_Typeface.h" + "../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp" + "../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h" + "../../../../../modules/juce_graphics/geometry/juce_BorderSize.h" + "../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp" + "../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h" + "../../../../../modules/juce_graphics/geometry/juce_Line.h" + "../../../../../modules/juce_graphics/geometry/juce_Parallelogram.h" + "../../../../../modules/juce_graphics/geometry/juce_Path.cpp" + "../../../../../modules/juce_graphics/geometry/juce_Path.h" + "../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp" + "../../../../../modules/juce_graphics/geometry/juce_PathIterator.h" + "../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp" + "../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h" + "../../../../../modules/juce_graphics/geometry/juce_Point.h" + "../../../../../modules/juce_graphics/geometry/juce_Rectangle.h" + "../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp" + "../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" + "../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp" + "../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp" + "../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp" + "../../../../../modules/juce_graphics/images/juce_Image.cpp" + "../../../../../modules/juce_graphics/images/juce_Image.h" + "../../../../../modules/juce_graphics/images/juce_ImageCache.cpp" + "../../../../../modules/juce_graphics/images/juce_ImageCache.h" + "../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp" + "../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h" + "../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp" + "../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h" + "../../../../../modules/juce_graphics/images/juce_ScaledImage.h" + "../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp" + "../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp" + "../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp" + "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h" + "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm" + "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h" + "../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm" + "../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp" + "../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp" + "../../../../../modules/juce_graphics/placement/juce_Justification.h" + "../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp" + "../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h" + "../../../../../modules/juce_graphics/juce_graphics.cpp" + "../../../../../modules/juce_graphics/juce_graphics.mm" + "../../../../../modules/juce_graphics/juce_graphics.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.h" + "../../../../../modules/juce_gui_basics/application/juce_Application.cpp" + "../../../../../modules/juce_gui_basics/application/juce_Application.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_Button.h" + "../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h" + "../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h" + "../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h" + "../../../../../modules/juce_gui_basics/components/juce_Component.cpp" + "../../../../../modules/juce_gui_basics/components/juce_Component.h" + "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" + "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" + "../../../../../modules/juce_gui_basics/components/juce_ComponentTraverser.h" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.h" + "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" + "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" + "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" + "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" + "../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" + "../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" + "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h" + "../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h" + "../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h" + "../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h" + "../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h" + "../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" + "../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" + "../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_Grid.h" + "../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" + "../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h" + "../../../../../modules/juce_gui_basics/layout/juce_SidePanel.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_SidePanel.h" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_Viewport.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h" + "../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h" + "../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h" + "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" + "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" + "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" + "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" + "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h" + "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h" + "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h" + "../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h" + "../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" + "../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h" + "../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" + "../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" + "../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h" + "../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" + "../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" + "../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" + "../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" + "../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" + "../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" + "../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm" + "../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h" + "../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" + "../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp" + "../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h" + "../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h" + "../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h" + "../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_Label.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h" + "../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_Slider.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h" + "../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h" + "../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h" + "../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h" + "../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_MessageBoxOptions.h" + "../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h" + "../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h" + "../../../../../modules/juce_gui_basics/juce_gui_basics.cpp" + "../../../../../modules/juce_gui_basics/juce_gui_basics.mm" + "../../../../../modules/juce_gui_basics/juce_gui_basics.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h" + "../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp" + "../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h" + "../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_HWNDComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h" + "../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h" + "../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h" + "../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.h" + "../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.h" + "../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h" + "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" + "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" + "../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" + "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" + "../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.mm" + "../../../../../modules/juce_gui_extra/juce_gui_extra.h" + "../../../../../modules/juce_opengl/geometry/juce_Draggable3DOrientation.h" + "../../../../../modules/juce_opengl/geometry/juce_Matrix3D.h" + "../../../../../modules/juce_opengl/geometry/juce_Quaternion.h" + "../../../../../modules/juce_opengl/geometry/juce_Vector3D.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_android.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_ios.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_linux_X11.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_osx.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_win32.h" + "../../../../../modules/juce_opengl/native/juce_OpenGLExtensions.h" + "../../../../../modules/juce_opengl/opengl/juce_gl.cpp" + "../../../../../modules/juce_opengl/opengl/juce_gl.h" + "../../../../../modules/juce_opengl/opengl/juce_gles2.cpp" + "../../../../../modules/juce_opengl/opengl/juce_gles2.h" + "../../../../../modules/juce_opengl/opengl/juce_khrplatform.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLRenderer.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.h" + "../../../../../modules/juce_opengl/opengl/juce_wgl.h" + "../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp" + "../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.h" + "../../../../../modules/juce_opengl/juce_opengl.cpp" + "../../../../../modules/juce_opengl/juce_opengl.mm" + "../../../../../modules/juce_opengl/juce_opengl.h" + "../../../../../modules/juce_osc/osc/juce_OSCAddress.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCAddress.h" + "../../../../../modules/juce_osc/osc/juce_OSCArgument.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCArgument.h" + "../../../../../modules/juce_osc/osc/juce_OSCBundle.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCBundle.h" + "../../../../../modules/juce_osc/osc/juce_OSCMessage.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCMessage.h" + "../../../../../modules/juce_osc/osc/juce_OSCReceiver.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCReceiver.h" + "../../../../../modules/juce_osc/osc/juce_OSCSender.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCSender.h" + "../../../../../modules/juce_osc/osc/juce_OSCTimeTag.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCTimeTag.h" + "../../../../../modules/juce_osc/osc/juce_OSCTypes.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCTypes.h" + "../../../../../modules/juce_osc/juce_osc.cpp" + "../../../../../modules/juce_osc/juce_osc.h" + "../../../../../modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp" + "../../../../../modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h" + "../../../../../modules/juce_product_unlocking/marketplace/juce_KeyFileGeneration.h" + "../../../../../modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.cpp" + "../../../../../modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.h" + "../../../../../modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.cpp" + "../../../../../modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.h" + "../../../../../modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.cpp" + "../../../../../modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.h" + "../../../../../modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp" + "../../../../../modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp" + "../../../../../modules/juce_product_unlocking/juce_product_unlocking.cpp" + "../../../../../modules/juce_product_unlocking/juce_product_unlocking.mm" + "../../../../../modules/juce_product_unlocking/juce_product_unlocking.h" + "../../../../../modules/juce_video/capture/juce_CameraDevice.cpp" + "../../../../../modules/juce_video/capture/juce_CameraDevice.h" + "../../../../../modules/juce_video/native/juce_android_CameraDevice.h" + "../../../../../modules/juce_video/native/juce_android_Video.h" + "../../../../../modules/juce_video/native/juce_ios_CameraDevice.h" + "../../../../../modules/juce_video/native/juce_mac_CameraDevice.h" + "../../../../../modules/juce_video/native/juce_mac_Video.h" + "../../../../../modules/juce_video/native/juce_win32_CameraDevice.h" + "../../../../../modules/juce_video/native/juce_win32_ComTypes.h" + "../../../../../modules/juce_video/native/juce_win32_Video.h" + "../../../../../modules/juce_video/playback/juce_VideoComponent.cpp" + "../../../../../modules/juce_video/playback/juce_VideoComponent.h" + "../../../../../modules/juce_video/juce_video.cpp" + "../../../../../modules/juce_video/juce_video.mm" + "../../../../../modules/juce_video/juce_video.h" + "../../../JuceLibraryCode/JuceHeader.h" + PROPERTIES HEADER_FILE_ONLY TRUE) target_compile_options( ${BINARY_NAME} PRIVATE "-fsigned-char" ) if( JUCE_BUILD_CONFIGURATION MATCHES "DEBUG" ) - target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) + target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) endif() if( JUCE_BUILD_CONFIGURATION MATCHES "RELEASE" ) - target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) + target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) endif() find_library(log "log") diff --git a/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml b/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml index 24204de3..3c2a6461 100644 --- a/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml +++ b/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml @@ -1,10 +1,10 @@ - - + diff --git a/examples/DemoRunner/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h b/examples/DemoRunner/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h index 463dfc85..dc75464e 100644 --- a/examples/DemoRunner/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h +++ b/examples/DemoRunner/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff --git a/examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h b/examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h index 07a2bd7c..49ccc278 100644 --- a/examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h +++ b/examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff --git a/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h b/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h index 73ac930a..bfc1c5d2 100644 --- a/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h +++ b/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff --git a/examples/DemoRunner/Builds/Android/app/src/main/assets/WavefrontObjParser.h b/examples/DemoRunner/Builds/Android/app/src/main/assets/WavefrontObjParser.h index 396c9c7a..01f51770 100644 --- a/examples/DemoRunner/Builds/Android/app/src/main/assets/WavefrontObjParser.h +++ b/examples/DemoRunner/Builds/Android/app/src/main/assets/WavefrontObjParser.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff --git a/examples/DemoRunner/Builds/LinuxMakefile/Makefile b/examples/DemoRunner/Builds/LinuxMakefile/Makefile index a358044c..10d5fbbd 100644 --- a/examples/DemoRunner/Builds/LinuxMakefile/Makefile +++ b/examples/DemoRunner/Builds/LinuxMakefile/Makefile @@ -11,6 +11,10 @@ endif # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ ifeq ($(CONFIG),Debug) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.6" "-DJUCE_APP_VERSION_HEX=0x60106" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.0" "-DJUCE_APP_VERSION_HEX=0x70000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := DemoRunner JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,13 +60,13 @@ ifeq ($(CONFIG),Release) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.6" "-DJUCE_APP_VERSION_HEX=0x60106" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.0" "-DJUCE_APP_VERSION_HEX=0x70000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := DemoRunner JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -79,6 +83,8 @@ OBJECTS_APP := \ $(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o \ $(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o \ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o \ $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o \ $(JUCE_OBJDIR)/include_juce_box2d_b0305d8b.o \ $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \ @@ -99,8 +105,8 @@ OBJECTS_APP := \ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors alsa freetype2 libcurl + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors alsa freetype2 libcurl @echo Linking "DemoRunner - App" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) @@ -162,6 +168,16 @@ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o: ../../JuceLibraryCode/i @echo "Compiling include_juce_audio_processors.cpp" $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" +$(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o: ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_ara.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o: ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_lv2_libs.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o: ../../JuceLibraryCode/include_juce_audio_utils.cpp -$(V_AT)mkdir -p $(JUCE_OBJDIR) @echo "Compiling include_juce_audio_utils.cpp" diff --git a/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj b/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj index a849e33a..127f964b 100644 --- a/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj +++ b/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj @@ -25,8 +25,10 @@ 527DA2E6827BAFDDD3E8E80F /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = B4389672DA4CC8E0A531062D; }; 5CB78489F16E82144914972D /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = 979F23EA9E5E76131299E886; }; 5E4310B3F6BB639875D3E9B8 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = 49ECA8B998B339A083674A22; }; + 5EB6872A39122A5AB67E544E /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = 8D44097417573B38729A0179; }; 611298FAC1A543BDD10D4C41 /* include_juce_box2d.cpp */ = {isa = PBXBuildFile; fileRef = 4DF215D350FFE5E119CBA7E5; }; 63A2F309E55DAC206E9B97E3 /* App */ = {isa = PBXBuildFile; fileRef = CFF2BBEB242CC8B3B904B5F9; }; + 67D7E529C3713ED79F5F3AA9 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 5BD7D121AD30987C08BE10E8; }; 6A61CBB4E39BFD392D97528F /* CoreMIDI.framework */ = {isa = PBXBuildFile; fileRef = 61AE09C749B007B70A265D9B; }; 6B5560283DEEBD6DD2D6C984 /* include_juce_dsp.mm */ = {isa = PBXBuildFile; fileRef = C1E93FAF6C68A40A664422CD; }; 712D81867EC698463252FA79 /* include_juce_audio_utils.mm */ = {isa = PBXBuildFile; fileRef = EDDA01B246C6128CAF7A2914; }; @@ -35,7 +37,6 @@ 7B4163348896EB1B86B15160 /* AVFoundation.framework */ = {isa = PBXBuildFile; fileRef = DC192EFA899E6CBE6B5CD394; }; 8584640341100008744861A5 /* IOKit.framework */ = {isa = PBXBuildFile; fileRef = 71A91516AFD980FEE694C0E1; }; 89AD16514B1F4133FFEA1DF9 /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = 96D99A08027CA35D6A4E5CFD; }; - 89BC6E2354102D975E08E918 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = 440D507FD8F31DB62B1F95C7; }; 8C0AEA08A71075A6C765AEC9 /* AVKit.framework */ = {isa = PBXBuildFile; fileRef = 3B99CF94C44E2EE04635A439; }; 91CD2BCE4CA07E18229EB436 /* RecentFilesMenuTemplate.nib */ = {isa = PBXBuildFile; fileRef = 9672FCE6167ADB567A9EB2F8; }; 9BEA1428416CE06BF72FBAB8 /* DiscRecording.framework */ = {isa = PBXBuildFile; fileRef = 3DC90DA86565B0356B6E5E0B; }; @@ -80,7 +81,6 @@ 3DC90DA86565B0356B6E5E0B /* DiscRecording.framework */ /* DiscRecording.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; }; 3E4ED41C374261CFFD309743 /* include_juce_graphics.mm */ /* include_juce_graphics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_graphics.mm; path = ../../JuceLibraryCode/include_juce_graphics.mm; sourceTree = SOURCE_ROOT; }; 40BD06D4AB0D2C73E936A2F1 /* OpenGL.framework */ /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; - 440D507FD8F31DB62B1F95C7 /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; 470C3E4553B513FFEF752779 /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 491641F7632BCC81BBA0ED85 /* juce_audio_formats */ /* juce_audio_formats */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_formats; path = ../../../../modules/juce_audio_formats; sourceTree = SOURCE_ROOT; }; 49ECA8B998B339A083674A22 /* Foundation.framework */ /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -91,6 +91,7 @@ 4FE6029FF76BCE9698595DC5 /* juce_product_unlocking */ /* juce_product_unlocking */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_product_unlocking; path = ../../../../modules/juce_product_unlocking; sourceTree = SOURCE_ROOT; }; 5965349393850F41DF76F350 /* include_juce_analytics.cpp */ /* include_juce_analytics.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_analytics.cpp; path = ../../JuceLibraryCode/include_juce_analytics.cpp; sourceTree = SOURCE_ROOT; }; 5A9F2000C66D24E8B01BE60B /* juce_gui_basics */ /* juce_gui_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_gui_basics; path = ../../../../modules/juce_gui_basics; sourceTree = SOURCE_ROOT; }; + 5BD7D121AD30987C08BE10E8 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 5CD17151385A69F1E07FE85B /* DSP */ /* DSP */ = {isa = PBXFileReference; lastKnownFileType = folder; name = DSP; path = ../../../DSP; sourceTree = ""; }; 60F2869DC345EAF2314D6C09 /* juce_audio_devices */ /* juce_audio_devices */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_devices; path = ../../../../modules/juce_audio_devices; sourceTree = SOURCE_ROOT; }; 61AE09C749B007B70A265D9B /* CoreMIDI.framework */ /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; @@ -104,6 +105,7 @@ 7A5AAE9EE573FC6105CC4AAC /* SettingsContent.h */ /* SettingsContent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SettingsContent.h; path = ../../Source/UI/SettingsContent.h; sourceTree = SOURCE_ROOT; }; 7B3243C92248D379A0489AA4 /* Utilities */ /* Utilities */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Utilities; path = ../../../Utilities; sourceTree = ""; }; 8CE533D611CD0984AD028D73 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; }; + 8D44097417573B38729A0179 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; 903CD4126C779884797EF915 /* juce_core */ /* juce_core */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_core; path = ../../../../modules/juce_core; sourceTree = SOURCE_ROOT; }; 9144821E003E15E4042B57DB /* include_juce_video.mm */ /* include_juce_video.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_video.mm; path = ../../JuceLibraryCode/include_juce_video.mm; sourceTree = SOURCE_ROOT; }; 934ACDCB3FD9D223A3481D8F /* JUCEDemos.cpp */ /* JUCEDemos.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = JUCEDemos.cpp; path = ../../Source/Demos/JUCEDemos.cpp; sourceTree = SOURCE_ROOT; }; @@ -146,7 +148,6 @@ 163B0CF2DD0990A63DF1D5A6, 7B4163348896EB1B86B15160, 8C0AEA08A71075A6C765AEC9, - 89BC6E2354102D975E08E918, 9F15FD7A7CE83CFD98F07D59, 1351A13E78F38741C6075600, 527DA2E6827BAFDDD3E8E80F, @@ -171,7 +172,6 @@ 470C3E4553B513FFEF752779, DC192EFA899E6CBE6B5CD394, 3B99CF94C44E2EE04635A439, - 440D507FD8F31DB62B1F95C7, 02A2ED58B066B4D119F67913, 4F0A137A4115946A346180E6, B4389672DA4CC8E0A531062D, @@ -221,6 +221,8 @@ 03A63C3CA6F24977F19C316D, E061A1C75FA5722167FC4997, E67AB94002886AF67437D6AE, + 8D44097417573B38729A0179, + 5BD7D121AD30987C08BE10E8, EDDA01B246C6128CAF7A2914, 4DF215D350FFE5E119CBA7E5, 3BC9753E0CD75A36DC742EE0, @@ -345,7 +347,7 @@ AC6F0E9A0809A184B2C2B7DE = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { @@ -421,6 +423,8 @@ 9EACEA6BE8D0ACC72C12C080, 26652AB1BB77C8A39434775F, 2707968B431D83AC7E28E49B, + 5EB6872A39122A5AB67E544E, + 67D7E529C3713ED79F5F3AA9, 712D81867EC698463252FA79, 611298FAC1A543BDD10D4C41, D183F8140174ACCDDCD230A2, @@ -507,7 +511,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -529,6 +533,8 @@ "JUCE_MODULE_AVAILABLE_juce_video=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_USE_MP3AUDIOFORMAT=1", + "JUCE_PLUGINHOST_VST3=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_ALLOW_STATIC_NULL_VARIABLES=0", "JUCE_STRICT_REFCOUNTEDPOINTER=1", "JUCE_USE_CAMERA=1", @@ -536,19 +542,28 @@ "JUCE_DEMO_RUNNER=1", "JUCE_UNIT_TESTS=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=6.1.6", - "JUCE_APP_VERSION_HEX=0x60106", + "JUCE_APP_VERSION=7.0.0", + "JUCE_APP_VERSION_HEX=0x70000", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", "$(inherited)", @@ -558,9 +573,10 @@ INSTALL_PATH = "$(HOME)/Applications"; LLVM_LTO = YES; MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner; PRODUCT_NAME = "DemoRunner"; USE_HEADERMAP = NO; @@ -587,7 +603,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -609,6 +625,8 @@ "JUCE_MODULE_AVAILABLE_juce_video=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_USE_MP3AUDIOFORMAT=1", + "JUCE_PLUGINHOST_VST3=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_ALLOW_STATIC_NULL_VARIABLES=0", "JUCE_STRICT_REFCOUNTEDPOINTER=1", "JUCE_USE_CAMERA=1", @@ -616,19 +634,28 @@ "JUCE_DEMO_RUNNER=1", "JUCE_UNIT_TESTS=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=6.1.6", - "JUCE_APP_VERSION_HEX=0x60106", + "JUCE_APP_VERSION=7.0.0", + "JUCE_APP_VERSION_HEX=0x70000", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", "$(inherited)", @@ -637,9 +664,10 @@ INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner; PRODUCT_NAME = "DemoRunner"; USE_HEADERMAP = NO; diff --git a/examples/DemoRunner/Builds/MacOSX/Info-App.plist b/examples/DemoRunner/Builds/MacOSX/Info-App.plist index 9be80923..86cfc879 100644 --- a/examples/DemoRunner/Builds/MacOSX/Info-App.plist +++ b/examples/DemoRunner/Builds/MacOSX/Info-App.plist @@ -24,9 +24,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 6.1.6 + 7.0.0 CFBundleVersion - 6.1.6 + 7.0.0 NSHumanReadableCopyright Copyright (c) 2020 - Raw Material Software Limited NSHighResolutionCapable diff --git a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner.sln b/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner.sln deleted file mode 100644 index aad7971d..00000000 --- a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner.sln +++ /dev/null @@ -1,21 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 14 - -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DemoRunner - App", "DemoRunner_App.vcxproj", "{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Debug|x64.ActiveCfg = Debug|x64 - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Debug|x64.Build.0 = Debug|x64 - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Release|x64.ActiveCfg = Release|x64 - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj deleted file mode 100644 index 34af5bd1..00000000 --- a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj +++ /dev/null @@ -1,3478 +0,0 @@ - - - - - - Debug - x64 - - - Release - x64 - - - - {882FE2E3-F4EF-9825-1908-F6FEE5366B5C} - - - - Application - false - false - v140 - 8.1 - - - Application - false - true - v140 - 8.1 - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - .exe - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - DemoRunner - true - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - DemoRunner - true - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Disabled - ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - true - NotUsing - $(IntDir)\ - $(IntDir)\ - $(IntDir)\DemoRunner.pdb - Level4 - true - true - /w44265 /w45038 /w44062 /bigobj %(AdditionalOptions) - stdcpp14 - - - _DEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\DemoRunner.exe - true - libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries) - true - $(IntDir)\DemoRunner.pdb - Windows - true - - - true - $(IntDir)\DemoRunner.bsc - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreaded - true - NotUsing - $(IntDir)\ - $(IntDir)\ - $(IntDir)\DemoRunner.pdb - Level4 - true - true - /w44265 /w45038 /w44062 /bigobj %(AdditionalOptions) - stdcpp14 - - - NDEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\DemoRunner.exe - true - %(IgnoreSpecificDefaultLibraries) - false - $(IntDir)\DemoRunner.pdb - Windows - true - true - true - UseLinkTimeCodeGeneration - - - true - $(IntDir)\DemoRunner.bsc - - - - - - - - - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - - - - - - - - - - - - - /bigobj %(AdditionalOptions) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters deleted file mode 100644 index 324de953..00000000 --- a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters +++ /dev/null @@ -1,6047 +0,0 @@ - - - - - - {747DECFA-60E8-6F38-F8B4-1FC9052FD677} - - - {67AC4BA4-ADB7-61F2-40EB-054BFA2565E9} - - - {8C2BA468-929C-4792-FBD2-3009E3068DD0} - - - {AC828C39-320F-8E54-0482-C033528D4EEC} - - - {E3CEC08A-FA14-D343-5BFF-3D6A4A4FD713} - - - {B3BC836A-3932-C1E4-CA3C-A1C0D83281BA} - - - {97F7F593-75F8-D6B2-DC96-C946C3976226} - - - {EB58F05A-A968-CEBE-40C4-107CDD8F240F} - - - {5FCF559E-451A-CB1E-B177-A5DC5A0005BB} - - - {05CE33FC-868F-AA1A-12B8-79C98E753648} - - - {D78296AF-218E-B17E-7F8B-9D148601188D} - - - {B96EBA26-E668-FFAF-FC53-1EC1337DAF5A} - - - {D8532E5E-469E-5042-EFC8-238241704735} - - - {777B5D1D-9AF0-B22B-8894-034603EE97F5} - - - {8292766D-2459-2E7E-7615-17216318BA93} - - - {9BD56105-DAB4-EBD5-00DD-BD540E98FE88} - - - {10472B2C-9888-D269-F351-0D0AC3BCD16C} - - - {BF23FC10-1D57-2A9B-706F-6DD8A7B593D4} - - - {386862D5-4DCC-A4B3-5642-60A201E303EF} - - - {092EFC17-7C95-7E04-0ACA-0D61A462EE81} - - - {285118C6-8FDA-7DCE-BEF4-FFB2120876C5} - - - {69ED6B61-9B8D-D47E-E4A6-2E9F9A94A75A} - - - {7CDB7CD1-BB96-F593-3C78-1E06182B5839} - - - {B0A708DE-B4CF-196B-14FB-DC8221509B8E} - - - {34F46ADE-EE31-227A-A69E-7732E70145F1} - - - {BB9B3C77-17FB-E994-8B75-88F1727E4655} - - - {C0971D77-2F14-190A-E2AE-89D6285F4D5A} - - - {AABEA333-6524-8891-51C7-6DAEB5700628} - - - {F2D29337-983E-BAD7-7B5C-E0AB3D53D404} - - - {C674B0FB-1FC0-2986-94B1-083845018994} - - - {0AFC1CE8-F6E6-9817-8C21-8432B2A375DA} - - - {0D1AF264-3AC1-78A2-B2A4-AE6171F9194A} - - - {9A5DB854-CFFB-5F88-C566-0E10F994DDB3} - - - {38A5DDC7-416E-548F-39DA-887875FE6B20} - - - {980FE2DB-05D3-5FDA-79DA-067A56F5D19D} - - - {F336DC25-747A-0663-93D6-E3EB9AA0CBF8} - - - {7D78546A-80FC-4DCA-00B9-F191F0AB2179} - - - {9EB3EC7F-2AB7-DDAA-3C05-DF382B728D3F} - - - {6B9FBFDC-1D10-6246-356D-00FF4535CECB} - - - {D6FCFC8E-7136-9109-78C0-91A3EB4C443F} - - - {EBF18AC1-F0ED-937A-2824-4307CE2ADAF7} - - - {5A0F7922-2EFB-6465-57E4-A445B804EFB5} - - - {4EC45416-0E7C-7567-6F75-D0C8CEE7DC4F} - - - {C2985031-0496-55B5-41A8-BAB99E53D89D} - - - {FB4AB426-7009-0036-BB75-E34256AA7C89} - - - {E684D858-09E8-0251-8E86-5657129641E1} - - - {1EF1BF17-F941-243A-04D1-EE617D140CBA} - - - {344DB016-679C-FBD0-3EC6-4570C47522DE} - - - {3D9758A0-9359-1710-87C1-05D475C08B17} - - - {E824435F-FC7B-10BE-5D1A-5DACC51A8836} - - - {86737735-F6BA-F64A-5EC7-5C9F36755F79} - - - {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} - - - {80C72173-A1E1-C3C5-9288-B889CE2EAFEA} - - - {4138B955-AA0B-FA86-DBF9-404CAFFFA866} - - - {2B4166B8-F470-F07C-4F51-D2DAAAECBB18} - - - {9C295115-C0CD-3129-1C4D-FB53299B23FB} - - - {65526A8B-3447-9DF0-FD5D-00D111126027} - - - {A54A1F5C-F32F-F97B-9E8A-69922B770A54} - - - {B90A44F3-B62D-B5C0-81A2-683D2650AEE6} - - - {DAF30656-5915-0E45-C4E4-54439617D525} - - - {9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C} - - - {9C713CBA-A9E2-5F4E-F83C-2CAB8533913C} - - - {63571A07-9AA3-5BB0-1103-0B42A2E6BC9E} - - - {314F43F2-BC8F-B464-EAE7-86B9675454E9} - - - {874C5D0C-6D29-68EE-38BB-26200B56BC89} - - - {86BAA7A7-DC50-35B6-910B-932AEAF257F2} - - - {6B7BE34D-1BC1-C7B9-111F-C55CA8250943} - - - {9B6B6D54-D378-80C2-8CC9-D1D8FB44C2A8} - - - {D0584AC3-6837-14F6-90BF-5EA604D1F074} - - - {794B64EC-B809-32E3-AD00-4EE6A74802CA} - - - {67BE498C-9E1F-C73A-B99A-387C034CE680} - - - {1A9C8538-959B-25E3-473D-B462C9A9D458} - - - {AA9F594C-DFAF-C0A7-0CCD-9F90E54D3A01} - - - {230BF784-34F4-3BE8-46D4-54E6B67E5E9E} - - - {39F680F3-5161-4D1C-EAD0-3911ED808874} - - - {3197198B-A978-E330-C7FB-07E5CE8236C7} - - - {ED064203-CFE3-44F5-49E6-0BE948CCC752} - - - {60B6EF27-E71E-E771-7B52-F8228C928B3B} - - - {0ADD7306-A27A-EDEF-58D9-1011038D943B} - - - {5502FEA8-790D-593B-7FAF-105304E7A347} - - - {AFB1C715-E4C1-6EB6-367F-D39E64A43205} - - - {114D3F58-5C40-FB13-D076-E3C9CA8D9DBB} - - - {F9420CA4-6ED8-1262-CB31-33328608458F} - - - {1E1A2151-F76C-B7BC-0CB1-10A77A9CF19B} - - - {F9646265-8542-9FD2-1209-55FA76076736} - - - {5971F265-ED75-A920-9750-064F2EE5E6A2} - - - {42F7BE9D-3C8A-AE26-289B-8F355C068036} - - - {7868764A-6572-381A-906C-9C26792A4C29} - - - {03678508-A517-48BB-FB4A-485628C34E08} - - - {07D27C1D-3227-F527-356C-17DA11551A99} - - - {6146D580-99D2-A6C8-5908-30DC355BB6BA} - - - {C67003E8-BEA8-2188-F4B3-A122F4B4FA3F} - - - {09B91E68-1FF4-C7ED-9055-D4D96E66A0BA} - - - {30B3DA63-C1E4-F2EA-CEF0-8035D8CBFF64} - - - {4F24EEED-AA33-AC6C-9A39-72E71CF83EF0} - - - {0F70B1A9-BB50-23F5-2AE7-F95E51A00389} - - - {D4C8DC40-2CD2-04B6-05D0-1E7A88841390} - - - {58BED6AF-DB89-7560-B2B8-D937C1C0825A} - - - {B958F86B-6926-8D9B-2FC6-8BFD4BDC72C9} - - - {DB624F7D-D513-25AC-C13C-B9062EB3BEEE} - - - {89AA9B6C-4029-A34F-C1B0-3B5D8691F4D4} - - - {1A7F541C-B032-9C66-C320-A13B2A8A9866} - - - {4BAB7C18-51AB-0D9D-83CD-9C37F28D2E38} - - - {5523922E-8B0C-A52B-477C-752C09F8197F} - - - {857B6D8B-0ECB-FE9E-D1EB-D5E45E72F057} - - - {BAA582FA-40B7-320E-EE7A-4C3892C7BE72} - - - {89B3E447-34BE-C691-638E-09796C6B647E} - - - {9BE78436-DBF4-658C-579B-ED19FFD0EB5D} - - - {21E7FA61-9E0A-4BA1-04B7-AF47AFA9CB8B} - - - {632B4C79-AF7D-BFB5-D006-5AE67F607130} - - - {B10E20C2-4583-2B79-60B7-FE4D4B044313} - - - {CFB54F15-8A8A-0505-9B7F-ECA41CEE38E8} - - - {911F0159-A7A8-4A43-3FD4-154F62F4A44B} - - - {53CF03D3-988B-CD28-9130-CE08FDCEF7E9} - - - {29C6FE02-507E-F3FE-16CD-74D84842C1EA} - - - {8001BD68-125B-E392-8D3B-1F9C9520A65A} - - - {EDC17061-CFA0-8EA0-0ADA-90F31C2FB0F2} - - - {B813BD14-6565-2525-9AC3-E3AA48EDDA85} - - - {DDF4BA73-8578-406D-21F8-06B9BC70BFEA} - - - {73374573-0194-9A6E-461A-A81EEB511C26} - - - {5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E} - - - {9D5816C2-E2B2-2E3F-B095-AC8BD1100D29} - - - {3FDCD000-763F-8477-9AF8-70ABA2E91E5E} - - - {0947506F-66FA-EF8D-8A4E-4D48BCDBB226} - - - {E4B6AED3-F54C-3FF2-069F-640BACAE0E08} - - - {D5EADBCC-6A1C-C940-0206-26E49110AF08} - - - {D27DC92D-5BEB-9294-DCD1-81D54E245AD5} - - - {BCD73D20-42B1-6CDB-DE66-B06236A60F47} - - - {20DC13F6-2369-8841-9F0B-D13FA14EEE74} - - - {A302A8DB-120F-9EBB-A3D5-2C29963AA56B} - - - {45489C2A-6E0E-CCDC-6638-0DACEEB63CCA} - - - {F1B90726-DB55-0293-BFAF-C65C7DF5489C} - - - {2C55FD42-0ACD-B0B8-7EAE-EB17F09BAEEC} - - - {B68CD2B2-701F-9AB7-4638-2485D6E06BCF} - - - {B0B7C78E-729E-0FFA-D611-82AE8BC7FE2C} - - - {0A4F7E12-220C-14EF-0026-9C0629FA9C17} - - - {37F49E10-4E62-6D5C-FF70-722D0CA3D97E} - - - {160D9882-0F68-278D-C5F9-8960FD7421D2} - - - {4CED05DA-E0A2-E548-F753-1F2EF299A8E3} - - - {46AE69B8-AD58-4381-6CDE-25C8D75B01D2} - - - {E56CB4FC-32E8-8740-A3BB-B323CD937A99} - - - {4ECDCA0C-BB38-0729-A6B6-2FB0B4D0863B} - - - {294E4CD5-B06F-97D1-04A3-51871CEA507C} - - - {77228F15-BD91-06FF-2C7E-0377D25C2C94} - - - {5CB531E6-BF9A-2C50-056C-EE5A525D28D3} - - - {E4EA47E5-B41C-2A19-1783-7E9104096ECD} - - - {B331BC33-9770-3DB5-73F2-BC2469ECCF7F} - - - {46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC} - - - {D90A8DF7-FBAB-D363-13C0-6707BB22B72B} - - - {8AE77C40-6839-EC37-4515-BD3CC269BCE4} - - - {0EAD99DB-011F-09E5-45A2-365F646EB004} - - - {F57590C6-3B90-1BE1-1006-488BA33E8BD9} - - - {7C319D73-0D93-5842-0874-398D2D3038D5} - - - {2CB4DB0C-DD3B-6195-D822-76EC7A5C88D2} - - - {FE3CB19C-EF43-5CF5-DAF0-09D4E43D0AB9} - - - {C0E5DD5D-F8F1-DD25-67D7-291946AB3828} - - - {FE7E6CD5-C7A0-DB20-4E7E-D6E7F08C4578} - - - {895C2D33-E08D-B1BA-BB36-FC4CA65090C8} - - - {D64A57DB-A956-5519-1929-1D929B56E1B0} - - - {5A99CC24-AC45-7ED6-C11A-B8B86E76D884} - - - {7A131EEC-25A7-22F6-2839-A2194DDF3007} - - - {EA9DB76C-CEF7-6BFC-2070-28B7DF8E8063} - - - {3C206A40-6F1B-E683-ACF1-DEC3703D0140} - - - {DF95D4BF-E18C-125A-5EBB-8993A06E232C} - - - {118946F2-AC24-0F09-62D5-753DF87A60CD} - - - {07329F9B-7D3D-CEB3-C771-714842076140} - - - {08BBBECB-B0D1-7611-37EC-F57E1D0CE2A2} - - - {268E8F2A-980C-BF2F-B161-AACABC9D91F3} - - - {A4D76113-9EDC-DA60-D89B-5BACF7F1C426} - - - {1A9221A3-E993-70B2-6EA2-8E1DB5FF646A} - - - {CC2DAD7A-5B45-62AB-4C54-6FE6B1AE86C3} - - - {599138A9-EA63-53DD-941F-ABE3412D2949} - - - {422A4014-8587-1AE6-584F-32A62613A37B} - - - {9FBFF5E5-56F1-34A1-2C85-F760DA2B1EB7} - - - {EEE9B92C-AD26-4BEA-4D95-3F859090EA9F} - - - {B1DE8DB1-C00A-12C0-D690-8B3C9504A60A} - - - {640F6C76-C532-710A-DF73-582F2350F6A3} - - - {FFA9DA63-69C5-A392-4EEE-395CD07733BB} - - - {D3DCC9A9-ADBC-E37E-3CAA-43B3F156B8B9} - - - {409F7733-AD90-6113-85BA-7136DD178413} - - - {CB8DF3B2-0409-6D59-C5D4-A034EBB7F973} - - - {7774F72F-C951-B8AB-E927-E34AD23C52C8} - - - {658BADF8-7095-C722-F9EC-9F36E8818187} - - - {2C58F450-CD01-0231-2F16-0D4D68565164} - - - {FE955B6B-68AC-AA07-70D8-2413F6DB65C8} - - - {7ED5A90E-41AF-A1EF-659B-37CEEAB9BA61} - - - - - DemoRunner\Source\Demos - - - DemoRunner\Source\Demos - - - DemoRunner\Source\Demos - - - DemoRunner\Source\UI - - - DemoRunner\Source\UI - - - DemoRunner\Source - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\destinations - - - JUCE Modules\juce_analytics - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\synthesisers - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\midi_io\ump - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\sampler - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Rope - - - JUCE Modules\juce_box2d\utils - - - JUCE Modules\juce_box2d - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\filter_design - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\utils - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc - - - JUCE Modules\juce_product_unlocking\in_app_purchases - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\native - - - JUCE Modules\juce_product_unlocking\native - - - JUCE Modules\juce_product_unlocking - - - JUCE Modules\juce_product_unlocking - - - JUCE Modules\juce_video\capture - - - JUCE Modules\juce_video\playback - - - JUCE Modules\juce_video - - - JUCE Modules\juce_video - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - - - DemoRunner\Source\Demos - - - DemoRunner\Source\Demos - - - DemoRunner\Source\UI - - - DemoRunner\Source\UI - - - DemoRunner\Source\UI - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\analytics - - - JUCE Modules\juce_analytics\destinations - - - JUCE Modules\juce_analytics\destinations - - - JUCE Modules\juce_analytics - - - JUCE Modules\juce_audio_basics\audio_play_head - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\native - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\synthesisers - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\midi_io\ump - - - JUCE Modules\juce_audio_devices\midi_io\ump - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\coupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\coupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\floor - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\uncoupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\sampler - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision\Shapes - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Collision - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Common - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Contacts - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics\Joints - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Dynamics - - - JUCE Modules\juce_box2d\box2d\Rope - - - JUCE Modules\juce_box2d\box2d - - - JUCE Modules\juce_box2d\utils - - - JUCE Modules\juce_box2d - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\filter_design - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\utils - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc\osc - - - JUCE Modules\juce_osc - - - JUCE Modules\juce_product_unlocking\in_app_purchases - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking\marketplace - - - JUCE Modules\juce_product_unlocking - - - JUCE Modules\juce_video\capture - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\native - - - JUCE Modules\juce_video\playback - - - JUCE Modules\juce_video - - - JUCE Library Code - - - - - DemoRunner\Source - - - JUCE Modules\juce_audio_devices\native\oboe - - - JUCE Modules\juce_audio_devices\native\oboe - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7 - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_box2d\box2d - - - JUCE Modules\juce_core\native\java - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Library Code - - - - - JUCE Library Code - - - diff --git a/examples/DemoRunner/Builds/VisualStudio2015/icon.ico b/examples/DemoRunner/Builds/VisualStudio2015/icon.ico deleted file mode 100644 index 5fc937a96670d5959e8ef8f54fb78aec9649d56c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45126 zcmdSC1z1)~7dDKFfS?G7gaHWBpdd;}D+kfNOyPV zLpSs7{ov!_c#bFD_r3n_|Mt0t*?Tjy*1gtVGqYx`;fRKI2n`(#4-XBhDbSvvqoIkQ zp`lSw>_5jr?~|c-EG*xjsnO8xpN1Mh7u^1qAsX7=bu=_O=oxAXz1e>cRcHcGzrVX~ zRJvT^uWd#*ohQ(Lm?k`sDv+Fld2;yc3z}uM_Wce`N z58!w3@8C9Y+khX#+Zr%{Xuy4746saM)xNvw zGu_C(aDU-%fxxIE30$v>0vEbEK+fzovM<~pF0n(4kSxBCEKba@UfvBBf!VDUU^h?! zB%uC+)xH3}hSuhgbYyEXfM~%qvae3fI%q@e0=N%vrK=CD=j_1*5R!urikh`R{cH`8 ztqVr>NByW==mRPZk-)CA9E8=b0Hcf*kTNg`$>7!kf1jdm7x3ZBF=PqK#sSjhrl_tz z>g~N<@NujLh~%UIneasr-Z&3<%UzcL*#88ODSz{$AL{1U{arf>$G(D`y8EEH-y4i} zCxM3*9;j}}x^kf(s8mM+!;E4O)36G(6PH0^-#-2y`s>LBRUf!Pi6xL+Yt#zTuzHt9nX_`pA-%s-cb}u7AebEfEFWet4 zDOs~Wz8`D@DEn#6Hb&BDNKgcyqKbjPQXKGCi~|)P8-anwEV8es(>yR}{mp*h{wVu} zZLp&y0jwj2L8x{LvM<~}$ubYLH*JB0v>Bie_5Im?Q8Zv2sPXfqt^wqy)gen>OY>ij zAGkm2`nTg3aS{!!=m;8`^`ZTOqVua7)ei0h_l4&f3aAJ`1)hK4%Nm||{=JcefKzWaNS|s34U5B|Z*>M);CuL;BlJ7C4XXWq zUw3<$)<0y6Y{p;dNdfh(N72!4jsd0fyp0p{^%81}#SzRuzHqZ^CBs=w^V+5@jYp2Oe3*%o{hr==#b546gNmW)J(e<_2y<`Wl4f{+Tz-U%oXB6wY=5 z?(QaVx_|n2dSHfR-++{E_I*7?t%)cMgODCz+WUHNw?C)@c$}c@JZriYL{GN;PHvd@ zoyG(pSmlk<9TCybtZ&0x<1;{;nGb$0j^h;rCBlJ|fLW zzq{ZM{6%W_zu~8edXNMaiEru=2j&6uf_cI^ zfafaI+)_T@hvc6#H-NM`SZ-7i{`LXzK>hZh|KMv08WTPP1>i=d2eLT#<^!?9`Csza zg6t8#U>-1knCGP&R~+Pg2|Y{Kz6ZMy?Va6Cu)Dhj+21nKZ<2&;AI9)Aeu4p2LDceB(VcODj>O(8uq`DV0joYZtew>kZ-uX3qZrz zHVA^`_b*=ubE|tuUi{fO#SLm%9&tUq6xGF*2X>Px-?* z9v3P8WBw>C4T~d4K4O`9KlrP~EhBmD^LJhPzs~<3=szr%7`&)@{g37USNgB~&HhSS zbbshSIQt~X`X&jwMn8hBofY8PoAbB)VPE{9{h4;80;AlCAG(L_&$aOP_IGgnZSSmu z_Ms5aGnN20widwd_BxpE%ml3|TEH+(`!D$)9Dg@cf`N)*GbqYk2Rl0eG(zLgGJ6%6 zd|m-V^Si$re?QMZukrKT=k<4>%>57iv;A0rbb%!j13Y%`eDMMnX5l~fGG!6 zVaTs-Nq+nX4ApV+pm3%WSldPcKb8GG7`%^yOZd}Num`QduQliXfWgjq0SvDE+W&z0 z|LlKF{RxKo!BWswHuytk6mL{L)-eqdqgH;$ALc!}wEVaJ7g7gEzxy};a|psPSndUC zLWMwoi3{@k#TkA1CI5<;1~5On3v`rcz$L~ znZM*;8disF1CO;$Xubcp{`Wot$QJ%$|1sS^53;?=K&)XF2z!!>Ebx8ayGpQzfaV*B z`G2$jKw;Rohkv*Kg7;?si~Sc016;#n6P_PXJ|aB!{;t4n;XVg_+=Dd#ll$N8zxUUy z|H=Lv6deHo4Gru-pM3)jjU0i7c5)C64YLRh?Fd|~q3{7*(EjCx>R0rg&LBh+rVaCe zdBHqk-f*0P1uAM#`4OjpVyFM>OQ_cABy86=s@w(nE8WeZbuSUB>-j6)#-OtFy+HTw z_1}MIzTei90`B|2#`907Vlb zZ`<)#yO2P-^n>&|2*px=#83`k``dAJu->LBf!NV0`9E!zk ze2+hELTj536l;KEJycNsfoxz7ocmtjd-xq3hY}x0fKEt8_=5YwG(sR+FwGxw?DK-g zysP}rc>c{ZUzLXzq>n`uUEwM(pa;dAyH=(k-aAm-0onwAzXqWVF&wu;#f<){mKfjn zSy6rAx*MVi=VM?VD1K1A2xDMqwZix}xZ$?Yc+!OWPoZeZK(T=sC?7Guy#|UGhJo)$ z9r!TT1Ugpdkg)?;r)MEO{}pc3@5rHcDBooi+V>Yv?SKYo|FN*OiR1zELh*$$z%u+B z{NHWnhu$S>{6WcF4_MjRgkp8I$e1Ai{{>Ecyzzhn)#wrzqHhz`sP=6OJd#eZr`$gx`KI*RHm@y#DpA_gEkT>-|uML*(B zsQ43H*FgEV70AbaGQIq__{pJhP_@1d)}bNb-u}n9*vr}tFt)Y_Di;Q!SlaJo82h_1 z4bNK;?o_Dk!uVyNd9HN62aH3pBJ;iyAlbAZvpR?!zIPp}M%qIVG}ru<4V{MKtLjiZ zdl8bg1Io!gfOLK^mI&XA6+rvhdPoMyu3&!?#(>o2{+LevtGN|9zki=2;c*l@_6=z> zMv&emet{jvFVma^%^~IBd1n^5)LH_F`^NwDJHUC-Z72Tr{_Ui1>9Bs;9^@fAnyGw zCkv0=o1+MTfOY>Op4#xN=>olBKM76nF^A7Z^PJ>ox z&#m0{`Iq?N*z=9=v1@q#e$o;HM4@#Rro#ux#8wv%DBJ4*QQsu;dwhg)1e?&5Yu)r~ z-5-=i8j1;)Kywp}1;&KJ2m2ZazX9w&LH^Vr>h}>NmB^{NW^n>2v}XJgzgWX>xtQYF zZZHSsq~X{cEC-4fZ>0}lt%vfLgTqi9e-AV->;n1HKid64+z0RB_&W5-0E`Jm6RL;! zYrKB=e6SCQ^2OxqgOFY_dnY{3jgi_{BS?`g7bL(gT+XH4Q>a`4?w6q8VDDE z1Gfqm{xJ8TWPs!AN@Z)nw{sKB!pRrtf^`C8gK5CDpz?{m$_iJo&XxST{|@EEd_dkz z2eSPx6tiC2fYwQ0Iv}TFBlt)@jL!Ou5wp$XzwHdJtKWH*cTjLp9hok z)gZ3;5)?DVM#j$j##6xB<_sjuE|`X5;C>_ZK)wA7xKkgEqy^j0ukat_59helnML-U?5mp8%Fv&15iBDeW2uD;fH0JgzPwK zv>H5Y2u0};+=p@~@Vk!rC6L#>1>QmV5dG9;AQ!Qpn}F;073*MSYX>}qFrx56d5<>& z)$R$XXZQZEU~1tTh$^`7JN&48MMw?-h%dPeYP%i5`qn(ihx7@LnSZK()VF}g`sn%s z@E$1mu{H@+c>?L`5Fnji4`d<`zl&|d@$JX)OQ2_F2Y5gjQFtM{kA>#aANlO$i3ZR= znSspjpfLZc4$nIe{OSzi=h1%)fH}*Z5&MV81p4I%lBX7=fgBqc{*q z#XvFd@3}3wR*2fSEg0hu{1xtl$oR&0{B_WIh1S6!WJs|91X??FDtg;}_1Ih<-nV@NdWO&-3T(ViWjSNc+?H#fHZ8DG*ag1HOEd z0|S$p$b38;*ZI%p&%HmLKNX-eaVpsj;C|#E=T8l2{_LLq$9CVCCfcfPPXp})`2{xC&{9qYKtlE!x{2Tql>sRzo>z8QG2jJCE z0j3~dt8aD(#MEs7on$EIbzuIn&0PhH8-HBCpndTl{0I1)!!oqaB362lIes|*311sa z6JWSH5Y&H^0hIw9;C-a{zp@{s{{YRADE~pA*c04x&jivkec;){DUcMi0@lBuO_+xK zhfmF$zzWKbhCq9K_g3|X$(xYry}!aWj;*5%bmTC5c^yFu>aQi zlm8}A>;;74B7lTOGmyFQTTT_uX==*NfZU8VWWEW`_Z++q`fsq$3Hxt<&VhpLHL$(!{{PZ{ zhW7w)9Q?=rrEY)!0_VuP^DH3jbpHtd&-<5;@csp&h1$OemwF)WKC563DBqp>CH8}| zJeHjXO|_fIPk`LNK=k0b{^0%v#*d8U|FnPHf&ApIoc;5y2X%h%J}N{22$s7dX%<1g z-2VP?_;>q9;UW*966FtEpG1Sno>?$Iw+mjV?w^f4i1p9zABaqWtdvzG{@?8%q1gS; zIfFm!-=Vd9sv{kgzhnEQ{xhL-1d7nvVOS?W@855fx&wue?|_*_81Pk%Mdmj1{i~4Y z1;XC_I-h<}j)xM{;9KPe=>41hJNylPj-SA>)MaST)%nHfm-vez+X@a70pi8>NEuM; zxLBSiFt!Z^Ug{rzmy?aw%K(d0%TPXk`ybhlw*vw!tZn?G_z5h-&+#kx{P^bP3TTX1 z0Ht2^zm%i!lNtycsQ{)WiQuJs2=G?l*EcGEj;e#yKY^~&L8LvH>ijXEkJ7#D%}Ma) z`8-%z+d-aTKN!D)F~V5??D|#waBX1-G=Eb4QyJj1D0BUVU>nL!6b99R0Hyff=^TX} zRhNX-f*oidm6N{qr{4g^ZuM#&jF0a8>-Zro)1Sp};XDv51Ni&Pg7?*bsdtndfe#bFbl)6Uh1OGF=SAo|#Qqt7l{-_w#|eS7 znLotO;T#H-2SVZdC-txL7fauLpUJiqusqcUEz2!5OdKBy%E*jC^I-^1@Bbkaa6be?Go%3r`2+!v++=K^7xsQDMFcOk!W^xxXd zujE6H>3@(vU0GfSQ@wMb|Jw-CMp|-vKub;!^1csx2cMBy+t~d7G=GYc37%V#>%&j^ zYglKf{IzCt6!dotIUo-5eg2rg{)Wt7!);Lc>jU~m>3$aG@mDz(6rTUIMy}JyzjyoJ zogaXFVJLPF;V$t>I_r)Dxk*~bABVJ{wvaxZr6fd8V4uN;xSSBXB_xdm0|CNw$znm5Io4w*G&Bk{F(E-&li=BW(_m%IciA9#y1n={yeCPiAvdInh;79*>;0x2G16KYZZ=`i-^d7O{oC z%zm?m1<$daQz-&(QD_Ll*uClhFGsM&ugN#WK#WgHF`j zyp`g)$z+7y7NO6gRO17@%&dhd$v*c@21u9}$0sGd%gs%;yvJzR8t*hI#S?HY@Iq;y z&AElxEF!kN7jHie;-+{g23k~VbzO^z5E_xSxkI=juiE(Gl8BD7Xd zpoKETo0<@YySNM~g&1PRmot*(!RQAx+uiaZzYox^5l! z7&j&PuVRbWCS#OL))+1Sv-A5`q>)WTW*JC4lACG8ZOk0#})CNwQxXPBtCge<jwvVU<|IGt?ER%T+sw1%{P~k1izNxU!NOk5FR>}u&>P8< zcr$q(DFrw`ilL}`&fG(NXZmbk!+^FQAR_Tdo`j@=jG?fLgQe@BWcxLus!(7kdd8wW?JZF z8pbYFELwAP7ST-==67ewnO%$&!_v*iUE?n46I@?0LvTscJ=+$>H*LE6rVx89$C&KB znHHmAVimpZO4W&8J}KepX|Lf|{&)3x78rW8lL+Hp`e6IK8h6JcY*;&ny(-b1-^4y{ zrAQ{9k(lhEoO+LZlu&?N8MLMch64)!9C>@5207}9a`JeS3W9qvGAaxAy~y`k=ykG= z8^?-V;W~;Sla*nm8?YMx9PjUKRoo(ut`W<#nKN;XK}y!mX_$*-({5(UxWJ&fo8w(_ z(bPH7suPo!a8njt+xfYwowlEMj7hJya`f)jcyp;=e5$b1FEcZsL>!t+H9=((6nvQC z^jF{YjgiwvQUx}TVsaJ3x!6G5jiOWH-HX{x&Qt5$lKlA>h-Lj`(0a4qD5SE6KRDZC zemOx0$!xC>+rp>js*H z_<`+G!*3qN2o2f#^VP-NwiN0k@s5e^)}oCGluwlWFgzo8c!HV{SFv}>2{CG_Px_5~ zDY5I0wLcp{W$CoGaiN>w?p5LbLAA%H?xsC2I~VX?=_CmgeW{aR8)?&RK_P(^OP=IC zM{1p{m_2q|?qE$m7VPjWqEinoUxu=-UCV0NqU9JG^W>3HWl@is_Floo|9pcGgXUf! zzq7&7*n9Y)B9`IrcLYcspWC#y3o%%kJZYj@=Tp8BN7a8z^y^!PsTsWogGrt--v7`(@e z@#CcBqjrh+m<-}-!b&%6749%8N+_5deq?olvOVu`zo=BlK=~s%{p^&4OWs0f>zeX) z^(?G;p9jS+n4Es_oatBul~@JgHGjHP(yzd{Za7oY5|7Eoo69G?%J8iJ1iqMgNBStp z@#roste5QTZ{ei8VUuD@Pfe?Tr#euUxRzSY(eolMS*V66n;yUrmUHIDU(3{cth5~U zwQc9{Ts4O5X(}740TPMaog*GI(+ybLg{zsHCyjA+95Di$cyr$jA{0UHgami>{Twmx zsp%67MFeRE`800m^f(e)Tkl^5DyF|*+KG>PScT~ld2ZIkmm?@lb0%W@soV3)77~AY z;WpCt0%v^mzGQ`<__J?OMO()P@R9nk-DMGgPmGmmfpI%TT#YnUgMOnd?B&?tm$>8VxIVG7Tg!O z%UXR}xC*ARD@NPY+)`$infQ$6u4D*HujzDzg}lE>Nl(O-w)U)MMbn%W24_Jn2O;V&X31z4J>Ib zj|hd(`4b)wqGS=_d8=)a9l+iXB0>`HpXWU!BGP!QyAswp}V<^pLWT$EvE9IW|t9{7%7_;k7IZr*mfyy0{^K;W2)xmB<>*2Y(xH#6VESR zA2wknHsnb?I&un+OT9n#)0^|zs!5F3#}U{9c^;GqA8ZdwKD%S`8_Tv)n}qg+>K`dFb0_i7MhgZwG&?0kRHD+#9s zo>P3;(Bb<;)-arH(KE~{DXCKHJnetE?7Y@fh|ZlXs$H-kDCTkm(T zvr}bFVJlbnKTmgIm}a2%WqfZurJkVGas0NGQslPDBk)|8@AYK^S_f~07lUnbmsN;j zzjilRipY;L6=RWhln(2)+{V^1Tea~$a_Ci}Z|gIM$uH*~(rzbRtbCB9CfKHZY}+;C zjakED=T@T#`>p}6N6;M=Gjvg=0%BHM;`R5bug~D5C^}poZCE-l-9YK{WT<>A$TWTr zmmqn;$x6dXs)u%a*kEC}dYd7vU^0@sHzL=7o%9`c_3A;9Hjrro9Bx+2M5TqDCzOQ=@7W4gSxaIzEjZ>m=nXt+ z6ip3)p6OH(@YWv)T)CPZt&ZUo#|S#JMi*66e7p&}{K%pt4z(sf)FOU6rntHi)~bQk zzHK|K?#z-h9K}Qm-X@dsZanKy#T(DTgv=e;wm_u@Q zi&`m&yc|!2)O<$SEj+rw2>I(F&n%IRZ*5-&bLZ&>WT#14Z-i5niN44-!3(zSi=s;o7<{*tXQIB|V89E) zm5!*qbIdyPjc+@VmM7gTn$ZSdW$pIqoV_W{3>Dg(_Oq{ti2dkfZWAr#Y_6w!DL6b<09T!Khmpl-(bnU;Z!Q-m$(Wu z)A0$&B`rP4=OFK1*Bd4J*c?Jf*?oDx%^uEUT#W|Hi$RAG7Xt9h4g zkDe+kC2bFWEZU1gi?^9Ny~QoNmZo=9&a=s{<1^{DREv6Sa`3T_Y};jJb}(WmnVr3- zEhK@fAj(T^M0ewgKS{f#{cgFrZpHd$6)SLfemyS>2NToK&~4zd=iC`%#EN$ux`^Ll zNJqLUFF5;`48Hibnqxd2f1sSOM5|x^)r>Q1xVAX>=o`^+3suG|!w%(xL#?#ZdmfLn zoQ{^Joz{K{wSl|1I}@(mf=Jzf20sJgGUn23;^O%Ielqcv4VaET|& zw#G-QBV?q!~>H>&W#f* zM8_DSnXKzcB3=b}Th$S>nr>P!C<#AxpC6g;0Nx)b4`DnFj8yN`>?&vxxe;81U_cWt z*e;9LxM69QG%@uWqnI{=^Uh_3iY}SLuFU+74hri4WA=>c`179zIwayRYbIacGCCKC zCQ@|yhGSx<$VOQ!>&|YxFWqJAwV8-{GfiThLbHK;XAf;ilo4Rph;wdlGqM=HNm10e z*PXo0mA2h+Bb2iALy3Zfl9ry5_C8bh|IyUiH zj~SYc^c_x|Ox&Kzm1JsIj_0$k>svf1Lio=BH2YVxCGDPp{f|DsF2p-kU;>fMxf!BN)|U5i0YhrB0KUg1)&mSii= z^Iyo1@f>MfT2&lw_gx$iv3UBl4t*q6umWoIwMW1zTb}wC7yuFU_qoQaU)7<5Vxp zrRR@L6<0A4`WXyoXZS0#PbFU~?BimJFDs2idv;o;m1Wb6B8>K1gpY0Um72;}m2b66 zC)ckx`nC42^qoD4$k}FZAvIWfpJhvFg|1o@!-S zHqCg;_n9iv=lb1Q<>f?W{r%U7Kw~ePOh_E2d&h70TjN`0C(R}rG%5}3L2k!Y!o@gqyTPh8inVDL!GgRJuw%_==p#zqK*X3f(S9;pIXN0-V zcB`9jWd&@G%$$&K&XdV0jGp$R0~?L)pSy8Ndc}#Oj-7w;Wj1`MT!ki>ojECt*y1Jg zeE;|!_fE6$=_L!H1*;F^g@9;2!r@^MPD!V2pfdZq(T##x$CHVe>Qg6r5>EyzD=BeD zU*YoO@U>kgJ4=l9UP;AKpWSX=ri6TAnCpuS!5L9i>CXm|jM{saNA#|WV$2=l#BSg) zS}OW@#Dar}E<~z+!}lYuw4MVwcY|p8%5*`9m52CjyP0=-G2OL2GISp$a*gwyqS;Nfh8)pYCZadz7Hwl23NZk}aT zo(WtRJBtTnyUP_vl=UYVITwqKzY@71^0kfd#iNI$W#8uyqnDj8ma}3De|-CBL?mB2 zlbk_M&#f0-hw7y?MHwDmm1r5TbnTq3+|pG!_i22X%lL600iIxR^nF*I7kLoF;-ru@ zTnC{;ag@xaFPT&AnQ#}3>vyKGKtpJEH3wPWZ3@?!-F_)GaUDNQ_Vbfw^o&xnDkU2- z9*W;5NJe=TWit zT@7B=Nr@t8Z%XR#^UAuR2+VMg`sHa)CqEH3Iq1Xm1QC zG3O3{d>8u7zoJK|;hv{&XgAx_F0;*8du3?GB+QIQ>ayD1WA7y%ornvnHZ!p+Y~3Jw;0~m zBbZt5;z^Wbf#&qlS`fj>nbnb%7X7Vl{l#!r(uoZR1C{eEB`K=C;-XBvg{8BS!6p~0 zpR7d5HUxRyztC9b+7PvfFLj1l4S#!CQBem_ouFp%m#p6**QM%G!i`SH6!(!Y1Vg#L zws!I87+;D$p5MtW8lE-XIf_4~(UKCAphlCQM5itmpflfBtC6RKb^KLDNEF_ybC#R4 z^PjsN#g_xkyKAFv9Lo+N^X0qBmXwty8hU5|i{4}KixYo_cYE%FF}+RbXCEm!7GKZ1 zg+$)1#eNDG3@?tTr`f4C)E~{$ZX_%+YzQ$T2(@I(6MbDN&$oGo<{i_lT4cHJ06!QwoPN_zcw<$V>@m(9-OOt2M9!qP6!bRZTP>?>?j|3p33WKUQX@OM~Tm zn<(9U>6*X-(M>A^&oz^+x|vY!x#&+SE4;^D%$2`9G7U|7={wP^)Gk~ob)Cy}=X7oS zj!8-hx#S!3)&4r3bneqi{L&S^hmSRkXg9=YA02%+$~N_RMXTQ1WrA*m=x)h0^$}n`$7);!#=Z0ssq}gq`!G?HaEERfn52u!im)2~Z2>tPO?=oY|Qev;R zqYs`lkH<7VjXk4bIc)mjoeqwJ3&Ny6%=CQLl&LixBE&K4Wsg6`4wbyxaOm(wUjOql z?Gygtmq%lFrOqaC78uAt7NLuAcB0L973-iPIQ zXi>iv$2)9fy{xV5IWWyjyB#YzJGh>5UM;$#4GX6?E5>GP{E4E5#ki>FS)ZuS>F&hF zq*gVpd~eC+e0si&JRjKhAW)?uEEHa8NSw-E^ymBVmeZ{v{c;9k$#*&Z z>9NO#$JE>`POva4MHJk&^_1AgJzDJYu%~Zz$~UiKCdTG8ECl>?lMB{ zbTP=8D+!%}If2OC(Vn7z@*cYS@e!gsv)7CAjMa_zj@Gn@hmaZR-ke}wCotQHco=jV zopEFG^FsLJSoAjmcj~5n(mr{I;Kx**nDIZaVLmPl#RIi(&e4lWkOEWxR`cWzqqFOu zm#Vo{iz_Fc!>=87L2R6+mA-c_oH{okg!yuM;;I6!@IW+MmxD2?=`^qiGcXgO*A|$OyFL!g9bXj$Yp!0b8gzcT(Q^+uT zp8H~5&*WJHpzK08GCte9>lm;?v@_y!ttb87Z6?N#xrh0$?rt?dsPW}pkA(EtxCNeI_E~W`wn#>v{FxMNFY?lAy$jb5agLdq zGi#1M=W;+Ko?;0pz>mRdy+^|o;@`gF)0ulzZ=H{ho@B>E6Gx84p*=-Ke9E0eO-^>T za|L3To;N4F_W8MBHA}G=9;7GNa?jKC-zsK9PK&DaFU3rpWgVcwA$qHZ|2fM1S$hgr zXWxQ3UA#J3K!1+6|1I@sw{1TBqMKaF>PNIC!TG(xH`hG|IG#55!dOSh z-nrbh>or14xk0i*Q4vq@BX3T|c#NY}Mqp{DZN-g(3XFeJwd%i=) zWB-&|DM!EGldgWiJt1tCS&^`{q`=oq%- z!D5|7vJf4xBr zY_42<;gCG*Y8{t4saIb_JliwXwm85s#Ln)~n-5;6F%!(F(&$f{e`-!A3vy@V3}wb7 zzc{2>z&2a~!%m?2S{oUyZg3E>189MeBZpzFgx9h2RikR_D^NunOf1(HEAKscD!bguOgBZpoo<|sBM5D=i zN3Kdrl%zJlN`IuISj!CPe8tV`O{E68J)dhBo9W786{7j#7^gq3QHj%HrjArK*+XX* zZ#Nk95p}xz;!ZjK@kmO2Zl60`Go35aR$*pjbF*BX(V%|n9uc8MH1r~+Ir+#w$zUpwA~kaq90H%S)H`i z6AHc?#LINy&BB@C2Hut#HhK1`MD&b%LKh7OpV;89_Z+c^IwFmROlKv3i}~=jEhaH3 zm^IB`?Xr^Pb8qwxo+X-ctukH1b(bSdVdf|K62I^)MO@6(z&roN_eem$=nU!Ertly+ z;qV06x*%)*%Z+ABJ`68z^42Hzi0JvqNYddQZ`{jQjZAyuS!ZiRrhVsAd0V?~Z*%sg z080?qf*~vYM&Ph6{lNXpuk!A*v=Ux=T=BkT%HX4HoWZ!EK2kT4Q z_M{pTu^;sx-A}-ZkL45JToWkhNy$s3?BLJTr70;tlGBxkPf-!*Ti~GiWaV_ z?<|(P1xk0VZw(ka_3u!)k=o{hQeiQtDss@RV{WIZTOYh~tx8%Kt)v`guVrO%X!neY zp`jC22Uh+q-4AqP<9@0Frj{L>x_w@+d7pI@2&-Lvy!o1yuP}5N@giEa(zW1Jagzw7 z$G3afOXk$sxt_Dz1W+cX{O;9YfOdBxrIOk0Clm^g>(ovb+7#PIWDPAq8XFA=@>Baz2*Q;yhs;WCtAyBArF z%YLo56lc|na{9CP^$b2GntRjNy`6iU9;Un6224n$T3+|LWmQ?!>2S=oMai~eZ-bVO zekvoiB2MIxDxUVYM0r=qxtNI5*TVsw%^O(N$2E?$%A6LzM9-()wf;;YL#Hiag|emjsn052a z?HeNq1wp2fO7=t8hc$y`mrawe?-@zN&Wuf}mUt+r?>8Sak%ww3;o6 zbe|aJGeRmN%i5o#ky6j(+`-z^H(F8IV;*HxzqeZcH0JKQ3kBsUSE#X^)$rkFX|&AD z_ciXGL|uG3F%w$jIrzsP^{5N3YQK3-?4GClzbarCP8)3$e>6N(1O^UUiZ6fE?-%Y81j({&S-Fohavb@6+-(7eW0MLVLMec2Q_TEJrcShW+-; zogvavgDJJ0#Df=Q-MlaRI&kDRaPK~uiyuo+_KKevfc*AK%Yu$fz)g>}f%U;#dgP-X zMziF}03PuE(^?dd-W5hI;I|w*ARtI#Pe87=@J8^hd^uTG$QmYD-y(0Mb9?AJYX;{I z_K_DoL4AB~k9BcCZ`XUNHyXPve2ir!XDs1t5}%-#2HW&8ii-*?Ymt_gn3uw2gtzHl zqI<|OqJfR9#LhO*otL z`lV#>_2Ed4?M=KQkQiWmvzzk_1E%tu5(N69V#5hFl&UK237UqG=F)n9oc#abwcq zxS0Ds?oDq^u2cKIv9i4@mil2)xbnmbK`^VuapJnTs?Edcx29{$S;T1{*42#6tKY7+ zP42VR^^xvQ!{b?PVxI?IKl<)f^euPC z;YRsO?@iB#g|5D;u%|KJ#7v(^m66WjcaIU92g+=c<^^_>BzNg;o1Wo22{hj{XE%Ld z?v}1(X=^pV^Qpgtop0PP%sn7NU7|Ww`MuB7dP`rBzt{u5`7aj1F%N0TIEx4MXW!$n z^-p3S)wNu%=3+{rFJ2|o`HUNkf9GzK`K6F`aev7@8o{&Dv80dJ1#wa}-nf}1zZf2q z6fzK%`A8gXX{~wTUO?l~Shn%@FrUJu+ZPGzw~`1sjcVVLTxs!}j_>BH{{Wv?o4>Te zcQhRPE@tg0|>J1qdiEKUp4G)?RE7r;Q@n5nc3onVsqm{qc@v z@Vn)O@r@c!TOl?hAwx$U`paRh)%mJ=S{=^Stxw3O^6ayY9&;=zG4<=))W8Nq3oO*U zVTZivZKVhkqOV)M)Z#mXZ+9hQ$~v&A?{&Z3sm5)gihBMe?T6)Zq$(pJSc6|qgel3F zo(kjkKAllX@R^xX1-B&lN)@gx-qPu%2zu3t8dKvd5&CCBvrd#)P!Jd?ELYzr`}z_3 zr#{H8NT26jyl6vODP{D{N_wYHPu=}I$K#`SC+;i1jansDDK#W)-4-$q%a=R^ol>mO zuCKj1!>=aC8vl5Y!Y|1>-4<nx?O2^qt1}o6(&6}7Z z17*&cSo4?Tl61%1<``7o2?Oisogn@r zZ=kF><>mQ8M?*79iRR^7=XJgNVz(-0>9{{ua?Qu{d`!VrbI_d8Fa;htVr-*% zLh!wU5pIuCXmJ&ki%N7M9|3s!J=|cA?o40|^$e89Voh}`*SmTa8E!b~ zDjtb!d^m_e#4x+@_cb^hkI8)Q2=Dsz_6-SDW2?==M&Rf`DgmffP*b?6H69D4&V}WN z8zy5D87R%)uhXF|&x>H`i(sq^;w3C;zlQ!dRF1DV59x}>(P1x^Q(x;fsy1g=&U8u) zxTF5;DcP~NYsuuiFCVT~iR6af*DRLhW1DzjuG^hCy6t+e?nQ+3yVk&u+X<(3HW}~o zSlzQ1dg#w&BRfczeaU8%jXr-w)NgNk%P&W-hwApmA?T|?EFYIf@{QzAV4O>XcDXYh zmqH#NzH;Fdj(|-(wKzt9x!@pT`?I^$Ly}QF;ts?YSDnrl!m(oJ6FZBmcDm0!C?iMD z+W9KcL<=SypL1g+hbB^bp27w8_JzDa`+(W*teXB)vNmR_f3B*yHdD%h0~$3NhJ9L zAg(Dnb!B>1Dza$Ctj7dVce8i5;zIuu=X>Mg=jXiVqi)3wWxTQy5q!Ay_A)`gWwOEw zrQkr5{%wzDBL1pV+*W1d729diS7-JP-J-W^rXi>850h-eID0wHLXX_V8k;~Ik5dER zR5cepPfMLhYpZpz@yS`|jy)muZ+1^852@$REGJ96-mMngIb_~af01QD{i4@H*3O$D z+#3S{4VC^jO6?T{t*gmTlwMXaCq90Mxv+Am)y9}e{H{ZqRry{#;Za7+6$^_AtMhyO zFGtDkv_9gnMCE#sw!JlfS}oN7NpE7@eRaoB^pr&Jh2BhGuP6@t5&^D>y8yTHi%NY| z&x3mdIVZ%IuB4cP`aHVNgtVrUK3X)P=SJ=GN=7+IS}V8RJ(8KZ#V%rn=J|bnN30>| zVX>XzCUv!6Y{}ixx$x!L53`CvPE#MLzV33QHAai8FW=vOqd$KzjnSZA(UuR6!^HJ;3?EQ8y30BcCRJM~;>(kf z9~i{mmhncCQLyMT)yUTYZ?WkM9?ZeT)UWikzC~av&v6}4a9CAPERf9coH zWVB0@##omWovqp{r|!<`o(fM0clq*x``&r^N5reL&kGf}haDthukL9J%;5cTdlm%`Y6PgWfmuo*Ma@knB)y<;78gG4H5H7;84zshLNLUE#TaUPXFG08&!3%rCy#E6Z zLGiwCU1fAkI|bFc%}Z&JowhN1K$o*)Y#JEI=-154?TQn)havzxLsFRJD#dP z)91GyaGilx{}o(4#24m2L`k^s$fbnq@ZWDdPu-4&5r-#jpo%@ zrg+f&17q4lEMM>+RF};?vSX3qRl!M;+}0)dolWmp<7W#2@yI*t->|A?(S4tl=14ui z-f$L{jA5Wk)UrjB3HO{yr&K+9k=)@5q;>#qcxu^K?1222lN?wIu!u#TUBJrYe~;e^ z_wXZ9-Hs&VT=M+=Jl%Sb$bf$e1OQ6}aUG_G3RqN9#mezBm|9d$*!FiNL}#DF?tu1a zlBc&da^tJ@Jh``nFUY?pu-oWEKujNo=Cr0u!u6_4jQYr9F%qTmD(yyj2%1u5b+snAZ~Iq0m$?jd{f|vmeg$(YSM<7qh$Q2Ddi`Hn*Vage z#gB1;B#;zCo9FOaXA3v&d5u5qdxK3a2PhGX5`Pe%WoK0p91aKf`z)qbh6UfZKP)7qEHocD=whGKZd>S&yZosiSF+tA)2BGc%|VM zJWr^|n~rVLf5w{VAo=FwM4$Kp$+sROC2NDd)KoOqj^veLjp^>BWx*I9+nXPxE#ARE z!`M6z#Axe-H~*RF z+W*AazPd~Bv!ChaGwyIW_a0PXP(cCwz6~GKgz*AktOf$~6}I+$1+0+{sxR9$~^` zH}f|e9%cQ(-Nc;ak@nd@guY6!=XehxUjb)M`3EkacQZAGbMQ2h)%t{~YQI12AA!QxNDmNFnLD{L9w$B*bKOU${3ENYGWt zMT8F5<@N*Hxo!WOjP(WiWW^*dA3uZ1MPu+=7HBGuAji;Bo;R6`X8(jY8=qm#&hOD2 z+n;6sfFk&)@7TpH8!u&c`A0al=I;n6mE>!8k=Xhe>Ug9Ez!1*(-61w^{i~S5vE6=L z5GWyFRpaU5c;Y`OQD3>eDDc=v*CQ6dE#;+uRV&oUBW*S5WzjTrTdS%f~|s9UPg5rQ?f1-5mFu) zL604%_a8t}N`jS`UW$L-wD%2k1kJ7qly+4j#$r>flOOEZ$Vuz|#CcEL$(`F@p()lm z++F;@kvh#N%);@X<#Y4zX4aTxgHWv)6c@+y^K@~HyCxrEcYb^XE#3sTX=jh08snoR zSeel@W5V-#e2AVZ8(Qiacx~XpLrG->Mn#AqJlomA z6IfA4S~=+P06LmL(N=v+&5oLe(yr zN6jyvKf!h#tIu9HMLb8xg?%$Z2ERXGEGZdyx|U$XPeHJv#}=E~n{h{w18|@y z(Au?&(CE6{*sz18>;J;CHGkyBw_fQgmYHKP5rl%^7(O=RKlsd?-%uW&*ySI{Zh+VB zP?FW-+J|S-k^tJWt;dfGf)yC)_MDG2ua6i@N~~ahz-ZK}%yjQNZ0F-MJ*DX?uSHt1 zjsgYnPU0vDz!k&Gu@1iU`g81#bTWGFoYBYl!ns^F?|(Vxn13Z`2T`(jteF7Y!UzI;xbbPX$yyNiiMGx0P#MMwl#Q`wH2NvW&> zpz$d5k}}TMZ7fU5Gdl&icWo3+CTR4W zw2N!z$dMU>V3=5PB3B%D3m=+v4FSuCYI499fdDU;L~w@E3UK0RvgeqDOf3NQRBhXg zF~;sCem9*9;gRR>AqGH|NHRg2>oB^a0CF4+SjNYK>I+#p|BuYCJRc-7;QjNcQMMOk zKPkvmh>|DT1j$tIvU&5Kke2vTJ z{*kfylh9PWXTK0&Yf+p5C(QN>1x==^cl1DSGM6r1QpXxqGAoy(F8RJOJ${^U9c=Y- zK7bsUUH11t*$q-v3ZZ4e#! ziGxQjmUHpv7!3$UY)+l{MdnrXUWU6n;>M%d?+($9Rv(E^S?PlY44(EJ!<)_}@bH=L z!xBY=U6D4NtXEOZkz?Qp!m>$UCS=pEz#&065Kb~AzCf!S?by}hw%jt?XXlqI#~6hMv-EL)rY55K8NyS)O1Npn;swq-#9*hG`9J$`z0t(bBgEySD- zUOV&v(vK1936vykbjbVwJ>MsqY|XGNSPFxYhF8O?nv@KT$*)3@VvtIP{TB*dHyMBgf#O zci3)`_ zv&1qb@iYzBAFBh?M(Jm!yH0BKV`-ys!5VL z`Oh)vD2lSH`9&VxaUD(3y@>b_@eTMiCk2jc4r6;m=*_YNh_C0`|GmjvI*1W*9QTkd zBKr_Dle&PBME9K$AZ+_7HWvHbA+D^N;{!%Yyj!CCd2IXlc&lX{mJ}djlZnSnfI`PG zyE!<7_N##9NBm)WG68y$xqjS2MP;AusW$p7Q8$Ciz`bcBTMWg%Ad={R6_y-1(nE0Ao9_Ygo zIuZwa`BV|D9Y{DfT!edQ&rw%7$j4#f zS5C|?qr@M;&BZ(o8GG6`^4RtpIMDezmV^*8E|PHs1&)dMS#U5fE7$Aa%{{EbaXmT! zlU|I7(~;RNRPjQw12&07+*7L=rF39*lNC=Bw8t7K4NvH{#q5F-EY+jpd_aI8f{l_V z!nvj6_}eMRF{gAaH^2NR4n;GurgHR!qIAR>d3@*fyx#aIBKa5zWKHl>_kfzHk2Cfb z4A1tp#*yMGl$p z!F-aEs&Y1(MI(R^z@yyub6NFNE}t-)vH8Wo;b_OBL&1$i6eZzA`2X8G^YFNeE7AW> z-P_%2EtX_imho<|4VWc37%-cS*^`;cBn-|#^0M$IlVma(k_?c{kmOmKyva)fSzxxT z1IZ8|aWW*CBrFaX8G_Be7#r`FEnC)N?NY0|@4a>2AKfwrEUBgL)?)PgzJ%|ys&7@_ zt~zzjsdG*}*KillHr$WZC?ZAVaz^!w?o+xWT-aE7JOKazAOJ~3K~z|RGiH<3V2TE+ z`>%8+nz7o4k;0KZUQpx8!B~8IpZker&--`2xT+!W>}eyNz=}_IVt`lx;Do{wLSj%R zo&Y%VMpQYeu$UX?oxwFT7g7{1fNZZ+nj|AsE!$ci=ZX5;=}NR5+qu9AUHyXL4cHJRCVX_+oPT=bPr9U98)C8x7sB;7B1NMLAXX z;dPb&qNZY|B%Lwdqy%xI$ds83G{2gAw_?b~HzA@{>H%@9t84U|Pp#Y`j)>ZkdK5z( zj=eIV5^O|RP*_S`_rO}hcp-vduoQ{m+UfK8`1~_CrMzmahxN9jH`&G$`~HWid|7edNN(b`f_Dod})OK)6cRA;@O(p7$r-h$J1KinXANx-z zU5OUrK`)v`9)Jy0K=+}DTTQioGjd6zT5VBf`p6RZltj=#ccPuL=*(lbct`1UTvhBi zI120^fv?J$(Gos6{|v65a|#j1O~*u!{TSa)wDj&}ecd&nYQqs^ijT$L^j$0g4d1HDEQ^fkIhX#n4Cvv^2Zab|z(r*z@TG-kb9%)I7?B*Q`Ki>?w%*7bk(bm@iVn;m9+>ofBU}H5kT0>d@tYx*aG;UXQ zM(zkyOJ{O7y@@Wug~yIix^(({W)~E(FBvD6M=hZLh(}bpxO_U*3zy}1;X_~(G;}`4 z&ci>WJ@#74X_c=Davad!*FbIEci7p!9>;-4_3vj!b+Z=#FNA=}q?J%>=thy{W%Y+H3J`0uV$ZOsf2EMNzEv*>?D0HthcodcB^b zcH`W>F9DVYhUHc7p|I>?M9firhK6|u%Ua)GliIP4xEr@@ zS)#?W)^9Y9Ic=m7fvP@@-HrG*folc|;1JfFzJh~^K7QMNh-_<;7mJ|wbsPW8X#*II|WLUh)B)iuoCj&9?~}yBo98p2UdwNxN~&mL*3P`0M8l)nGRA zga{uSsf<=E9mzd(^c`Ya(fnf%0w{1p{NU`XxbdYw@XMBZ;xhcGCI>KTIlH8iubq5e z&Tagbo^5Pz{x6z(p21LpQoy8|KNzVXl_&Py!PeFXab#-xSTDCbz5-KKxX24JJ8*dY zz)nDm2-^1&9R3tiFdt{yg}5`W#*{9~ljB)Z6WWd7RGx@4{Y1j=xDM^>#&+(cg zhg!`dVpq6$&WAa7_6T)oEc{LHkQHw7IR|HQ}{@suUgq;xQ7FY1u`Dd{5gcIKoz>^JDeGYbRWLxunbj9l! z$(?I&KLL>PDD7x{oX7Y53*CukM8f35CnCVIdBc~^MV!9k2XXedKgsr%yNM;6F;a|> zpWW+tLQ#5?Z9KLAKiJ&zKZx|-vXgste~Jnhdm-iqPL9)b`{z_4LHllk)-NFLR7~kY zoEfWe%9kLK{)4dbAqe)gKSQ8NjEp=pQbe%mAKv`$Z{6-}@-cD3NmY)W*P8)GB5Z4Y zh|{XB9QJ~J2D{sqCJ&;l~(3CJZd=rGKa7s_Zsk$0x+EOG`lCRz~8zRcK z)`zlM`~V`FBuGB?=6`>S0O+~k%EM*PZ+M2Jy#PjRWe?#Jw&y)_;$en*SRp#>kYs^i_m# zf#-6P@22}6r-%UzwrdZzb0^-;Z(@p1#hJDOXU0{SqW+`B+zW!u%|FDI8Dvug)NzF% zkOz+Sx3>rY5x8rw-QL+M+fY3v9a}kUlz>A$d+F?JqBL4HDn&LF{OcYHTS zN)SRhPC7Y$@okbJRItXo~4^oTBwy9Ni`>|4DjYt zae3|VFGs}$XzqT6^*e6j>HRhIB%0DyWhQO>OsVgDiJ!jm3D)iXDsdmc&SPwe( z?p_U`zch|ywRIXIyxQ_GzRlOoz)E{;4;yxWo+tMH10C^Q>Epb~9e-&0a~%%xt8KUN zv#o!_;l8~X$!(f$znwo#g=>-#u1Z8G8qI6A^G?cNqJdB1)f)VLYjg5c-+H{-@^IRG z9XY8rtiMdH>9=xBA3zN?dPl|8&)TlU9#vg9vO0mF__W6xIMDer^UFtEZ0MLzP6oZa zeDL4d-|-ldzN~AK%;>*m=b3{);<-cjqZ%b&)pw)7d0vQGn^~cr#1Z`V%o);v7Upa1e3cPE| zc%kvX$lXt`bjKTbZ0C&}=y+;!#~&tE172%h&s{IQkEa`chH7r>?L(>-pO9dw?{Zzd zfK$?o|M({@1h(IX_BCbooEIAZ3)hS|GapDh{}REk+7_MXF@VxFsDn>ot!6npRDJe# zJV$4|F`LI6p(}on+TEX{FWENf+#4nhU0b<#^T+w!u74!v1!)IqZuexX3Feia&PPxF z56<_L$OtRUOTYDZ^^?Z%g47gYZ)c|U$ zYt&lq&bFkMV0g9VLHfMTte&&^&|UO;hdG`t$y}i*$)Jy?4}72heCaQFt@ZJ=xs+>! zkkiYh^FGgq-|?R;C_k4}p1k1B{Rr4>RN)DXDZx81{7tXV>*Upz2azl;{(yAszvb?l z>SNpf{S4lVpkY6_2O*x-Xi(yQ2V0ugF|x(0bj0e|*Y^8#uKDpqZdGJOvFfw4D|lPEuZ1nJ8z^r(U?4_~~N%`Lw}vy2=Yh>$2}7a!)m({?hq0OH;Eptfh|zT7D8tks~y*ZhtLG((No z3lcni@VmG&HOmgMh`i8U-|`F@OoWWYa`oyhUf|j9yP@ptRmG`a6f=3s8EK`}5?%&MlDvuXP#>m*4KVmAKzaX0t_Ujn(tO z*1zKy+doZvUl&4ux$@khKt(9Qdn)RP+=|IVww?k}6L3jc z1Akhvi;7VHUG#5WyfOUbi+Fu6W%S(8+-rIJMQkdjc+QZmUTC*_mrb-_-pa?R~>llg9?n zT9S77KV+}h$;(Z@qR(rktY9v#NrgCD_32G^^5UWU_}#95Vt>~Qkf)+1j=-5ktz1%G zPemv;WP6c9)HV<)zJ{R$w1i5q-8<4Dvg7}E%pO4^(+HjTq1Ue(I|jYUHh#Oa8k_CC zl8PeI>xley{D(j8tgX%LC1-phG!1_Cncfzgq>mno1`zzV~%`Fem(zBPLCiJwzGqIYRT!MU4 zV4Pt)1K)_^N(FJhm#$b-h5&0HkA8@H@st^ zKmm`|-9|8|JW+}x(}=nYCxiw7Fg2V-1(!66MKyc7a3CVaa^aLl-ZO0{RpA~|1=mL+ zWDJSkpJM$C0-D4Sns)=(>_WoFKL&Tk<(Q(`1GWgP&!cs>L9WWGEBD=eVePiz-m*8M z6%`0y5hGbw`A{tNUC*-p@Z${p5`>UjOjXHQ<2nxDXrhiop))>rIRTawwsURePEIat zP4D;FOh5&V6YshwgXaj&)H5+f3n1GoyvHpDah1@*8yWb0DBBM|PJP$2IhoU9#0!M4 zjO4Q;5&&OVzG0W+@KecwTi20N*6*uHAA=nm0TxwW5BN-k(*S^Jk?4p{1oA<@oj*I$ z$2FBZId4h>A@Or)R1_2M{vkH#W=J7mT-AvCuzbU=k$irH1wX;6^A&NVJKG!qB_QrcsI9wWkXAxjbRG+)z6T~q zoj*r}>5-vNIPyt5Rw$sI9w$xSxYUEQ*RF-Bz8ijPy4hkpK`uJI}eO4$ED}%`QhEMZo5k-?F!D z)1a+RKj9-3hO3w;6DR7pR7SG*2aFU~lygg3`15Hym=)pR(z=2D2qEgbp5?U4cN21sy=WX0qN3;w_O(CEL=ggE`+CGBkg{le$c!7$Gw@J`@fkH3xL{M^n$xT8VlF$RVQSw$TBPdfJD$s+;3*# z)Jq0z6AhIUc1mdMerCd)3Pg-U#5lyVKRq3gBe(2?5?nrYKZ~P>ab=VvC?!hZ)lpFL zmqVO?lX3#uB)0t}CWmLVoEu2{KZswL!-xdk0$d5L5W5c)d5ky%T( z5O>aXpjj528Z!h_G@tOvHx3!@yKc`dm>iw?iwJ>lZ@FPrZPqU?C)tGJ1(a1V}*)>YNR!C-?PBE|1vs5}pG!l)O+cDyu!f`d{Xmx8mt zfhn0kXv<9p?&8&!-;84-uFf>~U$@DAh+6JPPIM>6O=@|_)V=xsO? z4SFWZw*!RI6KZh_PG<0Frf8yr_@J6X@HeMjGoFEV!#5K_X?iv#yySaRC9L1=kO{ z_yM}(&HQfHm$Saxub=dq+L~TtIU{ERKm?7gd#V@gryN&ua^9sV2|vNFx8F=M7~J2n zWX6Y?KlQ4d7s$vDg3!&Z(u*@{o$Or;Ir1Kl9+FNKt|yZm0e9}7BW}@X3@i(L+?nqt zwBSR7wn_$l{CfM%B>ZHyfwD(PtttDd*t(~BbG7?Jj(h<9)YhU8{a|1HANS9zaEvU^ zMQi{ly|* zPO`Mq(#D7sT{UEDaSFhXVLP`l{(KsMdbl&LB7Ev+2le=?20XO$E9~#uOs+IiV}!u! zzuvTb!w*)i%B>=p^Hm~(QW*Xs=#HF;KVVziLu@+mgTed8aQ5s^Go$2O#`9tcY!`FN z{%pv_4~iFm4YhSllpKgR5|He@pTNtkHoiOmdL$HO{0RVyQ?Z=zsW%Q8;I!$$57^c= zoT9fwpeX1L3d3K_<<8$vUbe|w&RW;&i+nwAxkNDHQdxXvM!#mF=U&LebId{V*jC|D?$>CO9z`DKPrmp?j zA%sAL^XB~nRV8OL{xkuhBr>1U=$s)=OBHK-@cJHS;@SU46C>HXmcXmesI@yQ9UVBN zb~GAToTsyjz)DekGbaYa}Z~3^PiWlF39#^xlJH zdr#cBz#-ZD3xec6GWp)_%&U=tIb){ig-4 z4}SNWW5O((eIqATyqA8x7Z@EnGmde$TU^xt6n4vxm)=pRpL!SzF)^F#mQUrnDE$!V=h5!5*H zozI^0_)Ym<{4h!Z^de|kuigr5B!??cvGjSFX#xPJR9(-qIiDprnTx|mH93snpZgFQ z+md3rB>>{|wck!gQ^14>o%qqwiw+baa_UXPSp4tL`Qj(_Vm6lb>aC-(_+biD3Hwe zphlU1Wb8it#BMSX0#4P1n39vo?=%%8R7k+Fpf?ya)Saz8OH^H5L$F2`8)+NMe`^)=X;p4Q-^4&wD%p%&(5!?;}T0G z?DgHhyL9LYoI^%6|FX8WRzH6Axd%H-Vu!`>r{r`CR($KSrR9F+PPu^M$h1L^+Cokt zbIMkc@H^;;Z_D~>rlCjI!_rxwr!YM9{qOPapW(+JVHh{JO&~n1zk^WpDjfHOAzPbh zC7SHSc5fqh`;~ykac91Z$mw4~!h@IR*7Q-|{aZeicKGEswnPkI<;Hmjr~mrXpZ@nz z4O|)Z1njkIx9a&ntb4JbVL>4x7v@&hDON+gcKCNxMi)^Yojs_%?--X8rkqPObOOyi z&*e?*3WlnZWh}0IUq=3i-qtUnK}()SGad*L_&X^mxjuuof-`j~wqpkxKScI>h9E`= zpK=qS1s?<_H0U!`EqmHF^1$|+@U5GN#V?4F+q;%O{*6zczID{2*2d(ZwMMX=F}+n) zA0Wr-j$#R{@avub$SY018KSiyVpvddIja`lK~cDpx7Omx7K39fXU+P%jAH)-znQ>$ znTb~5WOxMl@kj9!8Qx`K!bHye5>EM2(2?9<2>qqfBw9&i*}vh=yehr*4*slHntsEt zcl;xPm7FhrKvngD&Y0d>BV!Y?I%XwUYJa@XUh#K}e`|u^a#3cIV{-ruyW1ZjumN*Q zmkzo33PPpKpL!)pznAvD*U~0Iwz5e8pJj7yWm?ftg)vejdpF|s{&bv#!se3zaTXAc zo|{>76ULo!DOii`e2J8Kl*yD4Qo=NjJM+&eIOG2y1(id7%Bs(k`@hSE{oe+Ol54YE zz>48njfUU*#q%Ern+f?6aTMIs@bsaIpBF2fY|U)C|S@bBzv;DPNo(bm^Qu6OMIY-&ekV+Xm>SUpt%k0JqqJUOW^CJH(yY@ zWvmxJj1vI>DIsv%ri;#Sjr#}d>)>a2BSrv^vu9k##q&OaV=}cPQ-a_?M=dSAFVmN7 z#p0nFU?hxV3Mh}B#EdEDF{f+=5w~OnV^adJkqpC~_fYCw;tj`nszQ^;8_mfJ! z&cnJ?)VOlkxBlg~EPrzIcv$=}jsyUtguu5qUb<9V`wjtodBq$e9j*cGZKNBJ&MxR*U0a7-AY5x zu0gcBEc;1C`E{vpF8$p3kG(iv7C(%$vnCOA0PnB*8C_xe&xM1 z_UzBw;wQcMJzuZgc%b6t@wE71437Z^V(Z$iT6WdB`(_u%9~PHuRP(hW6x9ej+Skz< z+s>RR=MH!)@v-T*F>{3=5+UC68`QRQ{A&PlLIsx-DSj8Dt%$~w9Xzz_|FEgyC#V+Y z<9z=J#+Aba=8C5eRBl@P{1UQ;E_yhu-Mjpqi1Qfa@T)yB7ESk0=KkkPN zN7CK=S(3d!WgP!BIiio^%3l*H9=%Im6=mn)4g6v6*NOSv`P=o=-5F>6+5B&2T+g!p z(*fh~TeZv~uO^G2#8_Cqipv(I9S#H4BpvnVV}ndC)R?Fk3a9=P(bAy{qhy1k1UAVljlblH`u`xX;k+I1 z^&?=#ksZcyuNn{M{6jJB1puUkz*nERXj(zo`5(2MOPC+@4G&vviel@0gZ+~bjv%|#l|wc zcQ{NO0gz_R`ju{Jp?p=X-mIw_pLzZcl8*2b&Yb?IoIm@oDGZn8w@bkKhv{gz91RXL z@ymh(L_nfUnej711xv}t)QcrM*m&Rvywdzz0@bvWFVE{xQ86G!Ztslgtu?D^C)DxH zgcAS&YZNnO<0XGBj(#)nDa=>E&|4A0jbIai)-)_msYVJlVkujX&YV#b<=+LFfM}n$HqWfNA9bZF(13(zwP_JOD%uPA!zm}A#qM$CuJ&{n+yNFKtBu;47 zo7!hbM_&WaAG)8dhkrxDk7Fdi!8~s!?cCd_j=iq?cb6Wlsi~Q8JAXeDS^%VxyVkFa zbQH-~17AOzPW~EQK|lgWTo#tEVA;$MFr(y@ybM7#L9%xPiQaqg6I;-r5oiYuf%Ip+ z6_MI~176RO@1LKU3X1-*r}OHOqn_EDdX5T+2b3eu3>@;j?ig@4#^@Ax9z7 zsgbAZ@;%pZFT2_|5U7tK_x1UP9E5=5%6H0o_11Lt-U;FC8;IjU008O8!Hp}g4Y~5& zz|-=v3FlL+CYVvQh&cV3zFm45Icn-!Hy3pzH zNv*56-^=c{T3$GGKaIURF%n@+rfvGVF3;Cb-g18JFDAkfUnU$k0svAbLB+cso9E&D zRNy>obxe|-QgH;`MBOM0%P(Q+jE^v_XbvV_5sNC6cE z3s^kuT`Vj=kILeOW0-t2wkS$V&n|YgKh2KA57HXni`6)enTqPz9;b^D1l{3_e)N`e zH*A6<&cEY|<9_Dd_RC=E%vWwQ(e)e^)<3RUT8hc(PP!~srTWB@UC~6#0U@O>9 zeeS#sPacmu{+k(}GbsCp$b71b z=QFEh1=9-`Q5-3wI8p&e_SOE-q|yE=dZh1kjb3^Zt@I>1XpZgVVD|=^dg|y()DaK* zaLqJ~7_9n?^)CMw6m`O;$M=HUt@XbhTlZ9NP0e_cPWfY;Er9&e?;H5m#+4^wxD%Ck zrRwjEPXs~4#i}LHR=`r=%%H$^m|AcWm4&AWq7P!Z@$b*C-JSZkaXjE0 z^R^NIN6=K*%x!g7!cGwp_l>pq5`GWKAZ6|*f*z8#kC@kv=f~(yHq+;K5%W4o z1btXdU^R~7ArxXHobp?!9oLJ!pR}DXs=71q?Jc)l_{47nm?#;1xn$f=_| z^*&xZx%kseY5;FSHKhoDebb7Cj*%~6^#g)&)#}7Qlz+RRs2CB&`WU%4u=;<$uzbTV zy<@{gl}Xq6U&ioJkR>8Gfv-%2z@mvjI&cS7 z0?@72a(CDd?)l7$CtG-9ae_&P$>aph6^g8>UL(akL z!$H-G5fMkM7}*mff?p}D?RjL?^EK5q`gV-k%LkJJAjhoHH3nen&Zk3OYu`B_f8mC> z66KV@SJGC(q%b%(R#G+hK-lJcJOcX5P(}3FwngW8kc!zD>p>n*ObUQ}p~xE62-PtE zqmPH%n#{?leV+-L%hb2$s!B*xh5Fw1hzKH@6xTdsJ^LtP9++BXx7Xc$Ns?-)VRFaM z7n2ikbdY}kU^Q!`_^C&xVZxURTn?-fWUd%oRZy!s+Let*g>*$-F(M+M7GKf*za@9V+G$&5 z->i-b)%aNkbFw&kemLr!U(L&VycF(q$_ib?r)je(T|KljEEZ&YXcQU zTS8&8FWDFD)<8B|>~@iYm*yQTYu&PCiBb*K)Jz8Hi~}YGz&K>h8q8_ct7SE7Z8dA; zw6$Ah|B21znqUUVJV8$l6*!B<=$ydUnby}?#*uOnNtOJz2#TbH#8G5+k)a;-|EUk8 zbPqKKJ<>;@?Z%aZjw=mnrQVANI}~{hbe}|MoV#aw`9>)qtJg?PO^trOX|SrTVWm-`K@-VjqQDLMKC$e1f6baTQeB-M l7i*-NYL(Q@B9n}B{y&L9*ri(p2;Tqz002ovPDHLkV1fwYV*CIA diff --git a/examples/DemoRunner/Builds/VisualStudio2015/resources.rc b/examples/DemoRunner/Builds/VisualStudio2015/resources.rc deleted file mode 100644 index f22dabbc..00000000 --- a/examples/DemoRunner/Builds/VisualStudio2015/resources.rc +++ /dev/null @@ -1,36 +0,0 @@ -#pragma code_page(65001) - -#ifdef JUCE_USER_DEFINED_RC_FILE - #include JUCE_USER_DEFINED_RC_FILE -#else - -#undef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#include - -VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,6,0 -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "Raw Material Software Limited\0" - VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0" - VALUE "FileDescription", "DemoRunner\0" - VALUE "FileVersion", "6.1.6\0" - VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "6.1.6\0" - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif - -IDI_ICON1 ICON DISCARDABLE "icon.ico" -IDI_ICON2 ICON DISCARDABLE "icon.ico" \ No newline at end of file diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj index 34f9f529..3bc027d6 100644 --- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -105,8 +106,8 @@ Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -171,13 +173,13 @@ true - + true - + true - + true @@ -288,7 +290,7 @@ true - + true @@ -657,6 +659,9 @@ true + + true + true @@ -690,6 +695,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -759,15 +881,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -801,6 +941,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -819,6 +977,9 @@ true + + true + true @@ -831,6 +992,12 @@ true + + true + + + true + true @@ -1038,9 +1205,15 @@ true + + true + true + + true + true @@ -1056,6 +1229,9 @@ true + + true + true @@ -1122,6 +1298,9 @@ true + + true + true @@ -2118,6 +2297,9 @@ true + + true + true @@ -2145,9 +2327,6 @@ true - - true - true @@ -2467,7 +2646,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2534,6 +2717,7 @@ + @@ -2722,6 +2906,7 @@ + @@ -2734,6 +2919,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2799,9 +3054,14 @@ + + + + + @@ -2822,6 +3082,11 @@ + + + + + @@ -2829,6 +3094,8 @@ + + @@ -2908,6 +3175,7 @@ + @@ -2916,6 +3184,8 @@ + + @@ -3124,6 +3394,7 @@ + @@ -3322,6 +3593,7 @@ + @@ -3392,7 +3664,6 @@ - @@ -3455,6 +3726,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters index 8d351075..ca043820 100644 --- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters @@ -155,6 +155,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -209,6 +335,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -604,13 +733,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -724,8 +853,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1099,6 +1228,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1135,6 +1267,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1204,6 +1453,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1213,9 +1468,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1249,6 +1516,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1267,6 +1552,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1282,6 +1570,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1504,9 +1798,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1522,6 +1822,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1588,6 +1891,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2629,6 +2935,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2665,9 +2974,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -3049,6 +3355,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -3237,6 +3549,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3801,6 +4116,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3837,6 +4155,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -4032,6 +4560,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -4041,6 +4575,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -4101,6 +4644,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -4122,6 +4680,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -4359,6 +4923,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -4383,6 +4950,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -5007,6 +5580,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5601,6 +6177,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5811,9 +6390,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -5996,6 +6572,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff --git a/examples/DemoRunner/Builds/VisualStudio2017/resources.rc b/examples/DemoRunner/Builds/VisualStudio2017/resources.rc index f22dabbc..7034f165 100644 --- a/examples/DemoRunner/Builds/VisualStudio2017/resources.rc +++ b/examples/DemoRunner/Builds/VisualStudio2017/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,6,0 +FILEVERSION 7,0,0,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0" VALUE "FileDescription", "DemoRunner\0" - VALUE "FileVersion", "6.1.6\0" + VALUE "FileVersion", "7.0.0\0" VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "6.1.6\0" + VALUE "ProductVersion", "7.0.0\0" END END diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj index 1048fd4f..0a6f1cbd 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -105,8 +106,8 @@ Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -171,13 +173,13 @@ true - + true - + true - + true @@ -288,7 +290,7 @@ true - + true @@ -657,6 +659,9 @@ true + + true + true @@ -690,6 +695,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -759,15 +881,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -801,6 +941,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -819,6 +977,9 @@ true + + true + true @@ -831,6 +992,12 @@ true + + true + + + true + true @@ -1038,9 +1205,15 @@ true + + true + true + + true + true @@ -1056,6 +1229,9 @@ true + + true + true @@ -1122,6 +1298,9 @@ true + + true + true @@ -2118,6 +2297,9 @@ true + + true + true @@ -2145,9 +2327,6 @@ true - - true - true @@ -2467,7 +2646,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2534,6 +2717,7 @@ + @@ -2722,6 +2906,7 @@ + @@ -2734,6 +2919,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2799,9 +3054,14 @@ + + + + + @@ -2822,6 +3082,11 @@ + + + + + @@ -2829,6 +3094,8 @@ + + @@ -2908,6 +3175,7 @@ + @@ -2916,6 +3184,8 @@ + + @@ -3124,6 +3394,7 @@ + @@ -3322,6 +3593,7 @@ + @@ -3392,7 +3664,6 @@ - @@ -3455,6 +3726,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters index 79b0a421..69922596 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters @@ -155,6 +155,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -209,6 +335,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -604,13 +733,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -724,8 +853,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1099,6 +1228,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1135,6 +1267,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1204,6 +1453,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1213,9 +1468,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1249,6 +1516,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1267,6 +1552,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1282,6 +1570,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1504,9 +1798,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1522,6 +1822,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1588,6 +1891,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2629,6 +2935,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2665,9 +2974,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -3049,6 +3355,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -3237,6 +3549,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3801,6 +4116,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3837,6 +4155,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -4032,6 +4560,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -4041,6 +4575,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -4101,6 +4644,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -4122,6 +4680,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -4359,6 +4923,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -4383,6 +4950,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -5007,6 +5580,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5601,6 +6177,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5811,9 +6390,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -5996,6 +6572,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff --git a/examples/DemoRunner/Builds/VisualStudio2019/resources.rc b/examples/DemoRunner/Builds/VisualStudio2019/resources.rc index f22dabbc..7034f165 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/resources.rc +++ b/examples/DemoRunner/Builds/VisualStudio2019/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,6,0 +FILEVERSION 7,0,0,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0" VALUE "FileDescription", "DemoRunner\0" - VALUE "FileVersion", "6.1.6\0" + VALUE "FileVersion", "7.0.0\0" VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "6.1.6\0" + VALUE "ProductVersion", "7.0.0\0" END END diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj index 3c208600..deb1e588 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -105,8 +106,8 @@ Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -171,13 +173,13 @@ true - + true - + true - + true @@ -288,7 +290,7 @@ true - + true @@ -657,6 +659,9 @@ true + + true + true @@ -690,6 +695,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -759,15 +881,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -801,6 +941,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -819,6 +977,9 @@ true + + true + true @@ -831,6 +992,12 @@ true + + true + + + true + true @@ -1038,9 +1205,15 @@ true + + true + true + + true + true @@ -1056,6 +1229,9 @@ true + + true + true @@ -1122,6 +1298,9 @@ true + + true + true @@ -2118,6 +2297,9 @@ true + + true + true @@ -2145,9 +2327,6 @@ true - - true - true @@ -2467,7 +2646,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2534,6 +2717,7 @@ + @@ -2722,6 +2906,7 @@ + @@ -2734,6 +2919,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2799,9 +3054,14 @@ + + + + + @@ -2822,6 +3082,11 @@ + + + + + @@ -2829,6 +3094,8 @@ + + @@ -2908,6 +3175,7 @@ + @@ -2916,6 +3184,8 @@ + + @@ -3124,6 +3394,7 @@ + @@ -3322,6 +3593,7 @@ + @@ -3392,7 +3664,6 @@ - @@ -3455,6 +3726,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters index c42d4c98..5cd4bfcd 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters @@ -155,6 +155,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -209,6 +335,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -604,13 +733,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -724,8 +853,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1099,6 +1228,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1135,6 +1267,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1204,6 +1453,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1213,9 +1468,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1249,6 +1516,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1267,6 +1552,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1282,6 +1570,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1504,9 +1798,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1522,6 +1822,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1588,6 +1891,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2629,6 +2935,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2665,9 +2974,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -3049,6 +3355,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -3237,6 +3549,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3801,6 +4116,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3837,6 +4155,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -4032,6 +4560,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -4041,6 +4575,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -4101,6 +4644,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -4122,6 +4680,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -4359,6 +4923,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -4383,6 +4950,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -5007,6 +5580,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5601,6 +6177,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5811,9 +6390,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -5996,6 +6572,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff --git a/examples/DemoRunner/Builds/VisualStudio2022/resources.rc b/examples/DemoRunner/Builds/VisualStudio2022/resources.rc index f22dabbc..7034f165 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/resources.rc +++ b/examples/DemoRunner/Builds/VisualStudio2022/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,6,0 +FILEVERSION 7,0,0,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0" VALUE "FileDescription", "DemoRunner\0" - VALUE "FileVersion", "6.1.6\0" + VALUE "FileVersion", "7.0.0\0" VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "6.1.6\0" + VALUE "ProductVersion", "7.0.0\0" END END diff --git a/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj b/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj index 26d37ebc..ab7bc628 100644 --- a/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj +++ b/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj @@ -25,9 +25,11 @@ 527DA2E6827BAFDDD3E8E80F /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = B4389672DA4CC8E0A531062D; }; 5CB78489F16E82144914972D /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = 979F23EA9E5E76131299E886; }; 5E4310B3F6BB639875D3E9B8 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = 49ECA8B998B339A083674A22; }; + 5EB6872A39122A5AB67E544E /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = 8D44097417573B38729A0179; }; 611298FAC1A543BDD10D4C41 /* include_juce_box2d.cpp */ = {isa = PBXBuildFile; fileRef = 4DF215D350FFE5E119CBA7E5; }; 63A2F309E55DAC206E9B97E3 /* App */ = {isa = PBXBuildFile; fileRef = CFF2BBEB242CC8B3B904B5F9; }; 6658EEC5F9D63D3419EB7098 /* CoreServices.framework */ = {isa = PBXBuildFile; fileRef = E07FC48041C3E9F9721F3BCE; }; + 67D7E529C3713ED79F5F3AA9 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 5BD7D121AD30987C08BE10E8; }; 6A61CBB4E39BFD392D97528F /* CoreMIDI.framework */ = {isa = PBXBuildFile; fileRef = 61AE09C749B007B70A265D9B; }; 6B5560283DEEBD6DD2D6C984 /* include_juce_dsp.mm */ = {isa = PBXBuildFile; fileRef = C1E93FAF6C68A40A664422CD; }; 712D81867EC698463252FA79 /* include_juce_audio_utils.mm */ = {isa = PBXBuildFile; fileRef = EDDA01B246C6128CAF7A2914; }; @@ -87,6 +89,7 @@ 4FE6029FF76BCE9698595DC5 /* juce_product_unlocking */ /* juce_product_unlocking */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_product_unlocking; path = ../../../../modules/juce_product_unlocking; sourceTree = SOURCE_ROOT; }; 5965349393850F41DF76F350 /* include_juce_analytics.cpp */ /* include_juce_analytics.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_analytics.cpp; path = ../../JuceLibraryCode/include_juce_analytics.cpp; sourceTree = SOURCE_ROOT; }; 5A9F2000C66D24E8B01BE60B /* juce_gui_basics */ /* juce_gui_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_gui_basics; path = ../../../../modules/juce_gui_basics; sourceTree = SOURCE_ROOT; }; + 5BD7D121AD30987C08BE10E8 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 60F2869DC345EAF2314D6C09 /* juce_audio_devices */ /* juce_audio_devices */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_devices; path = ../../../../modules/juce_audio_devices; sourceTree = SOURCE_ROOT; }; 61AE09C749B007B70A265D9B /* CoreMIDI.framework */ /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; 651ECE3C7BA845DDCFEE48F3 /* juce_osc */ /* juce_osc */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_osc; path = ../../../../modules/juce_osc; sourceTree = SOURCE_ROOT; }; @@ -102,6 +105,7 @@ 8135645508EEFDBDCDF2ADC6 /* Images.xcassets */ /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = DemoRunner/Images.xcassets; sourceTree = SOURCE_ROOT; }; 873F9DD54978E601102353B4 /* CoreText.framework */ /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; 8CE533D611CD0984AD028D73 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; }; + 8D44097417573B38729A0179 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; 903CD4126C779884797EF915 /* juce_core */ /* juce_core */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_core; path = ../../../../modules/juce_core; sourceTree = SOURCE_ROOT; }; 9144821E003E15E4042B57DB /* include_juce_video.mm */ /* include_juce_video.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_video.mm; path = ../../JuceLibraryCode/include_juce_video.mm; sourceTree = SOURCE_ROOT; }; 934ACDCB3FD9D223A3481D8F /* JUCEDemos.cpp */ /* JUCEDemos.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = JUCEDemos.cpp; path = ../../Source/Demos/JUCEDemos.cpp; sourceTree = SOURCE_ROOT; }; @@ -224,6 +228,8 @@ 03A63C3CA6F24977F19C316D, E061A1C75FA5722167FC4997, E67AB94002886AF67437D6AE, + 8D44097417573B38729A0179, + 5BD7D121AD30987C08BE10E8, EDDA01B246C6128CAF7A2914, 4DF215D350FFE5E119CBA7E5, 3BC9753E0CD75A36DC742EE0, @@ -345,7 +351,7 @@ AC6F0E9A0809A184B2C2B7DE = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { @@ -421,6 +427,8 @@ 9EACEA6BE8D0ACC72C12C080, 26652AB1BB77C8A39434775F, 2707968B431D83AC7E28E49B, + 5EB6872A39122A5AB67E544E, + 67D7E529C3713ED79F5F3AA9, 712D81867EC698463252FA79, 611298FAC1A543BDD10D4C41, D183F8140174ACCDDCD230A2, @@ -511,7 +519,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -533,6 +541,8 @@ "JUCE_MODULE_AVAILABLE_juce_video=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_USE_MP3AUDIOFORMAT=1", + "JUCE_PLUGINHOST_VST3=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_ALLOW_STATIC_NULL_VARIABLES=0", "JUCE_STRICT_REFCOUNTEDPOINTER=1", "JUCE_USE_CAMERA=1", @@ -540,19 +550,28 @@ "JUCE_DEMO_RUNNER=1", "JUCE_UNIT_TESTS=1", "JUCER_XCODE_IPHONE_5BC26AE3=1", - "JUCE_APP_VERSION=6.1.6", - "JUCE_APP_VERSION_HEX=0x60106", + "JUCE_APP_VERSION=7.0.0", + "JUCE_APP_VERSION_HEX=0x70000", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", "$(inherited)", @@ -561,9 +580,10 @@ INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; LLVM_LTO = YES; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner; PRODUCT_NAME = "DemoRunner"; USE_HEADERMAP = NO; @@ -591,7 +611,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -613,6 +633,8 @@ "JUCE_MODULE_AVAILABLE_juce_video=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_USE_MP3AUDIOFORMAT=1", + "JUCE_PLUGINHOST_VST3=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_ALLOW_STATIC_NULL_VARIABLES=0", "JUCE_STRICT_REFCOUNTEDPOINTER=1", "JUCE_USE_CAMERA=1", @@ -620,19 +642,28 @@ "JUCE_DEMO_RUNNER=1", "JUCE_UNIT_TESTS=1", "JUCER_XCODE_IPHONE_5BC26AE3=1", - "JUCE_APP_VERSION=6.1.6", - "JUCE_APP_VERSION_HEX=0x60106", + "JUCE_APP_VERSION=7.0.0", + "JUCE_APP_VERSION_HEX=0x70000", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", "$(inherited)", @@ -640,9 +671,10 @@ INFOPLIST_FILE = Info-App.plist; INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner; PRODUCT_NAME = "DemoRunner"; USE_HEADERMAP = NO; diff --git a/examples/DemoRunner/Builds/iOS/Info-App.plist b/examples/DemoRunner/Builds/iOS/Info-App.plist index 48e7afda..f5717134 100644 --- a/examples/DemoRunner/Builds/iOS/Info-App.plist +++ b/examples/DemoRunner/Builds/iOS/Info-App.plist @@ -30,9 +30,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 6.1.6 + 7.0.0 CFBundleVersion - 6.1.6 + 7.0.0 NSHumanReadableCopyright Copyright (c) 2020 - Raw Material Software Limited NSHighResolutionCapable diff --git a/examples/DemoRunner/CMakeLists.txt b/examples/DemoRunner/CMakeLists.txt index eba610ba..140d829e 100644 --- a/examples/DemoRunner/CMakeLists.txt +++ b/examples/DemoRunner/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -55,6 +55,8 @@ target_compile_definitions(DemoRunner PRIVATE PIP_JUCE_EXAMPLES_DIRECTORY_STRING="${JUCE_SOURCE_DIR}/examples" JUCE_ALLOW_STATIC_NULL_VARIABLES=0 JUCE_DEMO_RUNNER=1 + JUCE_PLUGINHOST_LV2=1 + JUCE_PLUGINHOST_VST3=1 JUCE_STRICT_REFCOUNTEDPOINTER=1 JUCE_UNIT_TESTS=1 JUCE_USE_CAMERA=1 diff --git a/examples/DemoRunner/DemoRunner.jucer b/examples/DemoRunner/DemoRunner.jucer index 058501ac..86e1f4f5 100644 --- a/examples/DemoRunner/DemoRunner.jucer +++ b/examples/DemoRunner/DemoRunner.jucer @@ -1,7 +1,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -287,7 +259,7 @@ + JUCE_STRICT_REFCOUNTEDPOINTER="1" JUCE_PLUGINHOST_LV2="1" JUCE_PLUGINHOST_VST3="1"/> diff --git a/examples/DemoRunner/JuceLibraryCode/JuceHeader.h b/examples/DemoRunner/JuceLibraryCode/JuceHeader.h index 0b9a843a..364453ef 100644 --- a/examples/DemoRunner/JuceLibraryCode/JuceHeader.h +++ b/examples/DemoRunner/JuceLibraryCode/JuceHeader.h @@ -54,7 +54,7 @@ namespace ProjectInfo { const char* const projectName = "DemoRunner"; const char* const companyName = "Raw Material Software Limited"; - const char* const versionString = "6.1.6"; - const int versionNumber = 0x60106; + const char* const versionString = "7.0.0"; + const int versionNumber = 0x70000; } #endif diff --git a/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp b/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp new file mode 100644 index 00000000..e0c34d43 --- /dev/null +++ b/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp b/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp new file mode 100644 index 00000000..64b4d5f4 --- /dev/null +++ b/examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/examples/DemoRunner/Source/Demos/DemoPIPs1.cpp b/examples/DemoRunner/Source/Demos/DemoPIPs1.cpp index 010209a7..d5442ec1 100644 --- a/examples/DemoRunner/Source/Demos/DemoPIPs1.cpp +++ b/examples/DemoRunner/Source/Demos/DemoPIPs1.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/DemoRunner/Source/Demos/DemoPIPs2.cpp b/examples/DemoRunner/Source/Demos/DemoPIPs2.cpp index f1235266..992b4a63 100644 --- a/examples/DemoRunner/Source/Demos/DemoPIPs2.cpp +++ b/examples/DemoRunner/Source/Demos/DemoPIPs2.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -30,7 +30,7 @@ #include "../../../Assets/AudioLiveScrollingDisplay.h" //============================================================================== -#if JUCE_MAC || JUCE_WINDOWS +#if JUCE_MAC || JUCE_WINDOWS || JUCE_IOS || JUCE_ANDROID #include "../../../GUI/AccessibilityDemo.h" #endif #include "../../../GUI/AnimationAppDemo.h" @@ -70,7 +70,7 @@ void registerDemos_Two() noexcept { - #if JUCE_MAC || JUCE_WINDOWS + #if JUCE_MAC || JUCE_WINDOWS || JUCE_IOS || JUCE_ANDROID REGISTER_DEMO (AccessibilityDemo, GUI, false) #endif REGISTER_DEMO (AnimationAppDemo, GUI, false) diff --git a/examples/DemoRunner/Source/Demos/IntroScreen.h b/examples/DemoRunner/Source/Demos/IntroScreen.h index bd87a1b6..03437d91 100644 --- a/examples/DemoRunner/Source/Demos/IntroScreen.h +++ b/examples/DemoRunner/Source/Demos/IntroScreen.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/DemoRunner/Source/Demos/JUCEDemos.cpp b/examples/DemoRunner/Source/Demos/JUCEDemos.cpp index 3fbd5834..cad090cb 100644 --- a/examples/DemoRunner/Source/Demos/JUCEDemos.cpp +++ b/examples/DemoRunner/Source/Demos/JUCEDemos.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/DemoRunner/Source/Demos/JUCEDemos.h b/examples/DemoRunner/Source/Demos/JUCEDemos.h index 0d18838d..1c6ac037 100644 --- a/examples/DemoRunner/Source/Demos/JUCEDemos.h +++ b/examples/DemoRunner/Source/Demos/JUCEDemos.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/DemoRunner/Source/Main.cpp b/examples/DemoRunner/Source/Main.cpp index c0114a99..561e0823 100644 --- a/examples/DemoRunner/Source/Main.cpp +++ b/examples/DemoRunner/Source/Main.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/DemoRunner/Source/UI/DemoContentComponent.cpp b/examples/DemoRunner/Source/UI/DemoContentComponent.cpp index 98c7aa17..0bcdf9db 100644 --- a/examples/DemoRunner/Source/UI/DemoContentComponent.cpp +++ b/examples/DemoRunner/Source/UI/DemoContentComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/DemoRunner/Source/UI/DemoContentComponent.h b/examples/DemoRunner/Source/UI/DemoContentComponent.h index 03f68c73..8fda527d 100644 --- a/examples/DemoRunner/Source/UI/DemoContentComponent.h +++ b/examples/DemoRunner/Source/UI/DemoContentComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/DemoRunner/Source/UI/MainComponent.cpp b/examples/DemoRunner/Source/UI/MainComponent.cpp index 11b1b572..e6a59a8e 100644 --- a/examples/DemoRunner/Source/UI/MainComponent.cpp +++ b/examples/DemoRunner/Source/UI/MainComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/DemoRunner/Source/UI/MainComponent.h b/examples/DemoRunner/Source/UI/MainComponent.h index f079c972..e1f3a9c1 100644 --- a/examples/DemoRunner/Source/UI/MainComponent.h +++ b/examples/DemoRunner/Source/UI/MainComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/DemoRunner/Source/UI/SettingsContent.h b/examples/DemoRunner/Source/UI/SettingsContent.h index 08b1a7d3..9c3c7133 100644 --- a/examples/DemoRunner/Source/UI/SettingsContent.h +++ b/examples/DemoRunner/Source/UI/SettingsContent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -237,6 +237,11 @@ private: } private: + std::unique_ptr createAccessibilityHandler() override + { + return createIgnoredAccessibilityHandler (*this); + } + GraphicsSettingsGroup graphicsSettings; AudioSettingsGroup audioSettings; }; diff --git a/examples/GUI/AccessibilityDemo.h b/examples/GUI/AccessibilityDemo.h index 88255e98..aff7e54f 100644 --- a/examples/GUI/AccessibilityDemo.h +++ b/examples/GUI/AccessibilityDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -32,7 +32,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/AnimationAppDemo.h b/examples/GUI/AnimationAppDemo.h index 67a76efc..ef0d1f39 100644 --- a/examples/GUI/AnimationAppDemo.h +++ b/examples/GUI/AnimationAppDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, xcode_iphone + exporters: xcode_mac, vs2022, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/AnimationDemo.h b/examples/GUI/AnimationDemo.h index 29b24518..11e1bbe4 100644 --- a/examples/GUI/AnimationDemo.h +++ b/examples/GUI/AnimationDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/BouncingBallWavetableDemo.h b/examples/GUI/BouncingBallWavetableDemo.h index f8319edf..1c121a1b 100644 --- a/examples/GUI/BouncingBallWavetableDemo.h +++ b/examples/GUI/BouncingBallWavetableDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/CMakeLists.txt b/examples/GUI/CMakeLists.txt index 272e8475..dc6880ef 100644 --- a/examples/GUI/CMakeLists.txt +++ b/examples/GUI/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/GUI/CameraDemo.h b/examples/GUI/CameraDemo.h index 92198043..0765e669 100644 --- a/examples/GUI/CameraDemo.h +++ b/examples/GUI/CameraDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -32,7 +32,7 @@ dependencies: juce_audio_basics, juce_audio_devices, juce_core, juce_cryptography, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra, juce_video - exporters: xcode_mac, vs2019, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, androidstudio, xcode_iphone moduleFlags: JUCE_USE_CAMERA=1, JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/CodeEditorDemo.h b/examples/GUI/CodeEditorDemo.h index 2ef7c488..5b6872e2 100644 --- a/examples/GUI/CodeEditorDemo.h +++ b/examples/GUI/CodeEditorDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/ComponentDemo.h b/examples/GUI/ComponentDemo.h index 300ca43b..9202257f 100644 --- a/examples/GUI/ComponentDemo.h +++ b/examples/GUI/ComponentDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019 + exporters: xcode_mac, vs2022 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/ComponentTransformsDemo.h b/examples/GUI/ComponentTransformsDemo.h index 052d0c1e..3cda30d0 100644 --- a/examples/GUI/ComponentTransformsDemo.h +++ b/examples/GUI/ComponentTransformsDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/DialogsDemo.h b/examples/GUI/DialogsDemo.h index b7d5b824..23a2c862 100644 --- a/examples/GUI/DialogsDemo.h +++ b/examples/GUI/DialogsDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/FlexBoxDemo.h b/examples/GUI/FlexBoxDemo.h index eda1feb7..2f9d0138 100644 --- a/examples/GUI/FlexBoxDemo.h +++ b/examples/GUI/FlexBoxDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/FontsDemo.h b/examples/GUI/FontsDemo.h index 111530ab..6a08d6a2 100644 --- a/examples/GUI/FontsDemo.h +++ b/examples/GUI/FontsDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/GraphicsDemo.h b/examples/GUI/GraphicsDemo.h index a404c785..8d005ba4 100644 --- a/examples/GUI/GraphicsDemo.h +++ b/examples/GUI/GraphicsDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/GridDemo.h b/examples/GUI/GridDemo.h index c5d74cf5..d159c52f 100644 --- a/examples/GUI/GridDemo.h +++ b/examples/GUI/GridDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/HelloWorldDemo.h b/examples/GUI/HelloWorldDemo.h index 79754bbd..c5eb7d54 100644 --- a/examples/GUI/HelloWorldDemo.h +++ b/examples/GUI/HelloWorldDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/ImagesDemo.h b/examples/GUI/ImagesDemo.h index 903673ee..a03c6840 100644 --- a/examples/GUI/ImagesDemo.h +++ b/examples/GUI/ImagesDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/KeyMappingsDemo.h b/examples/GUI/KeyMappingsDemo.h index e50e360c..f4501855 100644 --- a/examples/GUI/KeyMappingsDemo.h +++ b/examples/GUI/KeyMappingsDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/LookAndFeelDemo.h b/examples/GUI/LookAndFeelDemo.h index 99ce15c0..352792eb 100644 --- a/examples/GUI/LookAndFeelDemo.h +++ b/examples/GUI/LookAndFeelDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/MDIDemo.h b/examples/GUI/MDIDemo.h index 36d91d99..e5564d3b 100644 --- a/examples/GUI/MDIDemo.h +++ b/examples/GUI/MDIDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/MenusDemo.h b/examples/GUI/MenusDemo.h index 844c525d..8f3abdc2 100644 --- a/examples/GUI/MenusDemo.h +++ b/examples/GUI/MenusDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/MultiTouchDemo.h b/examples/GUI/MultiTouchDemo.h index 36f97bd0..df7dabef 100644 --- a/examples/GUI/MultiTouchDemo.h +++ b/examples/GUI/MultiTouchDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/OpenGLAppDemo.h b/examples/GUI/OpenGLAppDemo.h index c2cf9670..d1b923ac 100644 --- a/examples/GUI/OpenGLAppDemo.h +++ b/examples/GUI/OpenGLAppDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra, juce_opengl - exporters: xcode_mac, vs2019, xcode_iphone + exporters: xcode_mac, vs2022, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/OpenGLDemo.h b/examples/GUI/OpenGLDemo.h index ad3e0bd5..c1bd9cba 100644 --- a/examples/GUI/OpenGLDemo.h +++ b/examples/GUI/OpenGLDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra, juce_opengl - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/OpenGLDemo2D.h b/examples/GUI/OpenGLDemo2D.h index 8ab52524..a12657ca 100644 --- a/examples/GUI/OpenGLDemo2D.h +++ b/examples/GUI/OpenGLDemo2D.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra, juce_opengl - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/PropertiesDemo.h b/examples/GUI/PropertiesDemo.h index 0229c654..a242d683 100644 --- a/examples/GUI/PropertiesDemo.h +++ b/examples/GUI/PropertiesDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/VideoDemo.h b/examples/GUI/VideoDemo.h index 13785276..3f7d02ed 100644 --- a/examples/GUI/VideoDemo.h +++ b/examples/GUI/VideoDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra, juce_video - exporters: xcode_mac, vs2019, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/WebBrowserDemo.h b/examples/GUI/WebBrowserDemo.h index e07250a5..73c55e53 100644 --- a/examples/GUI/WebBrowserDemo.h +++ b/examples/GUI/WebBrowserDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/WidgetsDemo.h b/examples/GUI/WidgetsDemo.h index 13cbe735..4d524c03 100644 --- a/examples/GUI/WidgetsDemo.h +++ b/examples/GUI/WidgetsDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/GUI/WindowsDemo.h b/examples/GUI/WindowsDemo.h index 307f3866..1c703f92 100644 --- a/examples/GUI/WindowsDemo.h +++ b/examples/GUI/WindowsDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Plugins/ARAPluginDemo.h b/examples/Plugins/ARAPluginDemo.h new file mode 100644 index 00000000..abca9566 --- /dev/null +++ b/examples/Plugins/ARAPluginDemo.h @@ -0,0 +1,1419 @@ +/* + ============================================================================== + + This file is part of the JUCE examples. + Copyright (c) 2022 - Raw Material Software Limited + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, + WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR + PURPOSE, ARE DISCLAIMED. + + ============================================================================== +*/ + +/******************************************************************************* + The block below describes the properties of this PIP. A PIP is a short snippet + of code that can be read by the Projucer and used to generate a JUCE project. + + BEGIN_JUCE_PIP_METADATA + + name: ARAPluginDemo + version: 1.0.0 + vendor: JUCE + website: http://juce.com + description: Audio plugin using the ARA API. + + dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, + juce_audio_plugin_client, juce_audio_processors, + juce_audio_utils, juce_core, juce_data_structures, + juce_events, juce_graphics, juce_gui_basics, juce_gui_extra + exporters: xcode_mac, vs2022 + + moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 + + type: AudioProcessor + mainClass: ARADemoPluginAudioProcessor + documentControllerClass: ARADemoPluginDocumentControllerSpecialisation + + useLocalCopy: 1 + + END_JUCE_PIP_METADATA + +*******************************************************************************/ + +#pragma once + + +//============================================================================== +struct PreviewState +{ + std::atomic previewTime { 0.0 }; + std::atomic previewedRegion { nullptr }; +}; + +class SharedTimeSliceThread : public TimeSliceThread +{ +public: + SharedTimeSliceThread() + : TimeSliceThread (String (JucePlugin_Name) + " ARA Sample Reading Thread") + { + startThread (7); // Above default priority so playback is fluent, but below realtime + } +}; + +class AsyncConfigurationCallback : private AsyncUpdater +{ +public: + explicit AsyncConfigurationCallback (std::function callbackIn) + : callback (std::move (callbackIn)) {} + + ~AsyncConfigurationCallback() override { cancelPendingUpdate(); } + + template + auto withLock (RequiresLock&& fn) + { + const SpinLock::ScopedTryLockType scope (processingFlag); + return fn (scope.isLocked()); + } + + void startConfigure() { triggerAsyncUpdate(); } + +private: + void handleAsyncUpdate() override + { + const SpinLock::ScopedLockType scope (processingFlag); + callback(); + } + + std::function callback; + SpinLock processingFlag; +}; + +class Looper +{ +public: + Looper() : inputBuffer (nullptr), pos (loopRange.getStart()) + { + } + + Looper (const AudioBuffer* buffer, Range range) + : inputBuffer (buffer), loopRange (range), pos (range.getStart()) + { + } + + void writeInto (AudioBuffer& buffer) + { + if (loopRange.getLength() == 0) + buffer.clear(); + + const auto numChannelsToCopy = std::min (inputBuffer->getNumChannels(), buffer.getNumChannels()); + + for (auto samplesCopied = 0; samplesCopied < buffer.getNumSamples();) + { + const auto numSamplesToCopy = + std::min (buffer.getNumSamples() - samplesCopied, (int) (loopRange.getEnd() - pos)); + + for (int i = 0; i < numChannelsToCopy; ++i) + { + buffer.copyFrom (i, samplesCopied, *inputBuffer, i, (int) pos, numSamplesToCopy); + } + + samplesCopied += numSamplesToCopy; + pos += numSamplesToCopy; + + jassert (pos <= loopRange.getEnd()); + + if (pos == loopRange.getEnd()) + pos = loopRange.getStart(); + } + } + +private: + const AudioBuffer* inputBuffer; + Range loopRange; + int64 pos; +}; + +class OptionalRange +{ +public: + using Type = Range; + + OptionalRange() : valid (false) {} + explicit OptionalRange (Type valueIn) : valid (true), value (std::move (valueIn)) {} + + explicit operator bool() const noexcept { return valid; } + + const auto& operator*() const + { + jassert (valid); + return value; + } + +private: + bool valid; + Type value; +}; + +//============================================================================== +// Returns the modified sample range in the output buffer. +inline OptionalRange readPlaybackRangeIntoBuffer (Range playbackRange, + const ARAPlaybackRegion* playbackRegion, + AudioBuffer& buffer, + const std::function& getReader) +{ + const auto rangeInAudioModificationTime = playbackRange.movedToStartAt (playbackRange.getStart() + - playbackRegion->getStartInAudioModificationTime()); + + const auto audioSource = playbackRegion->getAudioModification()->getAudioSource(); + const auto audioModificationSampleRate = audioSource->getSampleRate(); + + const Range sampleRangeInAudioModification { + ARA::roundSamplePosition (rangeInAudioModificationTime.getStart() * audioModificationSampleRate), + ARA::roundSamplePosition (rangeInAudioModificationTime.getEnd() * audioModificationSampleRate) - 1 + }; + + const auto inputOffset = jlimit ((int64_t) 0, audioSource->getSampleCount(), sampleRangeInAudioModification.getStart()); + + const auto outputOffset = -std::min (sampleRangeInAudioModification.getStart(), (int64_t) 0); + + /* TODO: Handle different AudioSource and playback sample rates. + + The conversion should be done inside a specialized AudioFormatReader so that we could use + playbackSampleRate everywhere in this function and we could still read `readLength` number of samples + from the source. + + The current implementation will be incorrect when sampling rates differ. + */ + const auto readLength = [&] + { + const auto sourceReadLength = + std::min (sampleRangeInAudioModification.getEnd(), audioSource->getSampleCount()) - inputOffset; + + const auto outputReadLength = + std::min (outputOffset + sourceReadLength, (int64_t) buffer.getNumSamples()) - outputOffset; + + return std::min (sourceReadLength, outputReadLength); + }(); + + if (readLength == 0) + return OptionalRange { {} }; + + auto* reader = getReader (audioSource); + + if (reader != nullptr && reader->read (&buffer, (int) outputOffset, (int) readLength, inputOffset, true, true)) + return OptionalRange { { outputOffset, readLength } }; + + return {}; +} + +class PossiblyBufferedReader +{ +public: + PossiblyBufferedReader() = default; + + explicit PossiblyBufferedReader (std::unique_ptr readerIn) + : setTimeoutFn ([ptr = readerIn.get()] (int ms) { ptr->setReadTimeout (ms); }), + reader (std::move (readerIn)) + {} + + explicit PossiblyBufferedReader (std::unique_ptr readerIn) + : setTimeoutFn(), + reader (std::move (readerIn)) + {} + + void setReadTimeout (int ms) + { + NullCheckedInvocation::invoke (setTimeoutFn, ms); + } + + AudioFormatReader* get() const { return reader.get(); } + +private: + std::function setTimeoutFn; + std::unique_ptr reader; +}; + +//============================================================================== +class PlaybackRenderer : public ARAPlaybackRenderer +{ +public: + using ARAPlaybackRenderer::ARAPlaybackRenderer; + + void prepareToPlay (double sampleRateIn, + int maximumSamplesPerBlockIn, + int numChannelsIn, + AudioProcessor::ProcessingPrecision, + AlwaysNonRealtime alwaysNonRealtime) override + { + numChannels = numChannelsIn; + sampleRate = sampleRateIn; + maximumSamplesPerBlock = maximumSamplesPerBlockIn; + tempBuffer.reset (new AudioBuffer (numChannels, maximumSamplesPerBlock)); + + useBufferedAudioSourceReader = alwaysNonRealtime == AlwaysNonRealtime::no; + + for (const auto playbackRegion : getPlaybackRegions()) + { + auto audioSource = playbackRegion->getAudioModification()->getAudioSource(); + + if (audioSourceReaders.find (audioSource) == audioSourceReaders.end()) + { + auto reader = std::make_unique (audioSource); + + if (! useBufferedAudioSourceReader) + { + audioSourceReaders.emplace (audioSource, + PossiblyBufferedReader { std::move (reader) }); + } + else + { + const auto readAheadSize = jmax (4 * maximumSamplesPerBlock, + roundToInt (2.0 * sampleRate)); + audioSourceReaders.emplace (audioSource, + PossiblyBufferedReader { std::make_unique (reader.release(), + *sharedTimesliceThread, + readAheadSize) }); + } + } + } + } + + void releaseResources() override + { + audioSourceReaders.clear(); + tempBuffer.reset(); + } + + bool processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept override + { + const auto numSamples = buffer.getNumSamples(); + jassert (numSamples <= maximumSamplesPerBlock); + jassert (numChannels == buffer.getNumChannels()); + jassert (realtime == AudioProcessor::Realtime::no || useBufferedAudioSourceReader); + const auto timeInSamples = positionInfo.getTimeInSamples().orFallback (0); + const auto isPlaying = positionInfo.getIsPlaying(); + + bool success = true; + bool didRenderAnyRegion = false; + + if (isPlaying) + { + const auto blockRange = Range::withStartAndLength (timeInSamples, numSamples); + + for (const auto& playbackRegion : getPlaybackRegions()) + { + // Evaluate region borders in song time, calculate sample range to render in song time. + // Note that this example does not use head- or tailtime, so the includeHeadAndTail + // parameter is set to false here - this might need to be adjusted in actual plug-ins. + const auto playbackSampleRange = playbackRegion->getSampleRange (sampleRate, ARAPlaybackRegion::IncludeHeadAndTail::no); + auto renderRange = blockRange.getIntersectionWith (playbackSampleRange); + + if (renderRange.isEmpty()) + continue; + + // Evaluate region borders in modification/source time and calculate offset between + // song and source samples, then clip song samples accordingly + // (if an actual plug-in supports time stretching, this must be taken into account here). + Range modificationSampleRange { playbackRegion->getStartInAudioModificationSamples(), + playbackRegion->getEndInAudioModificationSamples() }; + const auto modificationSampleOffset = modificationSampleRange.getStart() - playbackSampleRange.getStart(); + + renderRange = renderRange.getIntersectionWith (modificationSampleRange.movedToStartAt (playbackSampleRange.getStart())); + + if (renderRange.isEmpty()) + continue; + + // Get the audio source for the region and find the reader for that source. + // This simplified example code only produces audio if sample rate and channel count match - + // a robust plug-in would need to do conversion, see ARA SDK documentation. + const auto audioSource = playbackRegion->getAudioModification()->getAudioSource(); + const auto readerIt = audioSourceReaders.find (audioSource); + + if (std::make_tuple (audioSource->getChannelCount(), audioSource->getSampleRate()) != std::make_tuple (numChannels, sampleRate) + || (readerIt == audioSourceReaders.end())) + { + success = false; + continue; + } + + auto& reader = readerIt->second; + reader.setReadTimeout (realtime == AudioProcessor::Realtime::no ? 100 : 0); + + // Calculate buffer offsets. + const int numSamplesToRead = (int) renderRange.getLength(); + const int startInBuffer = (int) (renderRange.getStart() - blockRange.getStart()); + auto startInSource = renderRange.getStart() + modificationSampleOffset; + + // Read samples: + // first region can write directly into output, later regions need to use local buffer. + auto& readBuffer = (didRenderAnyRegion) ? *tempBuffer : buffer; + + if (! reader.get()->read (&readBuffer, startInBuffer, numSamplesToRead, startInSource, true, true)) + { + success = false; + continue; + } + + if (didRenderAnyRegion) + { + // Mix local buffer into the output buffer. + for (int c = 0; c < numChannels; ++c) + buffer.addFrom (c, startInBuffer, *tempBuffer, c, startInBuffer, numSamplesToRead); + } + else + { + // Clear any excess at start or end of the region. + if (startInBuffer != 0) + buffer.clear (0, startInBuffer); + + const int endInBuffer = startInBuffer + numSamplesToRead; + const int remainingSamples = numSamples - endInBuffer; + + if (remainingSamples != 0) + buffer.clear (endInBuffer, remainingSamples); + + didRenderAnyRegion = true; + } + } + } + + // If no playback or no region did intersect, clear buffer now. + if (! didRenderAnyRegion) + buffer.clear(); + + return success; + } + +private: + //============================================================================== + // We're subclassing here only to provide a proper default c'tor for our shared resource + + SharedResourcePointer sharedTimesliceThread; + std::map audioSourceReaders; + bool useBufferedAudioSourceReader = true; + int numChannels = 2; + double sampleRate = 48000.0; + int maximumSamplesPerBlock = 128; + std::unique_ptr> tempBuffer; +}; + +class EditorRenderer : public ARAEditorRenderer, + private ARARegionSequence::Listener +{ +public: + EditorRenderer (ARA::PlugIn::DocumentController* documentController, const PreviewState* previewStateIn) + : ARAEditorRenderer (documentController), previewState (previewStateIn), previewBuffer() + { + jassert (previewState != nullptr); + } + + ~EditorRenderer() override + { + for (const auto& rs : regionSequences) + rs->removeListener (this); + } + + void didAddPlaybackRegionToRegionSequence (ARARegionSequence*, ARAPlaybackRegion*) override + { + asyncConfigCallback.startConfigure(); + } + + void didAddRegionSequence (ARA::PlugIn::RegionSequence* rs) noexcept override + { + auto* sequence = dynamic_cast (rs); + sequence->addListener (this); + regionSequences.insert (sequence); + asyncConfigCallback.startConfigure(); + } + + void didAddPlaybackRegion (ARA::PlugIn::PlaybackRegion*) noexcept override + { + asyncConfigCallback.startConfigure(); + } + + /* An ARA host could be using either the `addPlaybackRegion()` or `addRegionSequence()` interface + so we need to check the other side of both. + + The callback must have a signature of `bool (ARAPlaybackRegion*)` + */ + template + void forEachPlaybackRegion (Callback&& cb) + { + for (const auto& playbackRegion : getPlaybackRegions()) + if (! cb (playbackRegion)) + return; + + for (const auto& regionSequence : getRegionSequences()) + for (const auto& playbackRegion : regionSequence->getPlaybackRegions()) + if (! cb (playbackRegion)) + return; + } + + void prepareToPlay (double sampleRateIn, + int maximumExpectedSamplesPerBlock, + int numChannels, + AudioProcessor::ProcessingPrecision, + AlwaysNonRealtime alwaysNonRealtime) override + { + sampleRate = sampleRateIn; + previewBuffer = std::make_unique> (numChannels, (int) (2 * sampleRateIn)); + + ignoreUnused (maximumExpectedSamplesPerBlock, alwaysNonRealtime); + } + + void releaseResources() override + { + audioSourceReaders.clear(); + } + + void reset() override + { + previewBuffer->clear(); + } + + bool processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept override + { + ignoreUnused (realtime); + + return asyncConfigCallback.withLock ([&] (bool locked) + { + if (! locked) + return true; + + if (positionInfo.getIsPlaying()) + return true; + + if (const auto previewedRegion = previewState->previewedRegion.load()) + { + const auto regionIsAssignedToEditor = [&]() + { + bool regionIsAssigned = false; + + forEachPlaybackRegion ([&previewedRegion, ®ionIsAssigned] (const auto& region) + { + if (region == previewedRegion) + { + regionIsAssigned = true; + return false; + } + + return true; + }); + + return regionIsAssigned; + }(); + + if (regionIsAssignedToEditor) + { + const auto previewTime = previewState->previewTime.load(); + + if (lastPreviewTime != previewTime || lastPlaybackRegion != previewedRegion) + { + Range previewRangeInPlaybackTime { previewTime - 0.25, previewTime + 0.25 }; + previewBuffer->clear(); + const auto rangeInOutput = readPlaybackRangeIntoBuffer (previewRangeInPlaybackTime, + previewedRegion, + *previewBuffer, + [this] (auto* source) -> auto* + { + const auto iter = audioSourceReaders.find (source); + return iter != audioSourceReaders.end() ? iter->second.get() : nullptr; + }); + + if (rangeInOutput) + { + lastPreviewTime = previewTime; + lastPlaybackRegion = previewedRegion; + previewLooper = Looper (previewBuffer.get(), *rangeInOutput); + } + } + else + { + previewLooper.writeInto (buffer); + } + } + } + + return true; + }); + } + +private: + void configure() + { + forEachPlaybackRegion ([this, maximumExpectedSamplesPerBlock = 1000] (const auto& playbackRegion) + { + const auto audioSource = playbackRegion->getAudioModification()->getAudioSource(); + + if (audioSourceReaders.find (audioSource) == audioSourceReaders.end()) + { + audioSourceReaders[audioSource] = std::make_unique ( + new ARAAudioSourceReader (playbackRegion->getAudioModification()->getAudioSource()), + *timeSliceThread, + std::max (4 * maximumExpectedSamplesPerBlock, (int) sampleRate)); + } + + return true; + }); + } + + const PreviewState* previewState = nullptr; + AsyncConfigurationCallback asyncConfigCallback { [this] { configure(); } }; + double lastPreviewTime = 0.0; + ARAPlaybackRegion* lastPlaybackRegion = nullptr; + std::unique_ptr> previewBuffer; + Looper previewLooper; + + double sampleRate = 48000.0; + SharedResourcePointer timeSliceThread; + std::map> audioSourceReaders; + + std::set regionSequences; +}; + +//============================================================================== +class ARADemoPluginDocumentControllerSpecialisation : public ARADocumentControllerSpecialisation +{ +public: + using ARADocumentControllerSpecialisation::ARADocumentControllerSpecialisation; + + PreviewState previewState; + +protected: + ARAPlaybackRenderer* doCreatePlaybackRenderer() noexcept override + { + return new PlaybackRenderer (getDocumentController()); + } + + EditorRenderer* doCreateEditorRenderer() noexcept override + { + return new EditorRenderer (getDocumentController(), &previewState); + } + + bool doRestoreObjectsFromStream (ARAInputStream& input, + const ARARestoreObjectsFilter* filter) noexcept override + { + ignoreUnused (input, filter); + return false; + } + + bool doStoreObjectsToStream (ARAOutputStream& output, const ARAStoreObjectsFilter* filter) noexcept override + { + ignoreUnused (output, filter); + return false; + } +}; + +//============================================================================== +class ARADemoPluginAudioProcessorImpl : public AudioProcessor, + public AudioProcessorARAExtension +{ +public: + //============================================================================== + ARADemoPluginAudioProcessorImpl() + : AudioProcessor (getBusesProperties()) + {} + + ~ARADemoPluginAudioProcessorImpl() override = default; + + //============================================================================== + void prepareToPlay (double sampleRate, int samplesPerBlock) override + { + prepareToPlayForARA (sampleRate, samplesPerBlock, getMainBusNumOutputChannels(), getProcessingPrecision()); + } + + void releaseResources() override + { + releaseResourcesForARA(); + } + + bool isBusesLayoutSupported (const BusesLayout& layouts) const override + { + if (layouts.getMainOutputChannelSet() != AudioChannelSet::mono() + && layouts.getMainOutputChannelSet() != AudioChannelSet::stereo()) + return false; + + return true; + } + + void processBlock (AudioBuffer& buffer, MidiBuffer& midiMessages) override + { + ignoreUnused (midiMessages); + + ScopedNoDenormals noDenormals; + + if (! processBlockForARA (buffer, isRealtime(), getPlayHead())) + processBlockBypassed (buffer, midiMessages); + } + + //============================================================================== + const String getName() const override { return "ARAPluginDemo"; } + bool acceptsMidi() const override { return true; } + bool producesMidi() const override { return true; } + double getTailLengthSeconds() const override { return 0.0; } + + //============================================================================== + int getNumPrograms() override { return 0; } + int getCurrentProgram() override { return 0; } + void setCurrentProgram (int) override {} + const String getProgramName (int) override { return "None"; } + void changeProgramName (int, const String&) override {} + + //============================================================================== + void getStateInformation (MemoryBlock&) override {} + void setStateInformation (const void*, int) override {} + +private: + //============================================================================== + static BusesProperties getBusesProperties() + { + return BusesProperties().withInput ("Input", AudioChannelSet::stereo(), true) + .withOutput ("Output", AudioChannelSet::stereo(), true); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARADemoPluginAudioProcessorImpl) +}; + +//============================================================================== +struct WaveformCache : private ARAAudioSource::Listener +{ + WaveformCache() : thumbnailCache (20) + { + } + + ~WaveformCache() override + { + for (const auto& entry : thumbnails) + { + entry.first->removeListener (this); + } + } + + //============================================================================== + void willDestroyAudioSource (ARAAudioSource* audioSource) override + { + removeAudioSource (audioSource); + } + + AudioThumbnail& getOrCreateThumbnail (ARAAudioSource* audioSource) + { + const auto iter = thumbnails.find (audioSource); + + if (iter != std::end (thumbnails)) + return *iter->second; + + auto thumb = std::make_unique (128, dummyManager, thumbnailCache); + auto& result = *thumb; + + ++hash; + thumb->setReader (new ARAAudioSourceReader (audioSource), hash); + + audioSource->addListener (this); + thumbnails.emplace (audioSource, std::move (thumb)); + return result; + } + +private: + void removeAudioSource (ARAAudioSource* audioSource) + { + audioSource->removeListener (this); + thumbnails.erase (audioSource); + } + + int64 hash = 0; + AudioFormatManager dummyManager; + AudioThumbnailCache thumbnailCache; + std::map> thumbnails; +}; + +class PlaybackRegionView : public Component, + public ChangeListener +{ +public: + PlaybackRegionView (ARAPlaybackRegion& region, WaveformCache& cache) + : playbackRegion (region), waveformCache (cache) + { + auto* audioSource = playbackRegion.getAudioModification()->getAudioSource(); + + waveformCache.getOrCreateThumbnail (audioSource).addChangeListener (this); + } + + ~PlaybackRegionView() override + { + waveformCache.getOrCreateThumbnail (playbackRegion.getAudioModification()->getAudioSource()) + .removeChangeListener (this); + } + + void mouseDown (const MouseEvent& m) override + { + const auto relativeTime = (double) m.getMouseDownX() / getLocalBounds().getWidth(); + const auto previewTime = playbackRegion.getStartInPlaybackTime() + + relativeTime * playbackRegion.getDurationInPlaybackTime(); + auto& previewState = ARADocumentControllerSpecialisation::getSpecialisedDocumentController (playbackRegion.getDocumentController())->previewState; + previewState.previewTime.store (previewTime); + previewState.previewedRegion.store (&playbackRegion); + } + + void mouseUp (const MouseEvent&) override + { + auto& previewState = ARADocumentControllerSpecialisation::getSpecialisedDocumentController (playbackRegion.getDocumentController())->previewState; + previewState.previewTime.store (0.0); + previewState.previewedRegion.store (nullptr); + } + + void changeListenerCallback (ChangeBroadcaster*) override + { + repaint(); + } + + void paint (Graphics& g) override + { + g.fillAll (Colours::white.darker()); + g.setColour (Colours::darkgrey.darker()); + auto& thumbnail = waveformCache.getOrCreateThumbnail (playbackRegion.getAudioModification()->getAudioSource()); + thumbnail.drawChannels (g, + getLocalBounds(), + playbackRegion.getStartInAudioModificationTime(), + playbackRegion.getEndInAudioModificationTime(), + 1.0f); + g.setColour (Colours::black); + g.drawRect (getLocalBounds()); + } + + void resized() override + { + repaint(); + } + +private: + ARAPlaybackRegion& playbackRegion; + WaveformCache& waveformCache; +}; + +class RegionSequenceView : public Component, + public ARARegionSequence::Listener, + public ChangeBroadcaster, + private ARAPlaybackRegion::Listener +{ +public: + RegionSequenceView (ARARegionSequence& rs, WaveformCache& cache, double pixelPerSec) + : regionSequence (rs), waveformCache (cache), zoomLevelPixelPerSecond (pixelPerSec) + { + regionSequence.addListener (this); + + for (auto* playbackRegion : regionSequence.getPlaybackRegions()) + createAndAddPlaybackRegionView (playbackRegion); + + updatePlaybackDuration(); + } + + ~RegionSequenceView() override + { + regionSequence.removeListener (this); + + for (const auto& it : playbackRegionViews) + it.first->removeListener (this); + } + + //============================================================================== + // ARA Document change callback overrides + void willRemovePlaybackRegionFromRegionSequence (ARARegionSequence*, + ARAPlaybackRegion* playbackRegion) override + { + playbackRegion->removeListener (this); + removeChildComponent (playbackRegionViews[playbackRegion].get()); + playbackRegionViews.erase (playbackRegion); + updatePlaybackDuration(); + } + + void didAddPlaybackRegionToRegionSequence (ARARegionSequence*, ARAPlaybackRegion* playbackRegion) override + { + createAndAddPlaybackRegionView (playbackRegion); + updatePlaybackDuration(); + } + + void willDestroyPlaybackRegion (ARAPlaybackRegion* playbackRegion) override + { + playbackRegion->removeListener (this); + removeChildComponent (playbackRegionViews[playbackRegion].get()); + playbackRegionViews.erase (playbackRegion); + updatePlaybackDuration(); + } + + void willUpdatePlaybackRegionProperties (ARAPlaybackRegion*, ARAPlaybackRegion::PropertiesPtr) override + { + } + + void didUpdatePlaybackRegionProperties (ARAPlaybackRegion*) override + { + updatePlaybackDuration(); + } + + void resized() override + { + for (auto& pbr : playbackRegionViews) + { + const auto playbackRegion = pbr.first; + pbr.second->setBounds ( + getLocalBounds() + .withTrimmedLeft (roundToInt (playbackRegion->getStartInPlaybackTime() * zoomLevelPixelPerSecond)) + .withWidth (roundToInt (playbackRegion->getDurationInPlaybackTime() * zoomLevelPixelPerSecond))); + } + } + + auto getPlaybackDuration() const noexcept + { + return playbackDuration; + } + + void setZoomLevel (double pixelPerSecond) + { + zoomLevelPixelPerSecond = pixelPerSecond; + resized(); + } + +private: + void createAndAddPlaybackRegionView (ARAPlaybackRegion* playbackRegion) + { + playbackRegionViews[playbackRegion] = std::make_unique (*playbackRegion, waveformCache); + playbackRegion->addListener (this); + addAndMakeVisible (*playbackRegionViews[playbackRegion]); + } + + void updatePlaybackDuration() + { + const auto iter = std::max_element ( + playbackRegionViews.begin(), + playbackRegionViews.end(), + [] (const auto& a, const auto& b) { return a.first->getEndInPlaybackTime() < b.first->getEndInPlaybackTime(); }); + + playbackDuration = iter != playbackRegionViews.end() ? iter->first->getEndInPlaybackTime() + : 0.0; + + sendChangeMessage(); + } + + ARARegionSequence& regionSequence; + WaveformCache& waveformCache; + std::unordered_map> playbackRegionViews; + double playbackDuration = 0.0; + double zoomLevelPixelPerSecond; +}; + +class ZoomControls : public Component +{ +public: + ZoomControls() + { + addAndMakeVisible (zoomInButton); + addAndMakeVisible (zoomOutButton); + } + + void setZoomInCallback (std::function cb) { zoomInButton.onClick = std::move (cb); } + void setZoomOutCallback (std::function cb) { zoomOutButton.onClick = std::move (cb); } + + void resized() override + { + FlexBox fb; + fb.justifyContent = FlexBox::JustifyContent::flexEnd; + + for (auto* button : { &zoomInButton, &zoomOutButton }) + fb.items.add (FlexItem (*button).withMinHeight (30.0f).withMinWidth (30.0f).withMargin ({ 5, 5, 5, 0 })); + + fb.performLayout (getLocalBounds()); + } + +private: + TextButton zoomInButton { "+" }, zoomOutButton { "-" }; +}; + +class TrackHeader : public Component +{ +public: + explicit TrackHeader (const ARARegionSequence& regionSequenceIn) : regionSequence (regionSequenceIn) + { + update(); + + addAndMakeVisible (trackNameLabel); + } + + void resized() override + { + trackNameLabel.setBounds (getLocalBounds().reduced (2)); + } + + void paint (Graphics& g) override + { + g.setColour (getLookAndFeel().findColour (ResizableWindow::backgroundColourId)); + g.fillRoundedRectangle (getLocalBounds().reduced (2).toType(), 6.0f); + g.setColour (getLookAndFeel().findColour (ResizableWindow::backgroundColourId).contrasting()); + g.drawRoundedRectangle (getLocalBounds().reduced (2).toType(), 6.0f, 1.0f); + } + +private: + void update() + { + const auto getWithDefaultValue = + [] (const ARA::PlugIn::OptionalProperty& optional, String defaultValue) + { + if (const ARA::ARAUtf8String value = optional) + return String (value); + + return defaultValue; + }; + + trackNameLabel.setText (getWithDefaultValue (regionSequence.getName(), "No track name"), + NotificationType::dontSendNotification); + } + + const ARARegionSequence& regionSequence; + Label trackNameLabel; +}; + +constexpr auto trackHeight = 60; + +class VerticalLayoutViewportContent : public Component +{ +public: + void resized() override + { + auto bounds = getLocalBounds(); + + for (auto* component : getChildren()) + { + component->setBounds (bounds.removeFromTop (trackHeight)); + component->resized(); + } + } + + void setOverlayComponent (Component* component) + { + if (overlayComponent != nullptr && overlayComponent != component) + removeChildComponent (overlayComponent); + + addChildComponent (component); + overlayComponent = component; + } + +private: + Component* overlayComponent = nullptr; +}; + +class VerticalLayoutViewport : public Viewport +{ +public: + VerticalLayoutViewport() + { + setViewedComponent (&content, false); + } + + void paint (Graphics& g) override + { + g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId).brighter()); + } + + std::function)> onVisibleAreaChanged; + + VerticalLayoutViewportContent content; + +private: + void visibleAreaChanged (const Rectangle& newVisibleArea) override + { + NullCheckedInvocation::invoke (onVisibleAreaChanged, newVisibleArea); + } +}; + +class OverlayComponent : public Component, + private Timer +{ +public: + class PlayheadMarkerComponent : public Component + { + void paint (Graphics& g) override { g.fillAll (juce::Colours::yellow.darker (0.2f)); } + }; + + OverlayComponent(std::function getAudioPlayheadIn) + : getAudioPlayhead (std::move (getAudioPlayheadIn)) + { + addChildComponent (playheadMarker); + setInterceptsMouseClicks (false, false); + startTimerHz (30); + } + + ~OverlayComponent() override + { + stopTimer(); + } + + void resized() override + { + doResize(); + } + + void setZoomLevel (double pixelPerSecondIn) + { + pixelPerSecond = pixelPerSecondIn; + } + + void setHorizontalOffset (int offset) + { + horizontalOffset = offset; + } + +private: + void doResize() + { + auto* aph = getAudioPlayhead(); + const auto info = aph->getPosition(); + + if (info.hasValue() && info->getIsPlaying()) + { + const auto markerX = info->getTimeInSeconds().orFallback (0) * pixelPerSecond; + const auto playheadLine = getLocalBounds().withTrimmedLeft ((int) (markerX - markerWidth / 2.0) - horizontalOffset) + .removeFromLeft ((int) markerWidth); + playheadMarker.setVisible (true); + playheadMarker.setBounds (playheadLine); + } + else + { + playheadMarker.setVisible (false); + } + } + + void timerCallback() override + { + doResize(); + } + + static constexpr double markerWidth = 2.0; + + std::function getAudioPlayhead; + double pixelPerSecond = 1.0; + int horizontalOffset = 0; + PlayheadMarkerComponent playheadMarker; +}; + +class DocumentView : public Component, + public ChangeListener, + private ARADocument::Listener, + private ARAEditorView::Listener +{ +public: + explicit DocumentView (ARADocument& document, std::function getAudioPlayhead) + : araDocument (document), + overlay (std::move (getAudioPlayhead)) + { + addAndMakeVisible (tracksBackground); + + viewport.onVisibleAreaChanged = [this] (const auto& r) + { + viewportHeightOffset = r.getY(); + overlay.setHorizontalOffset (r.getX()); + resized(); + }; + + addAndMakeVisible (viewport); + + overlay.setZoomLevel (zoomLevelPixelPerSecond); + addAndMakeVisible (overlay); + + zoomControls.setZoomInCallback ([this] { zoom (2.0); }); + zoomControls.setZoomOutCallback ([this] { zoom (0.5); }); + addAndMakeVisible (zoomControls); + + invalidateRegionSequenceViews(); + araDocument.addListener (this); + } + + ~DocumentView() override + { + araDocument.removeListener (this); + } + + //============================================================================== + // ARADocument::Listener overrides + void didReorderRegionSequencesInDocument (ARADocument*) override + { + invalidateRegionSequenceViews(); + } + + void didAddRegionSequenceToDocument (ARADocument*, ARARegionSequence*) override + { + invalidateRegionSequenceViews(); + } + + void willRemoveRegionSequenceFromDocument (ARADocument*, ARARegionSequence* regionSequence) override + { + removeRegionSequenceView (regionSequence); + } + + void didEndEditing (ARADocument*) override + { + rebuildRegionSequenceViews(); + update(); + } + + //============================================================================== + void changeListenerCallback (ChangeBroadcaster*) override + { + update(); + } + + //============================================================================== + // ARAEditorView::Listener overrides + void onNewSelection (const ARA::PlugIn::ViewSelection&) override + { + } + + void onHideRegionSequences (const std::vector&) override + { + } + + //============================================================================== + void paint (Graphics& g) override + { + g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId).darker()); + } + + void resized() override + { + auto bounds = getLocalBounds(); + const auto bottomControlsBounds = bounds.removeFromBottom (40); + const auto headerBounds = bounds.removeFromLeft (headerWidth).reduced (2); + + zoomControls.setBounds (bottomControlsBounds); + layOutVertically (headerBounds, trackHeaders, viewportHeightOffset); + tracksBackground.setBounds (bounds); + viewport.setBounds (bounds); + overlay.setBounds (bounds); + } + + //============================================================================== + void setZoomLevel (double pixelPerSecond) + { + zoomLevelPixelPerSecond = pixelPerSecond; + + for (const auto& view : regionSequenceViews) + view.second->setZoomLevel (zoomLevelPixelPerSecond); + + overlay.setZoomLevel (zoomLevelPixelPerSecond); + + update(); + } + + static constexpr int headerWidth = 120; + +private: + struct RegionSequenceViewKey + { + explicit RegionSequenceViewKey (ARARegionSequence* regionSequence) + : orderIndex (regionSequence->getOrderIndex()), sequence (regionSequence) + { + } + + bool operator< (const RegionSequenceViewKey& other) const + { + return std::tie (orderIndex, sequence) < std::tie (other.orderIndex, other.sequence); + } + + ARA::ARAInt32 orderIndex; + ARARegionSequence* sequence; + }; + + void zoom (double factor) + { + zoomLevelPixelPerSecond = jlimit (minimumZoom, minimumZoom * 32, zoomLevelPixelPerSecond * factor); + setZoomLevel (zoomLevelPixelPerSecond); + } + + template + void layOutVertically (Rectangle bounds, T& components, int verticalOffset = 0) + { + bounds = bounds.withY (bounds.getY() - verticalOffset).withHeight (bounds.getHeight() + verticalOffset); + + for (auto& component : components) + { + component.second->setBounds (bounds.removeFromTop (trackHeight)); + component.second->resized(); + } + } + + void update() + { + timelineLength = 0.0; + + for (const auto& view : regionSequenceViews) + timelineLength = std::max (timelineLength, view.second->getPlaybackDuration()); + + const Rectangle timelineSize (roundToInt (timelineLength * zoomLevelPixelPerSecond), + (int) regionSequenceViews.size() * trackHeight); + viewport.content.setSize (timelineSize.getWidth(), timelineSize.getHeight()); + viewport.content.resized(); + + resized(); + } + + void addTrackViews (ARARegionSequence* regionSequence) + { + const auto insertIntoMap = [](auto& map, auto key, auto value) -> auto& + { + auto it = map.insert ({ std::move (key), std::move (value) }); + return *(it.first->second); + }; + + auto& regionSequenceView = insertIntoMap ( + regionSequenceViews, + RegionSequenceViewKey { regionSequence }, + std::make_unique (*regionSequence, waveformCache, zoomLevelPixelPerSecond)); + + regionSequenceView.addChangeListener (this); + viewport.content.addAndMakeVisible (regionSequenceView); + + auto& trackHeader = insertIntoMap (trackHeaders, + RegionSequenceViewKey { regionSequence }, + std::make_unique (*regionSequence)); + + addAndMakeVisible (trackHeader); + } + + void removeRegionSequenceView (ARARegionSequence* regionSequence) + { + const auto& view = regionSequenceViews.find (RegionSequenceViewKey { regionSequence }); + + if (view != regionSequenceViews.cend()) + { + removeChildComponent (view->second.get()); + regionSequenceViews.erase (view); + } + + invalidateRegionSequenceViews(); + } + + void invalidateRegionSequenceViews() + { + regionSequenceViewsAreValid = false; + rebuildRegionSequenceViews(); + } + + void rebuildRegionSequenceViews() + { + if (! regionSequenceViewsAreValid && ! araDocument.getDocumentController()->isHostEditingDocument()) + { + for (auto& view : regionSequenceViews) + removeChildComponent (view.second.get()); + + regionSequenceViews.clear(); + + for (auto& view : trackHeaders) + removeChildComponent (view.second.get()); + + trackHeaders.clear(); + + for (auto* regionSequence : araDocument.getRegionSequences()) + { + addTrackViews (regionSequence); + } + + update(); + + regionSequenceViewsAreValid = true; + } + } + + class TracksBackgroundComponent : public Component + { + void paint (Graphics& g) override + { + g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId).brighter()); + } + }; + + static constexpr auto minimumZoom = 10.0; + static constexpr auto trackHeight = 60; + + ARADocument& araDocument; + + bool regionSequenceViewsAreValid = false; + double timelineLength = 0; + double zoomLevelPixelPerSecond = minimumZoom * 4; + + WaveformCache waveformCache; + TracksBackgroundComponent tracksBackground; + std::map> trackHeaders; + std::map> regionSequenceViews; + VerticalLayoutViewport viewport; + OverlayComponent overlay; + ZoomControls zoomControls; + + int viewportHeightOffset = 0; +}; + + +class ARADemoPluginProcessorEditor : public AudioProcessorEditor, + public AudioProcessorEditorARAExtension +{ +public: + explicit ARADemoPluginProcessorEditor (ARADemoPluginAudioProcessorImpl& p) + : AudioProcessorEditor (&p), + AudioProcessorEditorARAExtension (&p) + { + if (auto* editorView = getARAEditorView()) + { + auto* document = ARADocumentControllerSpecialisation::getSpecialisedDocumentController(editorView->getDocumentController())->getDocument(); + documentView = std::make_unique (*document, + [this]() { return getAudioProcessor()->getPlayHead(); }); + } + + addAndMakeVisible (documentView.get()); + + // ARA requires that plugin editors are resizable to support tight integration + // into the host UI + setResizable (true, false); + setSize (400, 300); + } + + //============================================================================== + void paint (Graphics& g) override + { + g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId)); + + if (! isARAEditorView()) + { + g.setColour (Colours::white); + g.setFont (15.0f); + g.drawFittedText ("ARA host isn't detected. This plugin only supports ARA mode", + getLocalBounds(), + Justification::centred, + 1); + } + } + + void resized() override + { + if (documentView != nullptr) + documentView->setBounds (getLocalBounds()); + } + +private: + std::unique_ptr documentView; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARADemoPluginProcessorEditor) +}; + +class ARADemoPluginAudioProcessor : public ARADemoPluginAudioProcessorImpl +{ +public: + bool hasEditor() const override { return true; } + AudioProcessorEditor* createEditor() override { return new ARADemoPluginProcessorEditor (*this); } +}; diff --git a/examples/Plugins/AUv3SynthPluginDemo.h b/examples/Plugins/AUv3SynthPluginDemo.h index 8b58bd22..edd1c86d 100644 --- a/examples/Plugins/AUv3SynthPluginDemo.h +++ b/examples/Plugins/AUv3SynthPluginDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -317,8 +317,8 @@ public: currentRecording (1, 1), currentProgram (0) { // initialize parameters - addParameter (isRecordingParam = new AudioParameterBool ("isRecording", "Is Recording", false)); - addParameter (roomSizeParam = new AudioParameterFloat ("roomSize", "Room Size", 0.0f, 1.0f, 0.5f)); + addParameter (isRecordingParam = new AudioParameterBool ({ "isRecording", 1 }, "Is Recording", false)); + addParameter (roomSizeParam = new AudioParameterFloat ({ "roomSize", 1 }, "Room Size", 0.0f, 1.0f, 0.5f)); formatManager.registerBasicFormats(); diff --git a/examples/Plugins/ArpeggiatorPluginDemo.h b/examples/Plugins/ArpeggiatorPluginDemo.h index 831e949d..b6489d71 100644 --- a/examples/Plugins/ArpeggiatorPluginDemo.h +++ b/examples/Plugins/ArpeggiatorPluginDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019 + exporters: xcode_mac, vs2022 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -60,7 +60,7 @@ public: Arpeggiator() : AudioProcessor (BusesProperties()) // add no audio buses at all { - addParameter (speed = new AudioParameterFloat ("speed", "Arpeggiator Speed", 0.0, 1.0, 0.5)); + addParameter (speed = new AudioParameterFloat ({ "speed", 1 }, "Arpeggiator Speed", 0.0, 1.0, 0.5)); } //============================================================================== @@ -79,7 +79,7 @@ public: void processBlock (AudioBuffer& buffer, MidiBuffer& midi) override { - // the audio buffer in a midi effect will have zero channels! + // A pure MIDI plugin shouldn't be provided any audio data jassert (buffer.getNumChannels() == 0); // however we use the buffer to get timing information diff --git a/examples/Plugins/AudioPluginDemo.h b/examples/Plugins/AudioPluginDemo.h index f4acc523..da12a3da 100644 --- a/examples/Plugins/AudioPluginDemo.h +++ b/examples/Plugins/AudioPluginDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2017, vs2019, linux_make, xcode_iphone, androidstudio + exporters: xcode_mac, vs2017, vs2022, linux_make, xcode_iphone, androidstudio moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -182,8 +182,8 @@ public: JuceDemoPluginAudioProcessor() : AudioProcessor (getBusesProperties()), state (*this, nullptr, "state", - { std::make_unique ("gain", "Gain", NormalisableRange (0.0f, 1.0f), 0.9f), - std::make_unique ("delay", "Delay Feedback", NormalisableRange (0.0f, 1.0f), 0.5f) }) + { std::make_unique (ParameterID { "gain", 1 }, "Gain", NormalisableRange (0.0f, 1.0f), 0.9f), + std::make_unique (ParameterID { "delay", 1 }, "Delay Feedback", NormalisableRange (0.0f, 1.0f), 0.5f) }) { // Add a sub-tree to store the state of our UI state.state.addChild ({ "uiState", { { "width", 400 }, { "height", 200 } }, {} }, -1, nullptr); @@ -321,12 +321,10 @@ public: class SpinLockedPosInfo { public: - SpinLockedPosInfo() { info.resetToDefault(); } - // Wait-free, but setting new info may fail if the main thread is currently // calling `get`. This is unlikely to matter in practice because // we'll be calling `set` much more frequently than `get`. - void set (const AudioPlayHead::CurrentPositionInfo& newInfo) + void set (const AudioPlayHead::PositionInfo& newInfo) { const juce::SpinLock::ScopedTryLockType lock (mutex); @@ -334,7 +332,7 @@ public: info = newInfo; } - AudioPlayHead::CurrentPositionInfo get() const noexcept + AudioPlayHead::PositionInfo get() const noexcept { const juce::SpinLock::ScopedLockType lock (mutex); return info; @@ -342,7 +340,7 @@ public: private: juce::SpinLock mutex; - AudioPlayHead::CurrentPositionInfo info; + AudioPlayHead::PositionInfo info; }; //============================================================================== @@ -510,13 +508,13 @@ private: } // quick-and-dirty function to format a bars/beats string - static String quarterNotePositionToBarsBeatsString (double quarterNotes, int numerator, int denominator) + static String quarterNotePositionToBarsBeatsString (double quarterNotes, AudioPlayHead::TimeSignature sig) { - if (numerator == 0 || denominator == 0) + if (sig.numerator == 0 || sig.denominator == 0) return "1|1|000"; - auto quarterNotesPerBar = (numerator * 4 / denominator); - auto beats = (fmod (quarterNotes, quarterNotesPerBar) / quarterNotesPerBar) * numerator; + auto quarterNotesPerBar = (sig.numerator * 4 / sig.denominator); + auto beats = (fmod (quarterNotes, quarterNotesPerBar) / quarterNotesPerBar) * sig.numerator; auto bar = ((int) quarterNotes) / quarterNotesPerBar + 1; auto beat = ((int) beats) + 1; @@ -526,21 +524,21 @@ private: } // Updates the text in our position label. - void updateTimecodeDisplay (AudioPlayHead::CurrentPositionInfo pos) + void updateTimecodeDisplay (const AudioPlayHead::PositionInfo& pos) { MemoryOutputStream displayText; + const auto sig = pos.getTimeSignature().orFallback (AudioPlayHead::TimeSignature{}); + displayText << "[" << SystemStats::getJUCEVersion() << "] " - << String (pos.bpm, 2) << " bpm, " - << pos.timeSigNumerator << '/' << pos.timeSigDenominator - << " - " << timeToTimecodeString (pos.timeInSeconds) - << " - " << quarterNotePositionToBarsBeatsString (pos.ppqPosition, - pos.timeSigNumerator, - pos.timeSigDenominator); - - if (pos.isRecording) + << String (pos.getBpm().orFallback (120.0), 2) << " bpm, " + << sig.numerator << '/' << sig.denominator + << " - " << timeToTimecodeString (pos.getTimeInSeconds().orFallback (0.0)) + << " - " << quarterNotePositionToBarsBeatsString (pos.getPpqPosition().orFallback (0.0), sig); + + if (pos.getIsRecording()) displayText << " (recording)"; - else if (pos.isPlaying) + else if (pos.getIsPlaying()) displayText << " (playing)"; timecodeDisplayLabel.setText (displayText.toString(), dontSendNotification); @@ -647,17 +645,11 @@ private: const auto newInfo = [&] { if (auto* ph = getPlayHead()) - { - AudioPlayHead::CurrentPositionInfo result; - - if (ph->getCurrentPosition (result)) - return result; - } + if (auto result = ph->getPosition()) + return *result; // If the host fails to provide the current time, we'll just use default values - AudioPlayHead::CurrentPositionInfo result; - result.resetToDefault(); - return result; + return AudioPlayHead::PositionInfo{}; }(); lastPosInfo.set (newInfo); diff --git a/examples/Plugins/CMakeLists.txt b/examples/Plugins/CMakeLists.txt index 272e8475..dc6880ef 100644 --- a/examples/Plugins/CMakeLists.txt +++ b/examples/Plugins/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/Plugins/DSPModulePluginDemo.h b/examples/Plugins/DSPModulePluginDemo.h index edfa5425..a1f20523 100644 --- a/examples/Plugins/DSPModulePluginDemo.h +++ b/examples/Plugins/DSPModulePluginDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -240,6 +240,7 @@ public: int getCurrentIRSize() const { return irSize; } using Parameter = AudioProcessorValueTreeState::Parameter; + using Attributes = AudioProcessorValueTreeStateParameterAttributes; // This struct holds references to the raw parameters, so that we don't have to search // the APVTS (involving string comparisons and map lookups!) every time a parameter @@ -261,45 +262,52 @@ public: template static Param& addToLayout (Group& layout, Ts&&... ts) { - auto param = std::make_unique (std::forward (ts)...); + auto param = new Param (std::forward (ts)...); auto& ref = *param; - add (layout, std::move (param)); + add (layout, rawToUniquePtr (param)); return ref; } - static String valueToTextFunction (float x) { return String (x, 2); } + static String valueToTextFunction (float x, int) { return String (x, 2); } static float textToValueFunction (const String& str) { return str.getFloatValue(); } - static String valueToTextPanFunction (float x) { return getPanningTextForValue ((x + 100.0f) / 200.0f); } + static auto getBasicAttributes() + { + return Attributes().withStringFromValueFunction (valueToTextFunction) + .withValueFromStringFunction (textToValueFunction); + } + + static auto getDbAttributes() { return getBasicAttributes().withLabel ("dB"); } + static auto getMsAttributes() { return getBasicAttributes().withLabel ("ms"); } + static auto getHzAttributes() { return getBasicAttributes().withLabel ("Hz"); } + static auto getPercentageAttributes() { return getBasicAttributes().withLabel ("%"); } + static auto getRatioAttributes() { return getBasicAttributes().withLabel (":1"); } + + static String valueToTextPanFunction (float x, int) { return getPanningTextForValue ((x + 100.0f) / 200.0f); } static float textToValuePanFunction (const String& str) { return getPanningValueForText (str) * 200.0f - 100.0f; } struct MainGroup { explicit MainGroup (AudioProcessorParameterGroup& layout) : inputGain (addToLayout (layout, - ID::inputGain, + ParameterID { ID::inputGain, 1 }, "Input", - "dB", NormalisableRange (-40.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), outputGain (addToLayout (layout, - ID::outputGain, + ParameterID { ID::outputGain, 1 }, "Output", - "dB", NormalisableRange (-40.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), pan (addToLayout (layout, - ID::pan, + ParameterID { ID::pan, 1 }, "Panning", - "", NormalisableRange (-100.0f, 100.0f), 0.0f, - valueToTextPanFunction, - textToValuePanFunction)) {} + Attributes().withStringFromValueFunction (valueToTextPanFunction) + .withValueFromStringFunction (textToValuePanFunction))) {} Parameter& inputGain; Parameter& outputGain; @@ -310,57 +318,46 @@ public: { explicit DistortionGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::distortionEnabled, + ParameterID { ID::distortionEnabled, 1 }, "Distortion", - true, - "")), + true)), type (addToLayout (layout, - ID::distortionType, + ParameterID { ID::distortionType, 1 }, "Waveshaper", StringArray { "std::tanh", "Approx. tanh" }, 0)), inGain (addToLayout (layout, - ID::distortionInGain, + ParameterID { ID::distortionInGain, 1 }, "Gain", - "dB", NormalisableRange (-40.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), lowpass (addToLayout (layout, - ID::distortionLowpass, + ParameterID { ID::distortionLowpass, 1 }, "Post Low-pass", - "Hz", NormalisableRange (20.0f, 22000.0f, 0.0f, 0.25f), 22000.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), highpass (addToLayout (layout, - ID::distortionHighpass, + ParameterID { ID::distortionHighpass, 1 }, "Pre High-pass", - "Hz", NormalisableRange (20.0f, 22000.0f, 0.0f, 0.25f), 20.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), compGain (addToLayout (layout, - ID::distortionCompGain, + ParameterID { ID::distortionCompGain, 1 }, "Compensat.", - "dB", NormalisableRange (-40.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), mix (addToLayout (layout, - ID::distortionMix, + ParameterID { ID::distortionMix, 1 }, "Mix", - "%", NormalisableRange (0.0f, 100.0f), 100.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), oversampler (addToLayout (layout, - ID::distortionOversampler, + ParameterID { ID::distortionOversampler, 1 }, "Oversampling", StringArray { "2X", "4X", @@ -384,34 +381,27 @@ public: { explicit MultiBandGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::multiBandEnabled, + ParameterID { ID::multiBandEnabled, 1 }, "Multi-band", - false, - "")), + false)), freq (addToLayout (layout, - ID::multiBandFreq, + ParameterID { ID::multiBandFreq, 1 }, "Sep. Freq.", - "Hz", NormalisableRange (20.0f, 22000.0f, 0.0f, 0.25f), 2000.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), lowVolume (addToLayout (layout, - ID::multiBandLowVolume, + ParameterID { ID::multiBandLowVolume, 1 }, "Low volume", - "dB", NormalisableRange (-40.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), highVolume (addToLayout (layout, - ID::multiBandHighVolume, + ParameterID { ID::multiBandHighVolume, 1 }, "High volume", - "dB", NormalisableRange (-40.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)) {} + getDbAttributes())) {} AudioParameterBool& enabled; Parameter& freq; @@ -423,23 +413,19 @@ public: { explicit ConvolutionGroup (AudioProcessorParameterGroup& layout) : cabEnabled (addToLayout (layout, - ID::convolutionCabEnabled, + ParameterID { ID::convolutionCabEnabled, 1 }, "Cabinet", - false, - "")), + false)), reverbEnabled (addToLayout (layout, - ID::convolutionReverbEnabled, + ParameterID { ID::convolutionReverbEnabled, 1 }, "Reverb", - false, - "")), + false)), reverbMix (addToLayout (layout, - ID::convolutionReverbMix, + ParameterID { ID::convolutionReverbMix, 1 }, "Reverb Mix", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)) {} + getPercentageAttributes())) {} AudioParameterBool& cabEnabled; AudioParameterBool& reverbEnabled; @@ -450,42 +436,33 @@ public: { explicit CompressorGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::compressorEnabled, + ParameterID { ID::compressorEnabled, 1 }, "Comp.", - false, - "")), + false)), threshold (addToLayout (layout, - ID::compressorThreshold, + ParameterID { ID::compressorThreshold, 1 }, "Threshold", - "dB", NormalisableRange (-100.0f, 0.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), ratio (addToLayout (layout, - ID::compressorRatio, + ParameterID { ID::compressorRatio, 1 }, "Ratio", - ":1", NormalisableRange (1.0f, 100.0f, 0.0f, 0.25f), 1.0f, - valueToTextFunction, - textToValueFunction)), + getRatioAttributes())), attack (addToLayout (layout, - ID::compressorAttack, + ParameterID { ID::compressorAttack, 1 }, "Attack", - "ms", NormalisableRange (0.01f, 1000.0f, 0.0f, 0.25f), 1.0f, - valueToTextFunction, - textToValueFunction)), + getMsAttributes())), release (addToLayout (layout, - ID::compressorRelease, + ParameterID { ID::compressorRelease, 1 }, "Release", - "ms", NormalisableRange (10.0f, 10000.0f, 0.0f, 0.25f), 100.0f, - valueToTextFunction, - textToValueFunction)) {} + getMsAttributes())) {} AudioParameterBool& enabled; Parameter& threshold; @@ -498,42 +475,33 @@ public: { explicit NoiseGateGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::noiseGateEnabled, + ParameterID { ID::noiseGateEnabled, 1 }, "Gate", - false, - "")), + false)), threshold (addToLayout (layout, - ID::noiseGateThreshold, + ParameterID { ID::noiseGateThreshold, 1 }, "Threshold", - "dB", NormalisableRange (-100.0f, 0.0f), -100.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), ratio (addToLayout (layout, - ID::noiseGateRatio, + ParameterID { ID::noiseGateRatio, 1 }, "Ratio", - ":1", NormalisableRange (1.0f, 100.0f, 0.0f, 0.25f), 10.0f, - valueToTextFunction, - textToValueFunction)), + getRatioAttributes())), attack (addToLayout (layout, - ID::noiseGateAttack, + ParameterID { ID::noiseGateAttack, 1 }, "Attack", - "ms", NormalisableRange (0.01f, 1000.0f, 0.0f, 0.25f), 1.0f, - valueToTextFunction, - textToValueFunction)), + getMsAttributes())), release (addToLayout (layout, - ID::noiseGateRelease, + ParameterID { ID::noiseGateRelease, 1 }, "Release", - "ms", NormalisableRange (10.0f, 10000.0f, 0.0f, 0.25f), 100.0f, - valueToTextFunction, - textToValueFunction)) {} + getMsAttributes())) {} AudioParameterBool& enabled; Parameter& threshold; @@ -546,26 +514,21 @@ public: { explicit LimiterGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::limiterEnabled, + ParameterID { ID::limiterEnabled, 1 }, "Limiter", - false, - "")), + false)), threshold (addToLayout (layout, - ID::limiterThreshold, + ParameterID { ID::limiterThreshold, 1 }, "Threshold", - "dB", NormalisableRange (-40.0f, 0.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getDbAttributes())), release (addToLayout (layout, - ID::limiterRelease, + ParameterID { ID::limiterRelease, 1 }, "Release", - "ms", NormalisableRange (10.0f, 10000.0f, 0.0f, 0.25f), 100.0f, - valueToTextFunction, - textToValueFunction)) {} + getMsAttributes())) {} AudioParameterBool& enabled; Parameter& threshold; @@ -576,39 +539,32 @@ public: { explicit DirectDelayGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::directDelayEnabled, + ParameterID { ID::directDelayEnabled, 1 }, "DL Dir.", - false, - "")), + false)), type (addToLayout (layout, - ID::directDelayType, + ParameterID { ID::directDelayType, 1 }, "DL Type", StringArray { "None", "Linear", "Lagrange", "Thiran" }, 1)), value (addToLayout (layout, - ID::directDelayValue, + ParameterID { ID::directDelayValue, 1 }, "Delay", - "smps", NormalisableRange (0.0f, 44100.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getBasicAttributes().withLabel ("smps"))), smoothing (addToLayout (layout, - ID::directDelaySmoothing, + ParameterID { ID::directDelaySmoothing, 1 }, "Smooth", - "ms", NormalisableRange (20.0f, 10000.0f, 0.0f, 0.25f), 200.0f, - valueToTextFunction, - textToValueFunction)), + getMsAttributes())), mix (addToLayout (layout, - ID::directDelayMix, + ParameterID { ID::directDelayMix, 1 }, "Delay Mix", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)) {} + getPercentageAttributes())) {} AudioParameterBool& enabled; AudioParameterChoice& type; @@ -621,55 +577,44 @@ public: { explicit DelayEffectGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::delayEffectEnabled, + ParameterID { ID::delayEffectEnabled, 1 }, "DL Effect", - false, - "")), + false)), type (addToLayout (layout, - ID::delayEffectType, + ParameterID { ID::delayEffectType, 1 }, "DL Type", StringArray { "None", "Linear", "Lagrange", "Thiran" }, 1)), value (addToLayout (layout, - ID::delayEffectValue, + ParameterID { ID::delayEffectValue, 1 }, "Delay", - "ms", NormalisableRange (0.01f, 1000.0f), 100.0f, - valueToTextFunction, - textToValueFunction)), + getMsAttributes())), smoothing (addToLayout (layout, - ID::delayEffectSmoothing, + ParameterID { ID::delayEffectSmoothing, 1 }, "Smooth", - "ms", NormalisableRange (20.0f, 10000.0f, 0.0f, 0.25f), 400.0f, - valueToTextFunction, - textToValueFunction)), + getMsAttributes())), lowpass (addToLayout (layout, - ID::delayEffectLowpass, + ParameterID { ID::delayEffectLowpass, 1 }, "Low-pass", - "Hz", NormalisableRange (20.0f, 22000.0f, 0.0f, 0.25f), 22000.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), mix (addToLayout (layout, - ID::delayEffectMix, + ParameterID { ID::delayEffectMix, 1 }, "Delay Mix", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), feedback (addToLayout (layout, - ID::delayEffectFeedback, + ParameterID { ID::delayEffectFeedback, 1 }, "Feedback", - "dB", NormalisableRange (-100.0f, 0.0f), -100.0f, - valueToTextFunction, - textToValueFunction)) {} + getDbAttributes())) {} AudioParameterBool& enabled; AudioParameterChoice& type; @@ -684,50 +629,39 @@ public: { explicit PhaserGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::phaserEnabled, + ParameterID { ID::phaserEnabled, 1 }, "Phaser", - false, - "")), + false)), rate (addToLayout (layout, - ID::phaserRate, + ParameterID { ID::phaserRate, 1 }, "Rate", - "Hz", NormalisableRange (0.05f, 20.0f, 0.0f, 0.25f), 1.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), depth (addToLayout (layout, - ID::phaserDepth, + ParameterID { ID::phaserDepth, 1 }, "Depth", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), centreFrequency (addToLayout (layout, - ID::phaserCentreFrequency, + ParameterID { ID::phaserCentreFrequency, 1 }, "Center", - "Hz", NormalisableRange (20.0f, 20000.0f, 0.0f, 0.25f), 600.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), feedback (addToLayout (layout, - ID::phaserFeedback, + ParameterID { ID::phaserFeedback, 1 }, "Feedback", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), mix (addToLayout (layout, - ID::phaserMix, + ParameterID { ID::phaserMix, 1 }, "Mix", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)) {} + getPercentageAttributes())) {} AudioParameterBool& enabled; Parameter& rate; @@ -741,50 +675,39 @@ public: { explicit ChorusGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::chorusEnabled, + ParameterID { ID::chorusEnabled, 1 }, "Chorus", - false, - "")), + false)), rate (addToLayout (layout, - ID::chorusRate, + ParameterID { ID::chorusRate, 1 }, "Rate", - "Hz", NormalisableRange (0.05f, 20.0f, 0.0f, 0.25f), 1.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), depth (addToLayout (layout, - ID::chorusDepth, + ParameterID { ID::chorusDepth, 1 }, "Depth", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), centreDelay (addToLayout (layout, - ID::chorusCentreDelay, + ParameterID { ID::chorusCentreDelay, 1 }, "Center", - "ms", NormalisableRange (1.0f, 100.0f, 0.0f, 0.25f), 7.0f, - valueToTextFunction, - textToValueFunction)), + getMsAttributes())), feedback (addToLayout (layout, - ID::chorusFeedback, + ParameterID { ID::chorusFeedback, 1 }, "Feedback", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), mix (addToLayout (layout, - ID::chorusMix, + ParameterID { ID::chorusMix, 1 }, "Mix", - "%", NormalisableRange (0.0f, 100.0f), 50.0f, - valueToTextFunction, - textToValueFunction)) {} + getPercentageAttributes())) {} AudioParameterBool& enabled; Parameter& rate; @@ -798,39 +721,32 @@ public: { explicit LadderGroup (AudioProcessorParameterGroup& layout) : enabled (addToLayout (layout, - ID::ladderEnabled, + ParameterID { ID::ladderEnabled, 1 }, "Ladder", - false, - "")), + false)), mode (addToLayout (layout, - ID::ladderMode, + ParameterID { ID::ladderMode, 1 }, "Mode", StringArray { "LP12", "LP24", "HP12", "HP24", "BP12", "BP24" }, 1)), cutoff (addToLayout (layout, - ID::ladderCutoff, + ParameterID { ID::ladderCutoff, 1 }, "Frequency", - "Hz", NormalisableRange (10.0f, 22000.0f, 0.0f, 0.25f), 1000.0f, - valueToTextFunction, - textToValueFunction)), + getHzAttributes())), resonance (addToLayout (layout, - ID::ladderResonance, + ParameterID { ID::ladderResonance, 1 }, "Resonance", - "%", NormalisableRange (0.0f, 100.0f), 0.0f, - valueToTextFunction, - textToValueFunction)), + getPercentageAttributes())), drive (addToLayout (layout, - ID::ladderDrive, + ParameterID { ID::ladderDrive, 1 }, "Drive", - "dB", NormalisableRange (0.0f, 40.0f), 0.0f, - valueToTextFunction, - textToValueFunction)) {} + getDbAttributes())) {} AudioParameterBool& enabled; AudioParameterChoice& mode; diff --git a/examples/Plugins/GainPluginDemo.h b/examples/Plugins/GainPluginDemo.h index ac8348e8..162ba036 100644 --- a/examples/Plugins/GainPluginDemo.h +++ b/examples/Plugins/GainPluginDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019 + exporters: xcode_mac, vs2022 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -59,7 +59,7 @@ public: : AudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::stereo()) .withOutput ("Output", AudioChannelSet::stereo())) { - addParameter (gain = new AudioParameterFloat ("gain", "Gain", 0.0f, 1.0f, 0.5f)); + addParameter (gain = new AudioParameterFloat ({ "gain", 1 }, "Gain", 0.0f, 1.0f, 0.5f)); } //============================================================================== diff --git a/examples/Plugins/HostPluginDemo.h b/examples/Plugins/HostPluginDemo.h new file mode 100644 index 00000000..589e9a0f --- /dev/null +++ b/examples/Plugins/HostPluginDemo.h @@ -0,0 +1,588 @@ +/* + ============================================================================== + + This file is part of the JUCE examples. + Copyright (c) 2022 - Raw Material Software Limited + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, + WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR + PURPOSE, ARE DISCLAIMED. + + ============================================================================== +*/ + +/******************************************************************************* + The block below describes the properties of this PIP. A PIP is a short snippet + of code that can be read by the Projucer and used to generate a JUCE project. + + BEGIN_JUCE_PIP_METADATA + + name: HostPluginDemo + version: 1.0.0 + vendor: JUCE + website: http://juce.com + description: Plugin that can host other plugins + + dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, + juce_audio_plugin_client, juce_audio_processors, + juce_audio_utils, juce_core, juce_data_structures, + juce_events, juce_graphics, juce_gui_basics, juce_gui_extra + exporters: xcode_mac, vs2022, linux_make + + moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 + JUCE_PLUGINHOST_LV2=1 + JUCE_PLUGINHOST_VST3=1 + JUCE_PLUGINHOST_VST=0 + JUCE_PLUGINHOST_AU=1 + + type: AudioProcessor + mainClass: HostAudioProcessor + + useLocalCopy: 1 + + pluginCharacteristics: pluginIsSynth, pluginWantsMidiIn, pluginProducesMidiOut, + pluginEditorRequiresKeys + + END_JUCE_PIP_METADATA + +*******************************************************************************/ + +#pragma once + +//============================================================================== +enum class EditorStyle { thisWindow, newWindow }; + +class HostAudioProcessorImpl : public AudioProcessor, + private ChangeListener +{ +public: + HostAudioProcessorImpl() + : AudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::stereo(), true) + .withOutput ("Output", AudioChannelSet::stereo(), true)) + { + appProperties.setStorageParameters ([&] + { + PropertiesFile::Options opt; + opt.applicationName = getName(); + opt.commonToAllUsers = false; + opt.doNotSave = false; + opt.filenameSuffix = ".props"; + opt.ignoreCaseOfKeyNames = false; + opt.storageFormat = PropertiesFile::StorageFormat::storeAsXML; + opt.osxLibrarySubFolder = "Application Support"; + return opt; + }()); + + pluginFormatManager.addDefaultFormats(); + + if (auto savedPluginList = appProperties.getUserSettings()->getXmlValue ("pluginList")) + pluginList.recreateFromXml (*savedPluginList); + + MessageManagerLock lock; + pluginList.addChangeListener (this); + } + + bool isBusesLayoutSupported (const BusesLayout& layouts) const override + { + const auto& mainOutput = layouts.getMainOutputChannelSet(); + const auto& mainInput = layouts.getMainInputChannelSet(); + + if (! mainInput.isDisabled() && mainInput != mainOutput) + return false; + + if (mainOutput.size() > 2) + return false; + + return true; + } + + void prepareToPlay (double sr, int bs) override + { + const ScopedLock sl (innerMutex); + + active = true; + + if (inner != nullptr) + { + inner->setRateAndBufferSizeDetails (sr, bs); + inner->prepareToPlay (sr, bs); + } + } + + void releaseResources() override + { + const ScopedLock sl (innerMutex); + + active = false; + + if (inner != nullptr) + inner->releaseResources(); + } + + void reset() override + { + const ScopedLock sl (innerMutex); + + if (inner != nullptr) + inner->reset(); + } + + // In this example, we don't actually pass any audio through the inner processor. + // In a 'real' plugin, we'd need to add some synchronisation to ensure that the inner + // plugin instance was never modified (deleted, replaced etc.) during a call to processBlock. + void processBlock (AudioBuffer&, MidiBuffer&) override + { + jassert (! isUsingDoublePrecision()); + } + + void processBlock (AudioBuffer&, MidiBuffer&) override + { + jassert (isUsingDoublePrecision()); + } + + bool hasEditor() const override { return false; } + AudioProcessorEditor* createEditor() override { return nullptr; } + + const String getName() const override { return "HostPluginDemo"; } + bool acceptsMidi() const override { return true; } + bool producesMidi() const override { return true; } + double getTailLengthSeconds() const override { return 0.0; } + + int getNumPrograms() override { return 0; } + int getCurrentProgram() override { return 0; } + void setCurrentProgram (int) override {} + const String getProgramName (int) override { return "None"; } + void changeProgramName (int, const String&) override {} + + void getStateInformation (MemoryBlock& destData) override + { + const ScopedLock sl (innerMutex); + + XmlElement xml ("state"); + + if (inner != nullptr) + { + xml.setAttribute (editorStyleTag, (int) editorStyle); + xml.addChildElement (inner->getPluginDescription().createXml().release()); + xml.addChildElement ([this] + { + MemoryBlock innerState; + inner->getStateInformation (innerState); + + auto stateNode = std::make_unique (innerStateTag); + stateNode->addTextElement (innerState.toBase64Encoding()); + return stateNode.release(); + }()); + } + + const auto text = xml.toString(); + destData.replaceAll (text.toRawUTF8(), text.getNumBytesAsUTF8()); + } + + void setStateInformation (const void* data, int sizeInBytes) override + { + const ScopedLock sl (innerMutex); + + auto xml = XmlDocument::parse (String (CharPointer_UTF8 (static_cast (data)), (size_t) sizeInBytes)); + + if (auto* pluginNode = xml->getChildByName ("PLUGIN")) + { + PluginDescription pd; + pd.loadFromXml (*pluginNode); + + MemoryBlock innerState; + innerState.fromBase64Encoding (xml->getChildElementAllSubText (innerStateTag, {})); + + setNewPlugin (pd, + (EditorStyle) xml->getIntAttribute (editorStyleTag, 0), + innerState); + } + } + + void setNewPlugin (const PluginDescription& pd, EditorStyle where, const MemoryBlock& mb = {}) + { + const ScopedLock sl (innerMutex); + + const auto callback = [this, where, mb] (std::unique_ptr instance, const String& error) + { + if (error.isNotEmpty()) + { + NativeMessageBox::showMessageBoxAsync (MessageBoxIconType::WarningIcon, + "Plugin Load Failed", + error, + nullptr, + nullptr); + return; + } + + inner = std::move (instance); + editorStyle = where; + + if (inner != nullptr && ! mb.isEmpty()) + inner->setStateInformation (mb.getData(), (int) mb.getSize()); + + // In a 'real' plugin, we'd also need to set the bus configuration of the inner plugin. + // One possibility would be to match the bus configuration of the wrapper plugin, but + // the inner plugin isn't guaranteed to support the same layout. Alternatively, we + // could try to apply a reasonably similar layout, and maintain a mapping between the + // inner/outer channel layouts. + // + // In any case, it is essential that the inner plugin is told about the bus + // configuration that will be used. The AudioBuffer passed to the inner plugin must also + // exactly match this layout. + + if (active) + { + inner->setRateAndBufferSizeDetails (getSampleRate(), getBlockSize()); + inner->prepareToPlay (getSampleRate(), getBlockSize()); + } + + NullCheckedInvocation::invoke (pluginChanged); + }; + + pluginFormatManager.createPluginInstanceAsync (pd, getSampleRate(), getBlockSize(), callback); + } + + void clearPlugin() + { + const ScopedLock sl (innerMutex); + + inner = nullptr; + NullCheckedInvocation::invoke (pluginChanged); + } + + bool isPluginLoaded() const + { + const ScopedLock sl (innerMutex); + return inner != nullptr; + } + + std::unique_ptr createInnerEditor() const + { + const ScopedLock sl (innerMutex); + return rawToUniquePtr (inner->hasEditor() ? inner->createEditorIfNeeded() : nullptr); + } + + EditorStyle getEditorStyle() const noexcept { return editorStyle; } + + ApplicationProperties appProperties; + AudioPluginFormatManager pluginFormatManager; + KnownPluginList pluginList; + std::function pluginChanged; + +private: + CriticalSection innerMutex; + std::unique_ptr inner; + EditorStyle editorStyle = EditorStyle{}; + bool active = false; + + static constexpr const char* innerStateTag = "inner_state"; + static constexpr const char* editorStyleTag = "editor_style"; + + void changeListenerCallback (ChangeBroadcaster* source) override + { + if (source != &pluginList) + return; + + if (auto savedPluginList = pluginList.createXml()) + { + appProperties.getUserSettings()->setValue ("pluginList", savedPluginList.get()); + appProperties.saveIfNeeded(); + } + } +}; + + +constexpr const char* HostAudioProcessorImpl::innerStateTag; +constexpr const char* HostAudioProcessorImpl::editorStyleTag; + +//============================================================================== +constexpr auto margin = 10; + +static void doLayout (Component* main, Component& bottom, int bottomHeight, Rectangle bounds) +{ + Grid grid; + grid.setGap (Grid::Px { margin }); + grid.templateColumns = { Grid::TrackInfo { Grid::Fr { 1 } } }; + grid.templateRows = { Grid::TrackInfo { Grid::Fr { 1 } }, + Grid::TrackInfo { Grid::Px { bottomHeight }} }; + grid.items = { GridItem { main }, GridItem { bottom }.withMargin ({ 0, margin, margin, margin }) }; + grid.performLayout (bounds); +} + +class PluginLoaderComponent : public Component +{ +public: + template + PluginLoaderComponent (AudioPluginFormatManager& manager, + KnownPluginList& list, + Callback&& callback) + : pluginListComponent (manager, list, {}, {}) + { + pluginListComponent.getTableListBox().setMultipleSelectionEnabled (false); + + addAndMakeVisible (pluginListComponent); + addAndMakeVisible (buttons); + + const auto getCallback = [this, &list, callback = std::forward (callback)] (EditorStyle style) + { + return [this, &list, callback, style] + { + const auto index = pluginListComponent.getTableListBox().getSelectedRow(); + const auto& types = list.getTypes(); + + if (isPositiveAndBelow (index, types.size())) + NullCheckedInvocation::invoke (callback, types.getReference (index), style); + }; + }; + + buttons.thisWindowButton.onClick = getCallback (EditorStyle::thisWindow); + buttons.newWindowButton .onClick = getCallback (EditorStyle::newWindow); + } + + void resized() override + { + doLayout (&pluginListComponent, buttons, 80, getLocalBounds()); + } + +private: + struct Buttons : public Component + { + Buttons() + { + label.setJustificationType (Justification::centred); + + addAndMakeVisible (label); + addAndMakeVisible (thisWindowButton); + addAndMakeVisible (newWindowButton); + } + + void resized() override + { + Grid vertical; + vertical.autoFlow = Grid::AutoFlow::row; + vertical.setGap (Grid::Px { margin }); + vertical.autoRows = vertical.autoColumns = Grid::TrackInfo { Grid::Fr { 1 } }; + vertical.items.insertMultiple (0, GridItem{}, 2); + vertical.performLayout (getLocalBounds()); + + label.setBounds (vertical.items[0].currentBounds.toNearestInt()); + + Grid grid; + grid.autoFlow = Grid::AutoFlow::column; + grid.setGap (Grid::Px { margin }); + grid.autoRows = grid.autoColumns = Grid::TrackInfo { Grid::Fr { 1 } }; + grid.items = { GridItem { thisWindowButton }, + GridItem { newWindowButton } }; + + grid.performLayout (vertical.items[1].currentBounds.toNearestInt()); + } + + Label label { "", "Select a plugin from the list, then display it using the buttons below." }; + TextButton thisWindowButton { "Open In This Window" }; + TextButton newWindowButton { "Open In New Window" }; + }; + + PluginListComponent pluginListComponent; + Buttons buttons; +}; + +//============================================================================== +class PluginEditorComponent : public Component +{ +public: + template + PluginEditorComponent (std::unique_ptr editorIn, Callback&& onClose) + : editor (std::move (editorIn)) + { + addAndMakeVisible (editor.get()); + addAndMakeVisible (closeButton); + + childBoundsChanged (editor.get()); + + closeButton.onClick = std::forward (onClose); + } + + void setScaleFactor (float scale) + { + if (editor != nullptr) + editor->setScaleFactor (scale); + } + + void resized() override + { + doLayout (editor.get(), closeButton, buttonHeight, getLocalBounds()); + } + + void childBoundsChanged (Component* child) override + { + if (child != editor.get()) + return; + + const auto size = editor != nullptr ? editor->getLocalBounds() + : Rectangle(); + + setSize (size.getWidth(), margin + buttonHeight + size.getHeight()); + } + +private: + static constexpr auto buttonHeight = 40; + + std::unique_ptr editor; + TextButton closeButton { "Close Plugin" }; +}; + +//============================================================================== +class ScaledDocumentWindow : public DocumentWindow +{ +public: + ScaledDocumentWindow (Colour bg, float scale) + : DocumentWindow ("Editor", bg, 0), desktopScale (scale) {} + + float getDesktopScaleFactor() const override { return Desktop::getInstance().getGlobalScaleFactor() * desktopScale; } + +private: + float desktopScale = 1.0f; +}; + +//============================================================================== +class HostAudioProcessorEditor : public AudioProcessorEditor +{ +public: + explicit HostAudioProcessorEditor (HostAudioProcessorImpl& owner) + : AudioProcessorEditor (owner), + hostProcessor (owner), + loader (owner.pluginFormatManager, + owner.pluginList, + [&owner] (const PluginDescription& pd, + EditorStyle editorStyle) + { + owner.setNewPlugin (pd, editorStyle); + }), + scopedCallback (owner.pluginChanged, [this] { pluginChanged(); }) + { + setSize (500, 500); + setResizable (false, false); + addAndMakeVisible (closeButton); + addAndMakeVisible (loader); + + hostProcessor.pluginChanged(); + + closeButton.onClick = [this] { clearPlugin(); }; + } + + void paint (Graphics& g) override + { + g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId).darker()); + } + + void resized() override + { + closeButton.setBounds (getLocalBounds().withSizeKeepingCentre (200, buttonHeight)); + loader.setBounds (getLocalBounds()); + } + + void childBoundsChanged (Component* child) override + { + if (child != editor.get()) + return; + + const auto size = editor != nullptr ? editor->getLocalBounds() + : Rectangle(); + + setSize (size.getWidth(), size.getHeight()); + } + + void setScaleFactor (float scale) override + { + currentScaleFactor = scale; + AudioProcessorEditor::setScaleFactor (scale); + + const auto posted = MessageManager::callAsync ([ref = SafePointer (this), scale] + { + if (auto* r = ref.getComponent()) + if (auto* e = r->currentEditorComponent) + e->setScaleFactor (scale); + }); + + jassertquiet (posted); + } + +private: + void pluginChanged() + { + loader.setVisible (! hostProcessor.isPluginLoaded()); + closeButton.setVisible (hostProcessor.isPluginLoaded()); + + if (hostProcessor.isPluginLoaded()) + { + auto editorComponent = std::make_unique (hostProcessor.createInnerEditor(), [this] + { + const auto posted = MessageManager::callAsync ([this] { clearPlugin(); }); + jassertquiet (posted); + }); + + editorComponent->setScaleFactor (currentScaleFactor); + currentEditorComponent = editorComponent.get(); + + editor = [&]() -> std::unique_ptr + { + switch (hostProcessor.getEditorStyle()) + { + case EditorStyle::thisWindow: + addAndMakeVisible (editorComponent.get()); + setSize (editorComponent->getWidth(), editorComponent->getHeight()); + return std::move (editorComponent); + + case EditorStyle::newWindow: + const auto bg = getLookAndFeel().findColour (ResizableWindow::backgroundColourId).darker(); + auto window = std::make_unique (bg, currentScaleFactor); + window->setAlwaysOnTop (true); + window->setContentOwned (editorComponent.release(), true); + window->centreAroundComponent (this, window->getWidth(), window->getHeight()); + window->setVisible (true); + return window; + } + + jassertfalse; + return nullptr; + }(); + } + else + { + editor = nullptr; + setSize (500, 500); + } + } + + void clearPlugin() + { + currentEditorComponent = nullptr; + editor = nullptr; + hostProcessor.clearPlugin(); + } + + static constexpr auto buttonHeight = 30; + + HostAudioProcessorImpl& hostProcessor; + PluginLoaderComponent loader; + std::unique_ptr editor; + PluginEditorComponent* currentEditorComponent = nullptr; + ScopedValueSetter> scopedCallback; + TextButton closeButton { "Close Plugin" }; + float currentScaleFactor = 1.0f; +}; + +//============================================================================== +class HostAudioProcessor : public HostAudioProcessorImpl +{ +public: + bool hasEditor() const override { return true; } + AudioProcessorEditor* createEditor() override { return new HostAudioProcessorEditor (*this); } +}; diff --git a/examples/Plugins/InterAppAudioEffectPluginDemo.h b/examples/Plugins/InterAppAudioEffectPluginDemo.h deleted file mode 100644 index 4435dcf8..00000000 --- a/examples/Plugins/InterAppAudioEffectPluginDemo.h +++ /dev/null @@ -1,529 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited - - The code included in this file is provided under the terms of the ISC license - http://www.isc.org/downloads/software-support-policy/isc-license. Permission - To use, copy, modify, and/or distribute this software for any purpose with or - without fee is hereby granted provided that the above copyright notice and - this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, - WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR - PURPOSE, ARE DISCLAIMED. - - ============================================================================== -*/ - -/******************************************************************************* - The block below describes the properties of this PIP. A PIP is a short snippet - of code that can be read by the Projucer and used to generate a JUCE project. - - BEGIN_JUCE_PIP_METADATA - - name: InterAppAudioEffectPlugin - version: 1.0.0 - vendor: JUCE - website: http://juce.com - description: Inter-app audio effect plugin. - - dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, - juce_audio_plugin_client, juce_audio_processors, - juce_audio_utils, juce_core, juce_data_structures, - juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_iphone - - moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 - - type: AudioProcessor - mainClass: IAAEffectProcessor - - useLocalCopy: 1 - - extraPluginFormats: IAA - - END_JUCE_PIP_METADATA - -*******************************************************************************/ - -#pragma once - -#include - -//============================================================================== -// A very simple decaying meter. -class SimpleMeter : public Component, - private Timer -{ -public: - SimpleMeter() - { - startTimerHz (30); - } - - //============================================================================== - void paint (Graphics& g) override - { - g.fillAll (Colours::transparentBlack); - - auto area = g.getClipBounds(); - g.setColour (getLookAndFeel().findColour (Slider::thumbColourId)); - g.fillRoundedRectangle (area.toFloat(), 6.0); - - auto unfilledHeight = area.getHeight() * (1.0 - level); - g.reduceClipRegion (area.getX(), area.getY(), - area.getWidth(), (int) unfilledHeight); - g.setColour (getLookAndFeel().findColour (Slider::trackColourId)); - g.fillRoundedRectangle (area.toFloat(), 6.0); - } - - //============================================================================== - // Called from the audio thread. - void update (float newLevel) - { - // We don't care if maxLevel gets set to zero (in timerCallback) between the - // load and the assignment. - maxLevel = jmax (maxLevel.load(), newLevel); - } - -private: - //============================================================================== - void timerCallback() override - { - auto callbackLevel = maxLevel.exchange (0.0); - - float decayFactor = 0.95f; - - if (callbackLevel > level) - level = callbackLevel; - else if (level > 0.001) - level *= decayFactor; - else - level = 0; - - repaint(); - } - - std::atomic maxLevel {0.0}; - float level = 0; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SimpleMeter) -}; - -//============================================================================== -// A simple Inter-App Audio plug-in with a gain control and some meters. -class IAAEffectProcessor : public AudioProcessor -{ -public: - IAAEffectProcessor() - : AudioProcessor (BusesProperties() - .withInput ("Input", AudioChannelSet::stereo(), true) - .withOutput ("Output", AudioChannelSet::stereo(), true)), - parameters (*this, nullptr, "InterAppAudioEffect", - { std::make_unique ("gain", "Gain", NormalisableRange (0.0f, 1.0f), 1.0f / 3.14f) }) - { - } - - //============================================================================== - void prepareToPlay (double, int) override - { - previousGain = *parameters.getRawParameterValue ("gain"); - } - - void releaseResources() override {} - - bool isBusesLayoutSupported (const BusesLayout& layouts) const override - { - if (layouts.getMainInputChannels() > 2) - return false; - - if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet()) - return false; - - return true; - } - - using AudioProcessor::processBlock; - - void processBlock (AudioBuffer& buffer, MidiBuffer&) override - { - float gain = *parameters.getRawParameterValue ("gain"); - - auto totalNumInputChannels = getTotalNumInputChannels(); - auto totalNumOutputChannels = getTotalNumOutputChannels(); - - auto numSamples = buffer.getNumSamples(); - - for (auto i = totalNumInputChannels; i < totalNumOutputChannels; ++i) - buffer.clear (i, 0, buffer.getNumSamples()); - - // Apply the gain to the samples using a ramp to avoid discontinuities in - // the audio between processed buffers. - for (auto channel = 0; channel < totalNumInputChannels; ++channel) - { - buffer.applyGainRamp (channel, 0, numSamples, previousGain, gain); - auto newLevel = buffer.getMagnitude (channel, 0, numSamples); - - meterListeners.call ([=] (MeterListener& l) { l.handleNewMeterValue (channel, newLevel); }); - } - - previousGain = gain; - - // Now ask the host for the current time so we can store it to be displayed later. - updateCurrentTimeInfoFromHost (lastPosInfo); - } - - //============================================================================== - AudioProcessorEditor* createEditor() override - { - return new IAAEffectEditor (*this, parameters); - } - - bool hasEditor() const override { return true; } - - //============================================================================== - const String getName() const override { return "InterAppAudioEffectPlugin"; } - bool acceptsMidi() const override { return false; } - bool producesMidi() const override { return false; } - double getTailLengthSeconds() const override { return 0.0; } - - //============================================================================== - int getNumPrograms() override { return 1; } - int getCurrentProgram() override { return 0; } - void setCurrentProgram (int) override {} - const String getProgramName (int) override { return "None"; } - void changeProgramName (int, const String&) override {} - - //============================================================================== - void getStateInformation (MemoryBlock& destData) override - { - if (auto xml = parameters.state.createXml()) - copyXmlToBinary (*xml, destData); - } - - void setStateInformation (const void* data, int sizeInBytes) override - { - if (auto xmlState = getXmlFromBinary (data, sizeInBytes)) - if (xmlState->hasTagName (parameters.state.getType())) - parameters.state = ValueTree::fromXml (*xmlState); - } - - //============================================================================== - bool updateCurrentTimeInfoFromHost (AudioPlayHead::CurrentPositionInfo& posInfo) - { - if (auto* ph = getPlayHead()) - { - AudioPlayHead::CurrentPositionInfo newTime; - - if (ph->getCurrentPosition (newTime)) - { - posInfo = newTime; // Successfully got the current time from the host. - return true; - } - } - - // If the host fails to provide the current time, we'll just reset our copy to a default. - lastPosInfo.resetToDefault(); - - return false; - } - - // Allow an IAAAudioProcessorEditor to register as a listener to receive new - // meter values directly from the audio thread. - struct MeterListener - { - virtual ~MeterListener() {} - - virtual void handleNewMeterValue (int, float) = 0; - }; - - void addMeterListener (MeterListener& listener) { meterListeners.add (&listener); } - void removeMeterListener (MeterListener& listener) { meterListeners.remove (&listener); } - - -private: - //============================================================================== - class IAAEffectEditor : public AudioProcessorEditor, - private IAAEffectProcessor::MeterListener, - private Timer - { - public: - IAAEffectEditor (IAAEffectProcessor& p, - AudioProcessorValueTreeState& vts) - : AudioProcessorEditor (p), - iaaEffectProcessor (p), - parameters (vts) - { - // Register for meter value updates. - iaaEffectProcessor.addMeterListener (*this); - - gainSlider.setSliderStyle (Slider::SliderStyle::LinearVertical); - gainSlider.setTextBoxStyle (Slider::TextEntryBoxPosition::TextBoxAbove, false, 60, 20); - addAndMakeVisible (gainSlider); - - for (auto& meter : meters) - addAndMakeVisible (meter); - - // Configure all the graphics for the transport control. - - transportText.setFont (Font (Font::getDefaultMonospacedFontName(), 18.0f, Font::plain)); - transportText.setJustificationType (Justification::topLeft); - addChildComponent (transportText); - - Path rewindShape; - rewindShape.addRectangle (0.0, 0.0, 5.0, buttonSize); - rewindShape.addTriangle (0.0, buttonSize * 0.5f, buttonSize, 0.0, buttonSize, buttonSize); - rewindButton.setShape (rewindShape, true, true, false); - rewindButton.onClick = [this] - { - if (transportControllable()) - iaaEffectProcessor.getPlayHead()->transportRewind(); - }; - addChildComponent (rewindButton); - - Path playShape; - playShape.addTriangle (0.0, 0.0, 0.0, buttonSize, buttonSize, buttonSize / 2); - playButton.setShape (playShape, true, true, false); - playButton.onClick = [this] - { - if (transportControllable()) - iaaEffectProcessor.getPlayHead()->transportPlay (! lastPosInfo.isPlaying); - }; - addChildComponent (playButton); - - Path recordShape; - recordShape.addEllipse (0.0, 0.0, buttonSize, buttonSize); - recordButton.setShape (recordShape, true, true, false); - recordButton.onClick = [this] - { - if (transportControllable()) - iaaEffectProcessor.getPlayHead()->transportRecord (! lastPosInfo.isRecording); - }; - addChildComponent (recordButton); - - // Configure the switch to host button. - - switchToHostButtonLabel.setFont (Font (Font::getDefaultMonospacedFontName(), 18.0f, Font::plain)); - switchToHostButtonLabel.setJustificationType (Justification::centredRight); - switchToHostButtonLabel.setText ("Switch to\nhost app:", dontSendNotification); - addChildComponent (switchToHostButtonLabel); - - switchToHostButton.onClick = [this] - { - if (transportControllable()) - { - PluginHostType hostType; - hostType.switchToHostApplication(); - } - }; - addChildComponent (switchToHostButton); - - auto screenSize = Desktop::getInstance().getDisplays().getPrimaryDisplay()->userArea; - setSize (screenSize.getWidth(), screenSize.getHeight()); - - resized(); - - startTimerHz (60); - } - - ~IAAEffectEditor() override - { - iaaEffectProcessor.removeMeterListener (*this); - } - - //============================================================================== - void paint (Graphics& g) override - { - g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId)); - } - - void resized() override - { - auto area = getBounds().reduced (20); - - gainSlider.setBounds (area.removeFromLeft (60)); - - for (auto& meter : meters) - { - area.removeFromLeft (10); - meter.setBounds (area.removeFromLeft (20)); - } - - area.removeFromLeft (20); - transportText.setBounds (area.removeFromTop (120)); - - auto navigationArea = area.removeFromTop ((int) buttonSize); - rewindButton.setTopLeftPosition (navigationArea.getPosition()); - navigationArea.removeFromLeft ((int) buttonSize + 10); - playButton.setTopLeftPosition (navigationArea.getPosition()); - navigationArea.removeFromLeft ((int) buttonSize + 10); - recordButton.setTopLeftPosition (navigationArea.getPosition()); - - area.removeFromTop (30); - - auto appSwitchArea = area.removeFromTop ((int) buttonSize); - switchToHostButtonLabel.setBounds (appSwitchArea.removeFromLeft (100)); - appSwitchArea.removeFromLeft (5); - switchToHostButton.setBounds (appSwitchArea.removeFromLeft ((int) buttonSize)); - } - - private: - //============================================================================== - // Called from the audio thread. - void handleNewMeterValue (int channel, float value) override - { - meters[(size_t) channel].update (value); - } - - //============================================================================== - void timerCallback () override - { - auto timeInfoSuccess = iaaEffectProcessor.updateCurrentTimeInfoFromHost (lastPosInfo); - transportText.setVisible (timeInfoSuccess); - - if (timeInfoSuccess) - updateTransportTextDisplay(); - - updateTransportButtonsDisplay(); - - updateSwitchToHostDisplay(); - } - - //============================================================================== - bool transportControllable() - { - auto processorPlayHead = iaaEffectProcessor.getPlayHead(); - return processorPlayHead != nullptr && processorPlayHead->canControlTransport(); - } - - //============================================================================== - // quick-and-dirty function to format a timecode string - String timeToTimecodeString (double seconds) - { - auto millisecs = roundToInt (seconds * 1000.0); - auto absMillisecs = std::abs (millisecs); - - return String::formatted ("%02d:%02d:%02d.%03d", - millisecs / 360000, - (absMillisecs / 60000) % 60, - (absMillisecs / 1000) % 60, - absMillisecs % 1000); - } - - // A quick-and-dirty function to format a bars/beats string. - String quarterNotePositionToBarsBeatsString (double quarterNotes, int numerator, int denominator) - { - if (numerator == 0 || denominator == 0) - return "1|1|000"; - - auto quarterNotesPerBar = (numerator * 4 / denominator); - auto beats = (fmod (quarterNotes, quarterNotesPerBar) / quarterNotesPerBar) * numerator; - - auto bar = ((int) quarterNotes) / quarterNotesPerBar + 1; - auto beat = ((int) beats) + 1; - auto ticks = ((int) (fmod (beats, 1.0) * 960.0 + 0.5)); - - return String::formatted ("%d|%d|%03d", bar, beat, ticks); - } - - void updateTransportTextDisplay() - { - MemoryOutputStream displayText; - - displayText << "[" << SystemStats::getJUCEVersion() << "]\n" - << String (lastPosInfo.bpm, 2) << " bpm\n" - << lastPosInfo.timeSigNumerator << '/' << lastPosInfo.timeSigDenominator << "\n" - << timeToTimecodeString (lastPosInfo.timeInSeconds) << "\n" - << quarterNotePositionToBarsBeatsString (lastPosInfo.ppqPosition, - lastPosInfo.timeSigNumerator, - lastPosInfo.timeSigDenominator) << "\n"; - - if (lastPosInfo.isRecording) - displayText << "(recording)"; - else if (lastPosInfo.isPlaying) - displayText << "(playing)"; - - transportText.setText (displayText.toString(), dontSendNotification); - } - - void updateTransportButtonsDisplay() - { - auto visible = iaaEffectProcessor.getPlayHead() != nullptr - && iaaEffectProcessor.getPlayHead()->canControlTransport(); - - if (rewindButton.isVisible() != visible) - { - rewindButton.setVisible (visible); - playButton.setVisible (visible); - recordButton.setVisible (visible); - } - - if (visible) - { - auto playColour = lastPosInfo.isPlaying ? Colours::green : defaultButtonColour; - playButton.setColours (playColour, playColour, playColour); - playButton.repaint(); - - auto recordColour = lastPosInfo.isRecording ? Colours::red : defaultButtonColour; - recordButton.setColours (recordColour, recordColour, recordColour); - recordButton.repaint(); - } - } - - void updateSwitchToHostDisplay() - { - PluginHostType hostType; - auto visible = hostType.isInterAppAudioConnected(); - - if (switchToHostButtonLabel.isVisible() != visible) - { - switchToHostButtonLabel.setVisible (visible); - switchToHostButton.setVisible (visible); - - if (visible) - { - auto icon = hostType.getHostIcon ((int) buttonSize); - switchToHostButton.setImages(false, true, true, - icon, 1.0, Colours::transparentBlack, - icon, 1.0, Colours::transparentBlack, - icon, 1.0, Colours::transparentBlack); - } - } - } - - IAAEffectProcessor& iaaEffectProcessor; - AudioProcessorValueTreeState& parameters; - - const float buttonSize = 30.0f; - const Colour defaultButtonColour = Colours::darkgrey; - ShapeButton rewindButton {"Rewind", defaultButtonColour, defaultButtonColour, defaultButtonColour}; - ShapeButton playButton {"Play", defaultButtonColour, defaultButtonColour, defaultButtonColour}; - ShapeButton recordButton {"Record", defaultButtonColour, defaultButtonColour, defaultButtonColour}; - - Slider gainSlider; - AudioProcessorValueTreeState::SliderAttachment gainAttachment = { parameters, "gain", gainSlider }; - - std::array meters; - - ImageButton switchToHostButton; - Label transportText, switchToHostButtonLabel; - - AudioPlayHead::CurrentPositionInfo lastPosInfo; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IAAEffectEditor) - }; - - //============================================================================== - AudioProcessorValueTreeState parameters; - float previousGain = 0.0f; - - // This keeps a copy of the last set of timing info that was acquired during an - // audio callback - the UI component will display this. - AudioPlayHead::CurrentPositionInfo lastPosInfo; - - ListenerList meterListeners; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IAAEffectProcessor) -}; diff --git a/examples/Plugins/MidiLoggerPluginDemo.h b/examples/Plugins/MidiLoggerPluginDemo.h index 740f861d..7602d145 100644 --- a/examples/Plugins/MidiLoggerPluginDemo.h +++ b/examples/Plugins/MidiLoggerPluginDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Plugins/MultiOutSynthPluginDemo.h b/examples/Plugins/MultiOutSynthPluginDemo.h index a28a825e..cedc674d 100644 --- a/examples/Plugins/MultiOutSynthPluginDemo.h +++ b/examples/Plugins/MultiOutSynthPluginDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019 + exporters: xcode_mac, vs2022 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -123,6 +123,10 @@ public: auto midiChannelBuffer = filterMidiMessagesForChannel (midiBuffer, busNr + 1); auto audioBusBuffer = getBusBuffer (buffer, false, busNr); + // Voices add to the contents of the buffer. Make sure the buffer is clear before + // rendering, just in case the host left old data in the buffer. + audioBusBuffer.clear(); + synth [busNr]->renderNextBlock (audioBusBuffer, midiChannelBuffer, 0, audioBusBuffer.getNumSamples()); } } @@ -146,11 +150,14 @@ public: bool isBusesLayoutSupported (const BusesLayout& layout) const override { - for (const auto& bus : layout.outputBuses) - if (bus != AudioChannelSet::stereo()) - return false; - - return layout.inputBuses.isEmpty() && 1 <= layout.outputBuses.size(); + const auto& outputs = layout.outputBuses; + + return layout.inputBuses.isEmpty() + && 1 <= outputs.size() + && std::all_of (outputs.begin(), outputs.end(), [] (const auto& bus) + { + return bus == AudioChannelSet::stereo(); + }); } //============================================================================== diff --git a/examples/Plugins/NoiseGatePluginDemo.h b/examples/Plugins/NoiseGatePluginDemo.h index 06f3bdd2..14a95145 100644 --- a/examples/Plugins/NoiseGatePluginDemo.h +++ b/examples/Plugins/NoiseGatePluginDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019 + exporters: xcode_mac, vs2022 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -59,8 +59,8 @@ public: .withOutput ("Output", AudioChannelSet::stereo()) .withInput ("Sidechain", AudioChannelSet::stereo())) { - addParameter (threshold = new AudioParameterFloat ("threshold", "Threshold", 0.0f, 1.0f, 0.5f)); - addParameter (alpha = new AudioParameterFloat ("alpha", "Alpha", 0.0f, 1.0f, 0.8f)); + addParameter (threshold = new AudioParameterFloat ({ "threshold", 1 }, "Threshold", 0.0f, 1.0f, 0.5f)); + addParameter (alpha = new AudioParameterFloat ({ "alpha", 1 }, "Alpha", 0.0f, 1.0f, 0.8f)); } //============================================================================== diff --git a/examples/Plugins/ReaperEmbeddedViewPluginDemo.h b/examples/Plugins/ReaperEmbeddedViewPluginDemo.h index 2d5b2659..dbc5f718 100644 --- a/examples/Plugins/ReaperEmbeddedViewPluginDemo.h +++ b/examples/Plugins/ReaperEmbeddedViewPluginDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -34,7 +34,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -190,7 +190,7 @@ class ReaperEmbeddedViewDemo : public AudioProcessor, public: ReaperEmbeddedViewDemo() { - addParameter (gain = new AudioParameterFloat ("gain", "Gain", 0.0f, 1.0f, 0.5f)); + addParameter (gain = new AudioParameterFloat ({ "gain", 1 }, "Gain", 0.0f, 1.0f, 0.5f)); startTimerHz (60); } diff --git a/examples/Plugins/SamplerPluginDemo.h b/examples/Plugins/SamplerPluginDemo.h index b74b0106..2d2882ff 100644 --- a/examples/Plugins/SamplerPluginDemo.h +++ b/examples/Plugins/SamplerPluginDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019 + exporters: xcode_mac, vs2022 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -551,7 +551,14 @@ inline std::unique_ptr makeAudioFormatReader (AudioFormatMana class AudioFormatReaderFactory { public: + AudioFormatReaderFactory() = default; + AudioFormatReaderFactory (const AudioFormatReaderFactory&) = default; + AudioFormatReaderFactory (AudioFormatReaderFactory&&) = default; + AudioFormatReaderFactory& operator= (const AudioFormatReaderFactory&) = default; + AudioFormatReaderFactory& operator= (AudioFormatReaderFactory&&) = default; + virtual ~AudioFormatReaderFactory() noexcept = default; + virtual std::unique_ptr make (AudioFormatManager&) const = 0; virtual std::unique_ptr clone() const = 0; }; diff --git a/examples/Plugins/SurroundPluginDemo.h b/examples/Plugins/SurroundPluginDemo.h index fef0664d..90e08677 100644 --- a/examples/Plugins/SurroundPluginDemo.h +++ b/examples/Plugins/SurroundPluginDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -33,7 +33,7 @@ juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -50,288 +50,412 @@ //============================================================================== -class ChannelClickListener +class ProcessorWithLevels : public AudioProcessor, + private AsyncUpdater, + private Timer { public: - virtual ~ChannelClickListener() {} - virtual void channelButtonClicked (int channelIndex) = 0; - virtual bool isChannelActive (int channelIndex) = 0; -}; - -class SurroundEditor : public AudioProcessorEditor, - private Timer -{ -public: - SurroundEditor (AudioProcessor& parent) - : AudioProcessorEditor (parent), - currentChannelLayout (AudioChannelSet::disabled()), - layoutTitle ("LayoutTitleLabel", getLayoutName()) + ProcessorWithLevels() + : AudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::stereo()) + .withInput ("Aux", AudioChannelSet::stereo(), false) + .withOutput ("Output", AudioChannelSet::stereo()) + .withOutput ("Aux", AudioChannelSet::stereo(), false)) { - layoutTitle.setJustificationType (Justification::centred); - addAndMakeVisible (layoutTitle); - addAndMakeVisible (noChannelsLabel); - - setSize (600, 100); - - lastSuspended = ! getAudioProcessor()->isSuspended(); - timerCallback(); - startTimer (500); + startTimerHz (60); + applyBusLayouts (getBusesLayout()); } - void resized() override + ~ProcessorWithLevels() override { - auto r = getLocalBounds(); + stopTimer(); + cancelPendingUpdate(); + } - layoutTitle.setBounds (r.removeFromBottom (16)); + void prepareToPlay (double, int) override + { + samplesToPlay = (int) getSampleRate(); + reset(); + } - noChannelsLabel.setBounds (r); + void processBlock (AudioBuffer& audio, MidiBuffer&) override { processAudio (audio); } + void processBlock (AudioBuffer& audio, MidiBuffer&) override { processAudio (audio); } - if (channelButtons.size() > 0) - { - auto buttonWidth = r.getWidth() / channelButtons.size(); - for (auto channelButton : channelButtons) - channelButton->setBounds (r.removeFromLeft (buttonWidth)); - } - } + void releaseResources() override { reset(); } - void paint (Graphics& g) override + float getLevel (int bus, int channel) const { - g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId)); + return readableLevels[(size_t) getChannelIndexInProcessBlockBuffer (true, bus, channel)]; } - void updateButton (Button* btn) + bool isBusesLayoutSupported (const BusesLayout& layouts) const override { - if (auto* textButton = dynamic_cast (btn)) + const auto isSetValid = [] (const AudioChannelSet& set) { - auto channelIndex = channelButtons.indexOf (textButton); + return ! set.isDisabled() + && ! (set.isDiscreteLayout() && set.getChannelIndexForType (AudioChannelSet::discreteChannel0) == -1); + }; - if (auto* listener = dynamic_cast (getAudioProcessor())) - listener->channelButtonClicked (channelIndex); - } + return isSetValid (layouts.getMainOutputChannelSet()) + && isSetValid (layouts.getMainInputChannelSet()); } - void updateGUI() + void reset() override { - const auto& channelSet = getAudioProcessor()->getChannelLayoutOfBus (false, 0); + channelClicked = 0; + samplesPlayed = samplesToPlay; + } - if (channelSet != currentChannelLayout) - { - currentChannelLayout = channelSet; + bool applyBusLayouts (const BusesLayout& layouts) override + { + // Some very badly-behaved hosts will call this during processing! + const SpinLock::ScopedLockType lock (levelMutex); - layoutTitle.setText (currentChannelLayout.getDescription(), NotificationType::dontSendNotification); - channelButtons.clear(); - activeChannels.resize (currentChannelLayout.size()); + const auto result = AudioProcessor::applyBusLayouts (layouts); - if (currentChannelLayout == AudioChannelSet::disabled()) - { - noChannelsLabel.setVisible (true); - } - else - { - auto numChannels = currentChannelLayout.size(); + size_t numInputChannels = 0; - for (auto i = 0; i < numChannels; ++i) - { - auto channelName = - AudioChannelSet::getAbbreviatedChannelTypeName (currentChannelLayout.getTypeOfChannel (i)); + for (auto i = 0; i < getBusCount (true); ++i) + numInputChannels += (size_t) getBus (true, i)->getLastEnabledLayout().size(); - TextButton* newButton; - channelButtons.add (newButton = new TextButton (channelName, channelName)); + incomingLevels = readableLevels = std::vector (numInputChannels, 0.0f); - newButton->onClick = [this, newButton] { updateButton (newButton); }; - addAndMakeVisible (newButton); - } + triggerAsyncUpdate(); + return result; + } - noChannelsLabel.setVisible (false); - resized(); - } + //============================================================================== + const String getName() const override { return "Surround PlugIn"; } + bool acceptsMidi() const override { return false; } + bool producesMidi() const override { return false; } + double getTailLengthSeconds() const override { return 0; } - if (auto* listener = dynamic_cast (getAudioProcessor())) - { - auto activeColour = getLookAndFeel().findColour (Slider::thumbColourId); - auto inactiveColour = getLookAndFeel().findColour (Slider::trackColourId); + //============================================================================== + int getNumPrograms() override { return 1; } + int getCurrentProgram() override { return 0; } + void setCurrentProgram (int) override {} + const String getProgramName (int) override { return "None"; } + void changeProgramName (int, const String&) override {} - for (auto i = 0; i < activeChannels.size(); ++i) - { - auto isActive = listener->isChannelActive (i); - activeChannels.getReference (i) = isActive; - channelButtons[i]->setColour (TextButton::buttonColourId, isActive ? activeColour : inactiveColour); - channelButtons[i]->repaint(); - } - } - } + //============================================================================== + void getStateInformation (MemoryBlock&) override {} + void setStateInformation (const void*, int) override {} + + void channelButtonClicked (int bus, int channelIndex) + { + channelClicked = getChannelIndexInProcessBlockBuffer (false, bus, channelIndex); + samplesPlayed = 0; } + std::function updateEditor; + private: - String getLayoutName() const + void handleAsyncUpdate() override { - if (auto* p = getAudioProcessor()) - return p->getChannelLayoutOfBus (false, 0).getDescription(); - - return "Unknown"; + NullCheckedInvocation::invoke (updateEditor); } - void timerCallback() override + template + void processAudio (AudioBuffer& audio) { - if (getAudioProcessor()->isSuspended() != lastSuspended) { - lastSuspended = getAudioProcessor()->isSuspended(); - updateGUI(); - } + SpinLock::ScopedTryLockType lock (levelMutex); - if (! lastSuspended) - { - if (auto* listener = dynamic_cast (getAudioProcessor())) + if (lock.isLocked()) { - auto activeColour = getLookAndFeel().findColour (Slider::thumbColourId); - auto inactiveColour = getLookAndFeel().findColour (Slider::trackColourId); + const auto numInputChannels = (size_t) getTotalNumInputChannels(); - for (auto i = 0; i < activeChannels.size(); ++i) + for (size_t i = 0; i < numInputChannels; ++i) { - auto isActive = listener->isChannelActive (i); - if (activeChannels.getReference (i) != isActive) - { - activeChannels.getReference (i) = isActive; - channelButtons[i]->setColour (TextButton::buttonColourId, isActive ? activeColour : inactiveColour); - channelButtons[i]->repaint(); - } + const auto minMax = audio.findMinMax ((int) i, 0, audio.getNumSamples()); + const auto newMax = (float) std::max (std::abs (minMax.getStart()), std::abs (minMax.getEnd())); + + auto& toUpdate = incomingLevels[i]; + toUpdate = jmax (toUpdate, newMax); } } } + + audio.clear (0, audio.getNumSamples()); + + auto fillSamples = jmin (samplesToPlay - samplesPlayed, audio.getNumSamples()); + + if (isPositiveAndBelow (channelClicked, audio.getNumChannels())) + { + auto* channelBuffer = audio.getWritePointer (channelClicked); + auto freq = (float) (440.0 / getSampleRate()); + + for (auto i = 0; i < fillSamples; ++i) + channelBuffer[i] += std::sin (MathConstants::twoPi * freq * (float) samplesPlayed++); + } } - AudioChannelSet currentChannelLayout; - Label noChannelsLabel { "noChannelsLabel", "Input disabled" }, - layoutTitle; - OwnedArray channelButtons; - Array activeChannels; + void timerCallback() override + { + const SpinLock::ScopedLockType lock (levelMutex); - bool lastSuspended; + for (size_t i = 0; i < readableLevels.size(); ++i) + readableLevels[i] = std::max (readableLevels[i] * 0.95f, std::exchange (incomingLevels[i], 0.0f)); + } + + SpinLock levelMutex; + std::vector incomingLevels; + std::vector readableLevels; + + int channelClicked; + int samplesPlayed; + int samplesToPlay; }; //============================================================================== -class SurroundProcessor : public AudioProcessor, - public ChannelClickListener, - private AsyncUpdater +const Colour textColour = Colours::white.withAlpha (0.8f); + +inline void drawBackground (Component& comp, Graphics& g) +{ + g.setColour (comp.getLookAndFeel().findColour (ResizableWindow::backgroundColourId).darker (0.8f)); + g.fillRoundedRectangle (comp.getLocalBounds().toFloat(), 4.0f); +} + +inline void configureLabel (Label& label, const AudioProcessor::Bus* layout) +{ + const auto text = layout != nullptr + ? (layout->getName() + ": " + layout->getCurrentLayout().getDescription()) + : ""; + label.setText (text, dontSendNotification); + label.setJustificationType (Justification::centred); + label.setColour (Label::textColourId, textColour); +} + +class InputBusViewer : public Component, + private Timer { public: - SurroundProcessor() - : AudioProcessor(BusesProperties().withInput ("Input", AudioChannelSet::stereo()) - .withOutput ("Output", AudioChannelSet::stereo())) - {} + InputBusViewer (ProcessorWithLevels& proc, int busNumber) + : processor (proc), + bus (busNumber) + { + configureLabel (layoutName, processor.getBus (true, bus)); + addAndMakeVisible (layoutName); - //============================================================================== - void prepareToPlay (double sampleRate, int samplesPerBlock) override + startTimerHz (60); + } + + ~InputBusViewer() override { - channelClicked = 0; - sampleOffset = static_cast (std::ceil (sampleRate)); + stopTimer(); + } - auto numChannels = getChannelCountOfBus (true, 0); - channelActive.resize (numChannels); - alphaCoeffs .resize (numChannels); - reset(); + void paint (Graphics& g) override + { + drawBackground (*this, g); - triggerAsyncUpdate(); + auto* layout = processor.getBus (true, bus); - ignoreUnused (samplesPerBlock); - } + if (layout == nullptr) + return; - void releaseResources() override { reset(); } + const auto channelSet = layout->getCurrentLayout(); + const auto numChannels = channelSet.size(); - void processBlock (AudioBuffer& buffer, MidiBuffer&) override - { - for (auto ch = 0; ch < buffer.getNumChannels(); ++ch) + Grid grid; + + grid.autoFlow = Grid::AutoFlow::column; + grid.autoColumns = grid.autoRows = Grid::TrackInfo (Grid::Fr (1)); + grid.items.insertMultiple (0, GridItem(), numChannels); + grid.performLayout (getLocalBounds()); + + const auto minDb = -50.0f; + const auto maxDb = 6.0f; + + for (auto i = 0; i < numChannels; ++i) { - auto& channelTime = channelActive.getReference (ch); - auto& alpha = alphaCoeffs .getReference (ch); + g.setColour (Colours::orange.darker()); - for (auto j = 0; j < buffer.getNumSamples(); ++j) - { - auto sample = buffer.getReadPointer (ch)[j]; - alpha = (0.8f * alpha) + (0.2f * sample); + const auto levelInDb = Decibels::gainToDecibels (processor.getLevel (bus, i), minDb); + const auto fractionOfHeight = jmap (levelInDb, minDb, maxDb, 0.0f, 1.0f); + const auto bounds = grid.items[i].currentBounds; + const auto trackBounds = bounds.withSizeKeepingCentre (16, bounds.getHeight() - 10).toFloat(); + g.fillRect (trackBounds.withHeight (trackBounds.proportionOfHeight (fractionOfHeight)).withBottomY (trackBounds.getBottom())); - if (std::abs (alpha) >= 0.1f) - channelTime = static_cast (getSampleRate() / 2.0); - } + g.setColour (textColour); - channelTime = jmax (0, channelTime - buffer.getNumSamples()); + g.drawText (channelSet.getAbbreviatedChannelTypeName (channelSet.getTypeOfChannel (i)), + bounds, + Justification::centredBottom); } + } - auto fillSamples = jmin (static_cast (std::ceil (getSampleRate())) - sampleOffset, - buffer.getNumSamples()); + void resized() override + { + layoutName.setBounds (getLocalBounds().removeFromTop (20)); + } - if (isPositiveAndBelow (channelClicked, buffer.getNumChannels())) - { - auto* channelBuffer = buffer.getWritePointer (channelClicked); - auto freq = (float) (440.0 / getSampleRate()); + int getNumChannels() const + { + if (auto* b = processor.getBus (true, bus)) + return b->getCurrentLayout().size(); - for (auto i = 0; i < fillSamples; ++i) - channelBuffer[i] += std::sin (MathConstants::twoPi * freq * static_cast (sampleOffset++)); - } + return 0; } - using AudioProcessor::processBlock; +private: + void timerCallback() override { repaint(); } - //============================================================================== - AudioProcessorEditor* createEditor() override { return new SurroundEditor (*this); } - bool hasEditor() const override { return true; } + ProcessorWithLevels& processor; + int bus = 0; + Label layoutName; +}; - //============================================================================== - bool isBusesLayoutSupported (const BusesLayout& layouts) const override +//============================================================================== +class OutputBusViewer : public Component +{ +public: + OutputBusViewer (ProcessorWithLevels& proc, int busNumber) + : processor (proc), + bus (busNumber) { - return ((! layouts.getMainInputChannelSet() .isDiscreteLayout()) - && (! layouts.getMainOutputChannelSet().isDiscreteLayout()) - && (layouts.getMainInputChannelSet() == layouts.getMainOutputChannelSet()) - && (! layouts.getMainInputChannelSet().isDisabled())); + auto* layout = processor.getBus (false, bus); + + configureLabel (layoutName, layout); + addAndMakeVisible (layoutName); + + if (layout == nullptr) + return; + + const auto& channelSet = layout->getCurrentLayout(); + + const auto numChannels = channelSet.size(); + + for (auto i = 0; i < numChannels; ++i) + { + const auto channelName = channelSet.getAbbreviatedChannelTypeName (channelSet.getTypeOfChannel (i)); + + channelButtons.emplace_back (channelName, channelName); + + auto& newButton = channelButtons.back(); + newButton.onClick = [&proc = processor, bus = bus, i] { proc.channelButtonClicked (bus, i); }; + addAndMakeVisible (newButton); + } + + resized(); } - void reset() override + void paint (Graphics& g) override { - for (auto& channel : channelActive) - channel = 0; + drawBackground (*this, g); } - //============================================================================== - const String getName() const override { return "Surround PlugIn"; } - bool acceptsMidi() const override { return false; } - bool producesMidi() const override { return false; } - double getTailLengthSeconds() const override { return 0; } + void resized() override + { + auto b = getLocalBounds(); - //============================================================================== - int getNumPrograms() override { return 1; } - int getCurrentProgram() override { return 0; } - void setCurrentProgram (int) override {} - const String getProgramName (int) override { return "None"; } - void changeProgramName (int, const String&) override {} + layoutName.setBounds (b.removeFromBottom (20)); - //============================================================================== - void getStateInformation (MemoryBlock&) override {} - void setStateInformation (const void*, int) override {} + Grid grid; + grid.autoFlow = Grid::AutoFlow::column; + grid.autoColumns = grid.autoRows = Grid::TrackInfo (Grid::Fr (1)); - void channelButtonClicked (int channelIndex) override + for (auto& channelButton : channelButtons) + grid.items.add (GridItem (channelButton)); + + grid.performLayout (b.reduced (2)); + } + + int getNumChannels() const { - channelClicked = channelIndex; - sampleOffset = 0; + if (auto* b = processor.getBus (false, bus)) + return b->getCurrentLayout().size(); + + return 0; } - bool isChannelActive (int channelIndex) override +private: + ProcessorWithLevels& processor; + int bus = 0; + Label layoutName; + std::list channelButtons; +}; + +//============================================================================== +class SurroundEditor : public AudioProcessorEditor +{ +public: + explicit SurroundEditor (ProcessorWithLevels& parent) + : AudioProcessorEditor (parent), + customProcessor (parent), + scopedUpdateEditor (customProcessor.updateEditor, [this] { updateGUI(); }) { - return channelActive[channelIndex] > 0; + updateGUI(); + setResizable (true, true); } - void handleAsyncUpdate() override + void resized() override { - if (auto* editor = getActiveEditor()) - if (auto* surroundEditor = dynamic_cast (editor)) - surroundEditor->updateGUI(); + auto r = getLocalBounds(); + doLayout (inputViewers, r.removeFromTop (proportionOfHeight (0.5f))); + doLayout (outputViewers, r); + } + + void paint (Graphics& g) override + { + g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId)); } private: - Array channelActive; - Array alphaCoeffs; - int channelClicked; - int sampleOffset; + template + void doLayout (Range& range, Rectangle bounds) const + { + FlexBox fb; - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SurroundProcessor) + for (auto& viewer : range) + { + if (viewer.getNumChannels() != 0) + { + fb.items.add (FlexItem (viewer) + .withFlex ((float) viewer.getNumChannels()) + .withMargin (4.0f)); + } + } + + fb.performLayout (bounds); + } + + void updateGUI() + { + inputViewers.clear(); + outputViewers.clear(); + + const auto inputBuses = getAudioProcessor()->getBusCount (true); + + for (auto i = 0; i < inputBuses; ++i) + { + inputViewers.emplace_back (customProcessor, i); + addAndMakeVisible (inputViewers.back()); + } + + const auto outputBuses = getAudioProcessor()->getBusCount (false); + + for (auto i = 0; i < outputBuses; ++i) + { + outputViewers.emplace_back (customProcessor, i); + addAndMakeVisible (outputViewers.back()); + } + + const auto channels = jmax (processor.getTotalNumInputChannels(), + processor.getTotalNumOutputChannels()); + setSize (jmax (150, channels * 40), 200); + + resized(); + } + + ProcessorWithLevels& customProcessor; + ScopedValueSetter> scopedUpdateEditor; + std::list inputViewers; + std::list outputViewers; +}; + +//============================================================================== +struct SurroundProcessor : public ProcessorWithLevels +{ + AudioProcessorEditor* createEditor() override { return new SurroundEditor (*this); } + bool hasEditor() const override { return true; } }; diff --git a/examples/Utilities/AnalyticsCollectionDemo.h b/examples/Utilities/AnalyticsCollectionDemo.h index eff858d8..2dacda6d 100644 --- a/examples/Utilities/AnalyticsCollectionDemo.h +++ b/examples/Utilities/AnalyticsCollectionDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_analytics, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, xcode_iphone, androidstudio + exporters: xcode_mac, vs2022, linux_make, xcode_iphone, androidstudio moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Utilities/Box2DDemo.h b/examples/Utilities/Box2DDemo.h index 991730f4..837130e6 100644 --- a/examples/Utilities/Box2DDemo.h +++ b/examples/Utilities/Box2DDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_box2d, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Utilities/CMakeLists.txt b/examples/Utilities/CMakeLists.txt index 272e8475..dc6880ef 100644 --- a/examples/Utilities/CMakeLists.txt +++ b/examples/Utilities/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/examples/Utilities/ChildProcessDemo.h b/examples/Utilities/ChildProcessDemo.h index 2b3c4a58..d6f4e0b0 100644 --- a/examples/Utilities/ChildProcessDemo.h +++ b/examples/Utilities/ChildProcessDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Utilities/CryptographyDemo.h b/examples/Utilities/CryptographyDemo.h index a8f4b826..1c1bf603 100644 --- a/examples/Utilities/CryptographyDemo.h +++ b/examples/Utilities/CryptographyDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_cryptography, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Utilities/InAppPurchasesDemo.h b/examples/Utilities/InAppPurchasesDemo.h index 8979b183..164a98a3 100644 --- a/examples/Utilities/InAppPurchasesDemo.h +++ b/examples/Utilities/InAppPurchasesDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -192,20 +192,23 @@ private: { purchaseInProgress = false; - auto idx = findVoiceIndexFromIdentifier (info.purchase.productId); - - if (isPositiveAndBelow (idx, voiceProducts.size())) + for (const auto productId : info.purchase.productIds) { - auto& voiceProduct = voiceProducts.getReference (idx); + auto idx = findVoiceIndexFromIdentifier (productId); - voiceProduct.isPurchased = success; - voiceProduct.purchaseInProgress = false; - } - else - { - // On failure Play Store will not tell us which purchase failed - for (auto& voiceProduct : voiceProducts) + if (isPositiveAndBelow (idx, voiceProducts.size())) + { + auto& voiceProduct = voiceProducts.getReference (idx); + + voiceProduct.isPurchased = success; voiceProduct.purchaseInProgress = false; + } + else + { + // On failure Play Store will not tell us which purchase failed + for (auto& voiceProduct : voiceProducts) + voiceProduct.purchaseInProgress = false; + } } guiUpdater.triggerAsyncUpdate(); @@ -217,13 +220,16 @@ private: { for (auto& info : infos) { - auto idx = findVoiceIndexFromIdentifier (info.purchase.productId); - - if (isPositiveAndBelow (idx, voiceProducts.size())) + for (const auto productId : info.purchase.productIds) { - auto& voiceProduct = voiceProducts.getReference (idx); + auto idx = findVoiceIndexFromIdentifier (productId); + + if (isPositiveAndBelow (idx, voiceProducts.size())) + { + auto& voiceProduct = voiceProducts.getReference (idx); - voiceProduct.isPurchased = true; + voiceProduct.isPurchased = true; + } } } diff --git a/examples/Utilities/JavaScriptDemo.h b/examples/Utilities/JavaScriptDemo.h index 7655c033..53e8e257 100644 --- a/examples/Utilities/JavaScriptDemo.h +++ b/examples/Utilities/JavaScriptDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Utilities/LiveConstantDemo.h b/examples/Utilities/LiveConstantDemo.h index 9ae148e9..3ddcaf11 100644 --- a/examples/Utilities/LiveConstantDemo.h +++ b/examples/Utilities/LiveConstantDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 @@ -86,8 +86,9 @@ public: descriptionLabel.setMinimumHorizontalScale (1.0f); descriptionLabel.setText ("This demonstrates the JUCE_LIVE_CONSTANT macro, which allows you to quickly " "adjust primitive values at runtime by just wrapping them in a macro.\n\n" + "Editing JUCE_LIVE_CONSTANT values is only enabled in debug builds.\n\n" "To understand what's going on in this demo, you should have a look at the " - "LiveConstantDemoComponent class, where you can see the code that's invoking the demo below...", + "LiveConstantDemoComponent class, where you can see the code that's invoking the demo below.", dontSendNotification); addAndMakeVisible (descriptionLabel); diff --git a/examples/Utilities/MultithreadingDemo.h b/examples/Utilities/MultithreadingDemo.h index e682f1f7..e2363bad 100644 --- a/examples/Utilities/MultithreadingDemo.h +++ b/examples/Utilities/MultithreadingDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Utilities/NetworkingDemo.h b/examples/Utilities/NetworkingDemo.h index 03d3851a..43e74ee2 100644 --- a/examples/Utilities/NetworkingDemo.h +++ b/examples/Utilities/NetworkingDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Utilities/OSCDemo.h b/examples/Utilities/OSCDemo.h index 0109cc8d..06371359 100644 --- a/examples/Utilities/OSCDemo.h +++ b/examples/Utilities/OSCDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_osc - exporters: xcode_mac, vs2019, linux_make + exporters: xcode_mac, vs2022, linux_make moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Utilities/PushNotificationsDemo.h b/examples/Utilities/PushNotificationsDemo.h index 70711949..1e3f9839 100644 --- a/examples/Utilities/PushNotificationsDemo.h +++ b/examples/Utilities/PushNotificationsDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff --git a/examples/Utilities/SystemInfoDemo.h b/examples/Utilities/SystemInfoDemo.h index 233a0166..41f6dfe8 100644 --- a/examples/Utilities/SystemInfoDemo.h +++ b/examples/Utilities/SystemInfoDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Utilities/TimersAndEventsDemo.h b/examples/Utilities/TimersAndEventsDemo.h index d44b59e0..df2d30ce 100644 --- a/examples/Utilities/TimersAndEventsDemo.h +++ b/examples/Utilities/TimersAndEventsDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Utilities/UnitTestsDemo.h b/examples/Utilities/UnitTestsDemo.h index 44a878af..f02b7c21 100644 --- a/examples/Utilities/UnitTestsDemo.h +++ b/examples/Utilities/UnitTestsDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -34,9 +34,9 @@ juce_core, juce_cryptography, juce_data_structures, juce_dsp, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra, juce_opengl, juce_osc, juce_product_unlocking, juce_video - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone - moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 + moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1,JUCE_PLUGINHOST_VST3=1 defines: JUCE_UNIT_TESTS=1 type: Component diff --git a/examples/Utilities/ValueTreesDemo.h b/examples/Utilities/ValueTreesDemo.h index f2aae76e..00a6a8c5 100644 --- a/examples/Utilities/ValueTreesDemo.h +++ b/examples/Utilities/ValueTreesDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/examples/Utilities/XMLandJSONDemo.h b/examples/Utilities/XMLandJSONDemo.h index 3f4d09ee..1cf71f98 100644 --- a/examples/Utilities/XMLandJSONDemo.h +++ b/examples/Utilities/XMLandJSONDemo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission @@ -31,7 +31,7 @@ dependencies: juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra - exporters: xcode_mac, vs2019, linux_make, androidstudio, xcode_iphone + exporters: xcode_mac, vs2022, linux_make, androidstudio, xcode_iphone moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt index 53c54a49..a57abf56 100644 --- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt +++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt @@ -23,9 +23,9 @@ include_directories( AFTER enable_language(ASM) if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60106]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60106]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) else() message( FATAL_ERROR "No matching build-configuration found." ) endif() @@ -47,6 +47,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" @@ -61,7 +62,6 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" - "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" @@ -98,6 +98,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" + "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h" "../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" @@ -140,9 +141,9 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp" "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" - "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" @@ -436,6 +437,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.h" "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" @@ -460,6 +463,116 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" @@ -557,16 +670,27 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.h" "../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" "../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" "../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" "../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" @@ -595,6 +719,17 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h" "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" @@ -608,6 +743,9 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" "../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" @@ -618,6 +756,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" @@ -669,9 +809,12 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/containers/juce_HashMap.h" "../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" "../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" + "../../../../../modules/juce_core/containers/juce_ListenerList.cpp" "../../../../../modules/juce_core/containers/juce_ListenerList.h" "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" "../../../../../modules/juce_core/containers/juce_NamedValueSet.h" + "../../../../../modules/juce_core/containers/juce_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.h" "../../../../../modules/juce_core/containers/juce_PropertySet.cpp" @@ -685,6 +828,9 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/containers/juce_SparseSet.h" "../../../../../modules/juce_core/containers/juce_Variant.cpp" "../../../../../modules/juce_core/containers/juce_Variant.h" + "../../../../../modules/juce_core/files/juce_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.h" "../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" "../../../../../modules/juce_core/files/juce_DirectoryIterator.h" "../../../../../modules/juce_core/files/juce_File.cpp" @@ -751,6 +897,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/misc/juce_Uuid.h" "../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" "../../../../../modules/juce_core/native/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" "../../../../../modules/juce_core/native/juce_android_Files.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" @@ -963,6 +1110,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_events/native/juce_android_Messaging.cpp" "../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" "../../../../../modules/juce_events/native/juce_linux_EventLoop.h" + "../../../../../modules/juce_events/native/juce_linux_EventLoopInternal.h" "../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" "../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" "../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" @@ -1345,6 +1493,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" "../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" @@ -1376,13 +1525,13 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" "../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" "../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" - "../../../../../modules/juce_gui_basics/native/juce_common_MimeTypes.cpp" "../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" "../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" "../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" "../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" "../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" "../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" "../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" "../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" "../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" @@ -1525,7 +1674,6 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" "../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" "../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" - "../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" "../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" @@ -1542,6 +1690,8 @@ add_library( ${BINARY_NAME} "../../../JuceLibraryCode/include_juce_audio_devices.cpp" "../../../JuceLibraryCode/include_juce_audio_formats.cpp" "../../../JuceLibraryCode/include_juce_audio_processors.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_ara.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp" "../../../JuceLibraryCode/include_juce_audio_utils.cpp" "../../../JuceLibraryCode/include_juce_core.cpp" "../../../JuceLibraryCode/include_juce_data_structures.cpp" @@ -1552,1510 +1702,1660 @@ add_library( ${BINARY_NAME} "../../../JuceLibraryCode/JuceHeader.h" ) -set_source_files_properties("../../../Source/MainComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Bela.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/assert.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/callback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/compat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/export.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterfunctionname.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_MathsFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_NormalisableRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Range.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Atomic.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Reservoir.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Functional.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/java/README.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Misc.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_curl_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_intel_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_CFHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Files.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Network.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Strings.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Registry.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerSupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerWarnings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_PlatformDefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_StandardHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_TargetPlatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_NewLine.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringRef.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_CriticalSection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_DynamicLibrary.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_InterProcessLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Process.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedReadLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_SpinLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTestCategories.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/adler32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/compress.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/infback.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/uncompr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.in.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zlib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Initialisation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Message.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_NotificationType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_android_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_EventLoop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_PixelFormats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_BorderSize.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Line.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Parallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Point.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ScaledImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_Justification.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_common_MimeTypes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_MessageBoxOptions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_HWNDComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../JuceLibraryCode/JuceHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties( + "../../../Source/MainComponent.h" + "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" + "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiFile.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiFile.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPENote.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPENote.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" + "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" + "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h" + "../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h" + "../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" + "../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" + "../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" + "../../../../../modules/juce_audio_basics/utilities/juce_ADSR_test.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" + "../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" + "../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" + "../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" + "../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.mm" + "../../../../../modules/juce_audio_basics/juce_audio_basics.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" + "../../../../../modules/juce_audio_devices/native/oboe/README.md" + "../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" + "../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp" + "../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_ios_Audio.h" + "../../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp" + "../../../../../modules/juce_audio_devices/native/juce_linux_Bela.cpp" + "../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" + "../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" + "../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" + "../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" + "../../../../../modules/juce_audio_devices/native/juce_win32_Midi.cpp" + "../../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp" + "../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp" + "../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h" + "../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp" + "../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h" + "../../../../../modules/juce_audio_devices/juce_audio_devices.cpp" + "../../../../../modules/juce_audio_devices/juce_audio_devices.mm" + "../../../../../modules/juce_audio_devices/juce_audio_devices.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/assert.h" + "../../../../../modules/juce_audio_formats/codecs/flac/callback.h" + "../../../../../modules/juce_audio_formats/codecs/flac/compat.h" + "../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" + "../../../../../modules/juce_audio_formats/codecs/flac/export.h" + "../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/flac/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h" + "../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.h" + "../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp" + "../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h" + "../../../../../modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h" + "../../../../../modules/juce_audio_formats/sampler/juce_Sampler.cpp" + "../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" + "../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" + "../../../../../modules/juce_audio_formats/juce_audio_formats.mm" + "../../../../../modules/juce_audio_formats/juce_audio_formats.h" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterfunctionname.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.h" + "../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" + "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" + "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" + "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" + "../../../../../modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h" + "../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.h" + "../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp" + "../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" + "../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" + "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.h" + "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" + "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" + "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" + "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" + "../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" + "../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" + "../../../../../modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm" + "../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm" + "../../../../../modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm" + "../../../../../modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp" + "../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp" + "../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h" + "../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.cpp" + "../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.h" + "../../../../../modules/juce_audio_utils/juce_audio_utils.cpp" + "../../../../../modules/juce_audio_utils/juce_audio_utils.mm" + "../../../../../modules/juce_audio_utils/juce_audio_utils.h" + "../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp" + "../../../../../modules/juce_core/containers/juce_AbstractFifo.h" + "../../../../../modules/juce_core/containers/juce_Array.h" + "../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" + "../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" + "../../../../../modules/juce_core/containers/juce_ArrayBase.h" + "../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" + "../../../../../modules/juce_core/containers/juce_DynamicObject.h" + "../../../../../modules/juce_core/containers/juce_ElementComparator.h" + "../../../../../modules/juce_core/containers/juce_HashMap.h" + "../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" + "../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" + "../../../../../modules/juce_core/containers/juce_ListenerList.cpp" + "../../../../../modules/juce_core/containers/juce_ListenerList.h" + "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" + "../../../../../modules/juce_core/containers/juce_NamedValueSet.h" + "../../../../../modules/juce_core/containers/juce_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" + "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" + "../../../../../modules/juce_core/containers/juce_OwnedArray.h" + "../../../../../modules/juce_core/containers/juce_PropertySet.cpp" + "../../../../../modules/juce_core/containers/juce_PropertySet.h" + "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" + "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" + "../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" + "../../../../../modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h" + "../../../../../modules/juce_core/containers/juce_SortedSet.h" + "../../../../../modules/juce_core/containers/juce_SparseSet.cpp" + "../../../../../modules/juce_core/containers/juce_SparseSet.h" + "../../../../../modules/juce_core/containers/juce_Variant.cpp" + "../../../../../modules/juce_core/containers/juce_Variant.h" + "../../../../../modules/juce_core/files/juce_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.h" + "../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_DirectoryIterator.h" + "../../../../../modules/juce_core/files/juce_File.cpp" + "../../../../../modules/juce_core/files/juce_File.h" + "../../../../../modules/juce_core/files/juce_FileFilter.cpp" + "../../../../../modules/juce_core/files/juce_FileFilter.h" + "../../../../../modules/juce_core/files/juce_FileInputStream.cpp" + "../../../../../modules/juce_core/files/juce_FileInputStream.h" + "../../../../../modules/juce_core/files/juce_FileOutputStream.cpp" + "../../../../../modules/juce_core/files/juce_FileOutputStream.h" + "../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" + "../../../../../modules/juce_core/files/juce_FileSearchPath.h" + "../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" + "../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" + "../../../../../modules/juce_core/files/juce_TemporaryFile.h" + "../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" + "../../../../../modules/juce_core/files/juce_WildcardFileFilter.h" + "../../../../../modules/juce_core/javascript/juce_Javascript.cpp" + "../../../../../modules/juce_core/javascript/juce_Javascript.h" + "../../../../../modules/juce_core/javascript/juce_JSON.cpp" + "../../../../../modules/juce_core/javascript/juce_JSON.h" + "../../../../../modules/juce_core/logging/juce_FileLogger.cpp" + "../../../../../modules/juce_core/logging/juce_FileLogger.h" + "../../../../../modules/juce_core/logging/juce_Logger.cpp" + "../../../../../modules/juce_core/logging/juce_Logger.h" + "../../../../../modules/juce_core/maths/juce_BigInteger.cpp" + "../../../../../modules/juce_core/maths/juce_BigInteger.h" + "../../../../../modules/juce_core/maths/juce_Expression.cpp" + "../../../../../modules/juce_core/maths/juce_Expression.h" + "../../../../../modules/juce_core/maths/juce_MathsFunctions.h" + "../../../../../modules/juce_core/maths/juce_NormalisableRange.h" + "../../../../../modules/juce_core/maths/juce_Random.cpp" + "../../../../../modules/juce_core/maths/juce_Random.h" + "../../../../../modules/juce_core/maths/juce_Range.h" + "../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h" + "../../../../../modules/juce_core/memory/juce_AllocationHooks.cpp" + "../../../../../modules/juce_core/memory/juce_AllocationHooks.h" + "../../../../../modules/juce_core/memory/juce_Atomic.h" + "../../../../../modules/juce_core/memory/juce_ByteOrder.h" + "../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" + "../../../../../modules/juce_core/memory/juce_HeapBlock.h" + "../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" + "../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" + "../../../../../modules/juce_core/memory/juce_Memory.h" + "../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" + "../../../../../modules/juce_core/memory/juce_MemoryBlock.h" + "../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h" + "../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h" + "../../../../../modules/juce_core/memory/juce_Reservoir.h" + "../../../../../modules/juce_core/memory/juce_ScopedPointer.h" + "../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" + "../../../../../modules/juce_core/memory/juce_Singleton.h" + "../../../../../modules/juce_core/memory/juce_WeakReference.h" + "../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" + "../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" + "../../../../../modules/juce_core/misc/juce_Functional.h" + "../../../../../modules/juce_core/misc/juce_Result.cpp" + "../../../../../modules/juce_core/misc/juce_Result.h" + "../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" + "../../../../../modules/juce_core/misc/juce_RuntimePermissions.h" + "../../../../../modules/juce_core/misc/juce_Uuid.cpp" + "../../../../../modules/juce_core/misc/juce_Uuid.h" + "../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" + "../../../../../modules/juce_core/native/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" + "../../../../../modules/juce_core/native/juce_android_Files.cpp" + "../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" + "../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" + "../../../../../modules/juce_core/native/juce_android_Misc.cpp" + "../../../../../modules/juce_core/native/juce_android_Network.cpp" + "../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp" + "../../../../../modules/juce_core/native/juce_android_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_android_Threads.cpp" + "../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h" + "../../../../../modules/juce_core/native/juce_curl_Network.cpp" + "../../../../../modules/juce_core/native/juce_intel_SharedCode.h" + "../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp" + "../../../../../modules/juce_core/native/juce_linux_Files.cpp" + "../../../../../modules/juce_core/native/juce_linux_Network.cpp" + "../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_linux_Threads.cpp" + "../../../../../modules/juce_core/native/juce_mac_CFHelpers.h" + "../../../../../modules/juce_core/native/juce_mac_Files.mm" + "../../../../../modules/juce_core/native/juce_mac_Network.mm" + "../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" + "../../../../../modules/juce_core/native/juce_mac_Strings.mm" + "../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" + "../../../../../modules/juce_core/native/juce_mac_Threads.mm" + "../../../../../modules/juce_core/native/juce_posix_IPAddress.h" + "../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" + "../../../../../modules/juce_core/native/juce_posix_SharedCode.h" + "../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" + "../../../../../modules/juce_core/native/juce_win32_Files.cpp" + "../../../../../modules/juce_core/native/juce_win32_Network.cpp" + "../../../../../modules/juce_core/native/juce_win32_Registry.cpp" + "../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_win32_Threads.cpp" + "../../../../../modules/juce_core/network/juce_IPAddress.cpp" + "../../../../../modules/juce_core/network/juce_IPAddress.h" + "../../../../../modules/juce_core/network/juce_MACAddress.cpp" + "../../../../../modules/juce_core/network/juce_MACAddress.h" + "../../../../../modules/juce_core/network/juce_NamedPipe.cpp" + "../../../../../modules/juce_core/network/juce_NamedPipe.h" + "../../../../../modules/juce_core/network/juce_Socket.cpp" + "../../../../../modules/juce_core/network/juce_Socket.h" + "../../../../../modules/juce_core/network/juce_URL.cpp" + "../../../../../modules/juce_core/network/juce_URL.h" + "../../../../../modules/juce_core/network/juce_WebInputStream.cpp" + "../../../../../modules/juce_core/network/juce_WebInputStream.h" + "../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp" + "../../../../../modules/juce_core/streams/juce_BufferedInputStream.h" + "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp" + "../../../../../modules/juce_core/streams/juce_FileInputSource.h" + "../../../../../modules/juce_core/streams/juce_InputSource.h" + "../../../../../modules/juce_core/streams/juce_InputStream.cpp" + "../../../../../modules/juce_core/streams/juce_InputStream.h" + "../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp" + "../../../../../modules/juce_core/streams/juce_MemoryInputStream.h" + "../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp" + "../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h" + "../../../../../modules/juce_core/streams/juce_OutputStream.cpp" + "../../../../../modules/juce_core/streams/juce_OutputStream.h" + "../../../../../modules/juce_core/streams/juce_SubregionStream.cpp" + "../../../../../modules/juce_core/streams/juce_SubregionStream.h" + "../../../../../modules/juce_core/streams/juce_URLInputSource.cpp" + "../../../../../modules/juce_core/streams/juce_URLInputSource.h" + "../../../../../modules/juce_core/system/juce_CompilerSupport.h" + "../../../../../modules/juce_core/system/juce_CompilerWarnings.h" + "../../../../../modules/juce_core/system/juce_PlatformDefs.h" + "../../../../../modules/juce_core/system/juce_StandardHeader.h" + "../../../../../modules/juce_core/system/juce_SystemStats.cpp" + "../../../../../modules/juce_core/system/juce_SystemStats.h" + "../../../../../modules/juce_core/system/juce_TargetPlatform.h" + "../../../../../modules/juce_core/text/juce_Base64.cpp" + "../../../../../modules/juce_core/text/juce_Base64.h" + "../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp" + "../../../../../modules/juce_core/text/juce_CharacterFunctions.h" + "../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h" + "../../../../../modules/juce_core/text/juce_Identifier.cpp" + "../../../../../modules/juce_core/text/juce_Identifier.h" + "../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp" + "../../../../../modules/juce_core/text/juce_LocalisedStrings.h" + "../../../../../modules/juce_core/text/juce_NewLine.h" + "../../../../../modules/juce_core/text/juce_String.cpp" + "../../../../../modules/juce_core/text/juce_String.h" + "../../../../../modules/juce_core/text/juce_StringArray.cpp" + "../../../../../modules/juce_core/text/juce_StringArray.h" + "../../../../../modules/juce_core/text/juce_StringPairArray.cpp" + "../../../../../modules/juce_core/text/juce_StringPairArray.h" + "../../../../../modules/juce_core/text/juce_StringPool.cpp" + "../../../../../modules/juce_core/text/juce_StringPool.h" + "../../../../../modules/juce_core/text/juce_StringRef.h" + "../../../../../modules/juce_core/text/juce_TextDiff.cpp" + "../../../../../modules/juce_core/text/juce_TextDiff.h" + "../../../../../modules/juce_core/threads/juce_ChildProcess.cpp" + "../../../../../modules/juce_core/threads/juce_ChildProcess.h" + "../../../../../modules/juce_core/threads/juce_CriticalSection.h" + "../../../../../modules/juce_core/threads/juce_DynamicLibrary.h" + "../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp" + "../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h" + "../../../../../modules/juce_core/threads/juce_InterProcessLock.h" + "../../../../../modules/juce_core/threads/juce_Process.h" + "../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp" + "../../../../../modules/juce_core/threads/juce_ReadWriteLock.h" + "../../../../../modules/juce_core/threads/juce_ScopedLock.h" + "../../../../../modules/juce_core/threads/juce_ScopedReadLock.h" + "../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h" + "../../../../../modules/juce_core/threads/juce_SpinLock.h" + "../../../../../modules/juce_core/threads/juce_Thread.cpp" + "../../../../../modules/juce_core/threads/juce_Thread.h" + "../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h" + "../../../../../modules/juce_core/threads/juce_ThreadPool.cpp" + "../../../../../modules/juce_core/threads/juce_ThreadPool.h" + "../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp" + "../../../../../modules/juce_core/threads/juce_TimeSliceThread.h" + "../../../../../modules/juce_core/threads/juce_WaitableEvent.cpp" + "../../../../../modules/juce_core/threads/juce_WaitableEvent.h" + "../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp" + "../../../../../modules/juce_core/time/juce_PerformanceCounter.h" + "../../../../../modules/juce_core/time/juce_RelativeTime.cpp" + "../../../../../modules/juce_core/time/juce_RelativeTime.h" + "../../../../../modules/juce_core/time/juce_Time.cpp" + "../../../../../modules/juce_core/time/juce_Time.h" + "../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp" + "../../../../../modules/juce_core/unit_tests/juce_UnitTest.h" + "../../../../../modules/juce_core/unit_tests/juce_UnitTestCategories.h" + "../../../../../modules/juce_core/xml/juce_XmlDocument.cpp" + "../../../../../modules/juce_core/xml/juce_XmlDocument.h" + "../../../../../modules/juce_core/xml/juce_XmlElement.cpp" + "../../../../../modules/juce_core/xml/juce_XmlElement.h" + "../../../../../modules/juce_core/zip/zlib/adler32.c" + "../../../../../modules/juce_core/zip/zlib/compress.c" + "../../../../../modules/juce_core/zip/zlib/crc32.c" + "../../../../../modules/juce_core/zip/zlib/crc32.h" + "../../../../../modules/juce_core/zip/zlib/deflate.c" + "../../../../../modules/juce_core/zip/zlib/deflate.h" + "../../../../../modules/juce_core/zip/zlib/infback.c" + "../../../../../modules/juce_core/zip/zlib/inffast.c" + "../../../../../modules/juce_core/zip/zlib/inffast.h" + "../../../../../modules/juce_core/zip/zlib/inffixed.h" + "../../../../../modules/juce_core/zip/zlib/inflate.c" + "../../../../../modules/juce_core/zip/zlib/inflate.h" + "../../../../../modules/juce_core/zip/zlib/inftrees.c" + "../../../../../modules/juce_core/zip/zlib/inftrees.h" + "../../../../../modules/juce_core/zip/zlib/trees.c" + "../../../../../modules/juce_core/zip/zlib/trees.h" + "../../../../../modules/juce_core/zip/zlib/uncompr.c" + "../../../../../modules/juce_core/zip/zlib/zconf.h" + "../../../../../modules/juce_core/zip/zlib/zconf.in.h" + "../../../../../modules/juce_core/zip/zlib/zlib.h" + "../../../../../modules/juce_core/zip/zlib/zutil.c" + "../../../../../modules/juce_core/zip/zlib/zutil.h" + "../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp" + "../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h" + "../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp" + "../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h" + "../../../../../modules/juce_core/zip/juce_ZipFile.cpp" + "../../../../../modules/juce_core/zip/juce_ZipFile.h" + "../../../../../modules/juce_core/juce_core.cpp" + "../../../../../modules/juce_core/juce_core.mm" + "../../../../../modules/juce_core/juce_core.h" + "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp" + "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" + "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" + "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" + "../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp" + "../../../../../modules/juce_data_structures/values/juce_CachedValue.h" + "../../../../../modules/juce_data_structures/values/juce_Value.cpp" + "../../../../../modules/juce_data_structures/values/juce_Value.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTree.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" + "../../../../../modules/juce_data_structures/juce_data_structures.cpp" + "../../../../../modules/juce_data_structures/juce_data_structures.mm" + "../../../../../modules/juce_data_structures/juce_data_structures.h" + "../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" + "../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" + "../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" + "../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp" + "../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h" + "../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp" + "../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h" + "../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h" + "../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp" + "../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" + "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" + "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" + "../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" + "../../../../../modules/juce_events/messages/juce_ApplicationBase.h" + "../../../../../modules/juce_events/messages/juce_CallbackMessage.h" + "../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp" + "../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h" + "../../../../../modules/juce_events/messages/juce_Initialisation.h" + "../../../../../modules/juce_events/messages/juce_Message.h" + "../../../../../modules/juce_events/messages/juce_MessageListener.cpp" + "../../../../../modules/juce_events/messages/juce_MessageListener.h" + "../../../../../modules/juce_events/messages/juce_MessageManager.cpp" + "../../../../../modules/juce_events/messages/juce_MessageManager.h" + "../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h" + "../../../../../modules/juce_events/messages/juce_NotificationType.h" + "../../../../../modules/juce_events/native/juce_android_Messaging.cpp" + "../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" + "../../../../../modules/juce_events/native/juce_linux_EventLoop.h" + "../../../../../modules/juce_events/native/juce_linux_EventLoopInternal.h" + "../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" + "../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" + "../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" + "../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp" + "../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h" + "../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h" + "../../../../../modules/juce_events/native/juce_win32_Messaging.cpp" + "../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp" + "../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h" + "../../../../../modules/juce_events/timers/juce_MultiTimer.cpp" + "../../../../../modules/juce_events/timers/juce_MultiTimer.h" + "../../../../../modules/juce_events/timers/juce_Timer.cpp" + "../../../../../modules/juce_events/timers/juce_Timer.h" + "../../../../../modules/juce_events/juce_events.cpp" + "../../../../../modules/juce_events/juce_events.mm" + "../../../../../modules/juce_events/juce_events.h" + "../../../../../modules/juce_graphics/colour/juce_Colour.cpp" + "../../../../../modules/juce_graphics/colour/juce_Colour.h" + "../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp" + "../../../../../modules/juce_graphics/colour/juce_ColourGradient.h" + "../../../../../modules/juce_graphics/colour/juce_Colours.cpp" + "../../../../../modules/juce_graphics/colour/juce_Colours.h" + "../../../../../modules/juce_graphics/colour/juce_FillType.cpp" + "../../../../../modules/juce_graphics/colour/juce_FillType.h" + "../../../../../modules/juce_graphics/colour/juce_PixelFormats.h" + "../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp" + "../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" + "../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp" + "../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h" + "../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp" + "../../../../../modules/juce_graphics/effects/juce_GlowEffect.h" + "../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h" + "../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp" + "../../../../../modules/juce_graphics/fonts/juce_AttributedString.h" + "../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp" + "../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h" + "../../../../../modules/juce_graphics/fonts/juce_Font.cpp" + "../../../../../modules/juce_graphics/fonts/juce_Font.h" + "../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp" + "../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h" + "../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp" + "../../../../../modules/juce_graphics/fonts/juce_TextLayout.h" + "../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp" + "../../../../../modules/juce_graphics/fonts/juce_Typeface.h" + "../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp" + "../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h" + "../../../../../modules/juce_graphics/geometry/juce_BorderSize.h" + "../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp" + "../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h" + "../../../../../modules/juce_graphics/geometry/juce_Line.h" + "../../../../../modules/juce_graphics/geometry/juce_Parallelogram.h" + "../../../../../modules/juce_graphics/geometry/juce_Path.cpp" + "../../../../../modules/juce_graphics/geometry/juce_Path.h" + "../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp" + "../../../../../modules/juce_graphics/geometry/juce_PathIterator.h" + "../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp" + "../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h" + "../../../../../modules/juce_graphics/geometry/juce_Point.h" + "../../../../../modules/juce_graphics/geometry/juce_Rectangle.h" + "../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp" + "../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" + "../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp" + "../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp" + "../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp" + "../../../../../modules/juce_graphics/images/juce_Image.cpp" + "../../../../../modules/juce_graphics/images/juce_Image.h" + "../../../../../modules/juce_graphics/images/juce_ImageCache.cpp" + "../../../../../modules/juce_graphics/images/juce_ImageCache.h" + "../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp" + "../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h" + "../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp" + "../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h" + "../../../../../modules/juce_graphics/images/juce_ScaledImage.h" + "../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp" + "../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp" + "../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp" + "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h" + "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm" + "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h" + "../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm" + "../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp" + "../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp" + "../../../../../modules/juce_graphics/placement/juce_Justification.h" + "../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp" + "../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h" + "../../../../../modules/juce_graphics/juce_graphics.cpp" + "../../../../../modules/juce_graphics/juce_graphics.mm" + "../../../../../modules/juce_graphics/juce_graphics.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.h" + "../../../../../modules/juce_gui_basics/application/juce_Application.cpp" + "../../../../../modules/juce_gui_basics/application/juce_Application.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_Button.h" + "../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h" + "../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h" + "../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h" + "../../../../../modules/juce_gui_basics/components/juce_Component.cpp" + "../../../../../modules/juce_gui_basics/components/juce_Component.h" + "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" + "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" + "../../../../../modules/juce_gui_basics/components/juce_ComponentTraverser.h" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.h" + "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" + "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" + "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" + "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" + "../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" + "../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" + "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h" + "../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h" + "../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h" + "../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h" + "../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h" + "../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" + "../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" + "../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_Grid.h" + "../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" + "../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h" + "../../../../../modules/juce_gui_basics/layout/juce_SidePanel.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_SidePanel.h" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_Viewport.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h" + "../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h" + "../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h" + "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" + "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" + "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" + "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" + "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h" + "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h" + "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h" + "../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h" + "../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" + "../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h" + "../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" + "../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" + "../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h" + "../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" + "../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" + "../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" + "../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" + "../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" + "../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" + "../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm" + "../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h" + "../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" + "../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp" + "../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h" + "../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h" + "../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h" + "../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_Label.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h" + "../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_Slider.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h" + "../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h" + "../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h" + "../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h" + "../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_MessageBoxOptions.h" + "../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h" + "../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h" + "../../../../../modules/juce_gui_basics/juce_gui_basics.cpp" + "../../../../../modules/juce_gui_basics/juce_gui_basics.mm" + "../../../../../modules/juce_gui_basics/juce_gui_basics.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h" + "../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp" + "../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h" + "../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_HWNDComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h" + "../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h" + "../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h" + "../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.h" + "../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.h" + "../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h" + "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" + "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" + "../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" + "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" + "../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.mm" + "../../../../../modules/juce_gui_extra/juce_gui_extra.h" + "../../../JuceLibraryCode/JuceHeader.h" + PROPERTIES HEADER_FILE_ONLY TRUE) target_compile_options( ${BINARY_NAME} PRIVATE "-fsigned-char" [[-mfpu=neon]] [[-mfloat-abi=hard]] [[-ffast-math]] [[-funroll-loops]] [[--param]] [[max-unroll-times=8]] [[-mhard-float]] [[-D_NDK_MATH_NO_SOFTFP=1]] [[-DJUCE_DISABLE_ASSERTIONS=1]] ) diff --git a/extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml b/extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml index e25451f6..de6c234e 100644 --- a/extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml +++ b/extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml @@ -4,7 +4,7 @@ package="com.juce.audioperformancetest"> - + diff --git a/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile b/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile index 3c889e5f..aab5c6e1 100644 --- a/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile +++ b/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile @@ -11,6 +11,10 @@ endif # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ ifeq ($(CONFIG),Debug) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := AudioPerformanceTest JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,13 +60,13 @@ ifeq ($(CONFIG),Release) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := AudioPerformanceTest JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -73,6 +77,8 @@ OBJECTS_APP := \ $(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o \ $(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o \ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o \ $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o \ $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \ $(JUCE_OBJDIR)/include_juce_data_structures_7471b1e3.o \ @@ -86,8 +92,8 @@ OBJECTS_APP := \ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors alsa freetype2 libcurl + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors alsa freetype2 libcurl @echo Linking "AudioPerformanceTest - App" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) @@ -119,6 +125,16 @@ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o: ../../JuceLibraryCode/i @echo "Compiling include_juce_audio_processors.cpp" $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" +$(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o: ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_ara.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o: ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_lv2_libs.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o: ../../JuceLibraryCode/include_juce_audio_utils.cpp -$(V_AT)mkdir -p $(JUCE_OBJDIR) @echo "Compiling include_juce_audio_utils.cpp" diff --git a/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj b/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj index dd7d19f3..ead83b3a 100644 --- a/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj +++ b/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 01C9BC9A0A0F54B693CDA31A /* include_juce_audio_devices.mm */ = {isa = PBXBuildFile; fileRef = 322D3066DCD98A8D0542236A; }; 0319B40AD2FD96007FFA928B /* Cocoa.framework */ = {isa = PBXBuildFile; fileRef = 453777CEB7099A5D61901D13; }; 07451DA87757F9EF80E31BE8 /* Main.cpp */ = {isa = PBXBuildFile; fileRef = 0564535EEA7E4462926EA0C9; }; + 2028993D80CFDE5A0ABA4A52 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 932123993B04597421D5C406; }; 2BAED5B831BB736E77A718AE /* include_juce_audio_basics.mm */ = {isa = PBXBuildFile; fileRef = 89B3243200BAA6BD72905DBB; }; 30BE30F31D1AAED9FC893AA5 /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = 18C1CCE5684F9FA0478F27AD; }; 3825E8984D8F6AA00DDC6BAC /* DiscRecording.framework */ = {isa = PBXBuildFile; fileRef = EE758AD71415EB31BD3E82F3; }; @@ -20,10 +21,10 @@ 65FC2E13B65977FED63BDDE3 /* include_juce_graphics.mm */ = {isa = PBXBuildFile; fileRef = 7E951216B6138C76653B1460; }; 699954AF666E644C7B688381 /* include_juce_gui_basics.mm */ = {isa = PBXBuildFile; fileRef = 0BC3C6A4F4FC1DD30DD8E17C; }; 71863EE98034AB7C3CBCAA81 /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = 24D90B40648CC05A9B1AA55B; }; + 7BB1EEA0BB910DD93C1DBAD5 /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = CBD298606CB4777F17CFCC2F; }; 7E870C094BAE67D7EB149F1C /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 248FAA119A4FC24C522165EF; }; 8A0F71A4EEC7FE694352DD94 /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 9EADBF913B7A454B6BE93A4A; }; 9031C69145EE085B60904363 /* IOKit.framework */ = {isa = PBXBuildFile; fileRef = 43775DC3D9F7917846EA5327; }; - 9B19A6655FCC8086134C8656 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = 1DA5C6A474916745AFEC6DA5; }; 9D47995A33BBA693ED435B31 /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = B06AE97C86D27E7FEBCB4631; }; C7B090C29D8DE4D2503204B1 /* include_juce_audio_utils.mm */ = {isa = PBXBuildFile; fileRef = BAFDA8DE51E7A69E477439EB; }; CC782AABFA20787BABBCED90 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = E1BB9D521BF6C055F5B88628; }; @@ -42,7 +43,6 @@ 12C680C68A15B9A590264B18 /* CoreMIDI.framework */ /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; 18C1CCE5684F9FA0478F27AD /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 18E39207A0F5F9B8BC7EE94F /* include_juce_audio_processors.mm */ /* include_juce_audio_processors.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_processors.mm; path = ../../JuceLibraryCode/include_juce_audio_processors.mm; sourceTree = SOURCE_ROOT; }; - 1DA5C6A474916745AFEC6DA5 /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; 24425FFB0BCC7E54CADAA013 /* include_juce_core.mm */ /* include_juce_core.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_core.mm; path = ../../JuceLibraryCode/include_juce_core.mm; sourceTree = SOURCE_ROOT; }; 248FAA119A4FC24C522165EF /* include_juce_events.mm */ /* include_juce_events.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_events.mm; path = ../../JuceLibraryCode/include_juce_events.mm; sourceTree = SOURCE_ROOT; }; 24D90B40648CC05A9B1AA55B /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; @@ -60,6 +60,7 @@ 81017699F857F5BBFCA6E055 /* juce_events */ /* juce_events */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_events; path = ../../../../modules/juce_events; sourceTree = SOURCE_ROOT; }; 89B3243200BAA6BD72905DBB /* include_juce_audio_basics.mm */ /* include_juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_basics.mm; path = ../../JuceLibraryCode/include_juce_audio_basics.mm; sourceTree = SOURCE_ROOT; }; 920FF34D4A00A5AD433EE5F4 /* juce_audio_basics */ /* juce_audio_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_basics; path = ../../../../modules/juce_audio_basics; sourceTree = SOURCE_ROOT; }; + 932123993B04597421D5C406 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 9516A19EE58DED8326DD0306 /* Info-App.plist */ /* Info-App.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = SOURCE_ROOT; }; 9E05B63699A307598B66F829 /* include_juce_audio_formats.mm */ /* include_juce_audio_formats.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_formats.mm; path = ../../JuceLibraryCode/include_juce_audio_formats.mm; sourceTree = SOURCE_ROOT; }; 9EADBF913B7A454B6BE93A4A /* Accelerate.framework */ /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; @@ -70,6 +71,7 @@ BAFDA8DE51E7A69E477439EB /* include_juce_audio_utils.mm */ /* include_juce_audio_utils.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_utils.mm; path = ../../JuceLibraryCode/include_juce_audio_utils.mm; sourceTree = SOURCE_ROOT; }; C8EE61FDD1F06817A014B881 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; }; CBBC98B7CD350A07F5145FB4 /* juce_audio_utils */ /* juce_audio_utils */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_utils; path = ../../../../modules/juce_audio_utils; sourceTree = SOURCE_ROOT; }; + CBD298606CB4777F17CFCC2F /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; D03C9A859FB4DBA8268D7FBA /* juce_audio_processors */ /* juce_audio_processors */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_processors; path = ../../../../modules/juce_audio_processors; sourceTree = SOURCE_ROOT; }; E1BB9D521BF6C055F5B88628 /* Foundation.framework */ /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; E575FE2AD2F19FA6AEB536C2 /* juce_core */ /* juce_core */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_core; path = ../../../../modules/juce_core; sourceTree = SOURCE_ROOT; }; @@ -85,7 +87,6 @@ files = ( 8A0F71A4EEC7FE694352DD94, 30BE30F31D1AAED9FC893AA5, - 9B19A6655FCC8086134C8656, 0319B40AD2FD96007FFA928B, 5AFD011031C266431687C922, 71863EE98034AB7C3CBCAA81, @@ -106,7 +107,6 @@ children = ( 9EADBF913B7A454B6BE93A4A, 18C1CCE5684F9FA0478F27AD, - 1DA5C6A474916745AFEC6DA5, 453777CEB7099A5D61901D13, 9F28F179EF6B90EB9F4DBEE9, 24D90B40648CC05A9B1AA55B, @@ -127,6 +127,8 @@ 322D3066DCD98A8D0542236A, 9E05B63699A307598B66F829, 18E39207A0F5F9B8BC7EE94F, + CBD298606CB4777F17CFCC2F, + 932123993B04597421D5C406, BAFDA8DE51E7A69E477439EB, 24425FFB0BCC7E54CADAA013, EDD11E2CC0B18196ADA0C87B, @@ -230,7 +232,7 @@ 9CE2A44801B5B4BE7A9667DA = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { @@ -294,6 +296,8 @@ 01C9BC9A0A0F54B693CDA31A, 48ADBEF873A610909D727C97, D145903EE5DBFD1BD98423F3, + 7BB1EEA0BB910DD93C1DBAD5, + 2028993D80CFDE5A0ABA4A52, C7B090C29D8DE4D2503204B1, FFAF94080FF4A9995B33151E, D2CECF93178A1738DA02CA4A, @@ -325,7 +329,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -346,10 +350,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -362,6 +366,7 @@ INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest; PRODUCT_NAME = "AudioPerformanceTest"; USE_HEADERMAP = NO; @@ -387,7 +392,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -408,10 +413,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -425,6 +430,7 @@ LLVM_LTO = YES; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest; PRODUCT_NAME = "AudioPerformanceTest"; USE_HEADERMAP = NO; diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj index c44b7acf..b83b3b1d 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -77,7 +77,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPerformanceTest.exe @@ -105,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -118,7 +119,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPerformanceTest.exe @@ -152,13 +154,13 @@ true - + true - + true - + true @@ -269,7 +271,7 @@ true - + true @@ -638,6 +640,9 @@ true + + true + true @@ -671,6 +676,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -740,15 +862,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -782,6 +922,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -800,6 +958,9 @@ true + + true + true @@ -812,6 +973,12 @@ true + + true + + + true + true @@ -878,9 +1045,15 @@ true + + true + true + + true + true @@ -896,6 +1069,9 @@ true + + true + true @@ -962,6 +1138,9 @@ true + + true + true @@ -1829,6 +2008,9 @@ true + + true + true @@ -1856,9 +2038,6 @@ true - - true - true @@ -2084,7 +2263,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2135,6 +2318,7 @@ + @@ -2323,6 +2507,7 @@ + @@ -2335,6 +2520,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2400,9 +2655,14 @@ + + + + + @@ -2423,6 +2683,11 @@ + + + + + @@ -2430,6 +2695,8 @@ + + @@ -2461,6 +2728,7 @@ + @@ -2469,6 +2737,8 @@ + + @@ -2623,6 +2893,7 @@ + @@ -2821,6 +3092,7 @@ + @@ -2891,7 +3163,6 @@ - @@ -2902,6 +3173,7 @@ + diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters index e5ba0784..2c6f134f 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters @@ -140,6 +140,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -194,6 +320,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -454,13 +583,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -574,8 +703,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -949,6 +1078,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -985,6 +1117,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1054,6 +1303,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1063,9 +1318,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1099,6 +1366,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1117,6 +1402,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1132,6 +1420,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1213,9 +1507,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1231,6 +1531,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1297,6 +1600,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2203,6 +2509,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2239,9 +2548,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2518,6 +2824,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -2658,6 +2970,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3222,6 +3537,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3258,6 +3576,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3453,6 +3981,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3462,6 +3996,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3522,6 +4065,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3543,6 +4101,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -3636,6 +4200,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -3660,6 +4227,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4122,6 +4695,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -4716,6 +5292,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -4926,9 +5505,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -4955,6 +5531,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff --git a/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj b/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj index 30323f43..3ae8852f 100644 --- a/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj +++ b/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 01C9BC9A0A0F54B693CDA31A /* include_juce_audio_devices.mm */ = {isa = PBXBuildFile; fileRef = 322D3066DCD98A8D0542236A; }; 06735FD618809C6823B18CFA /* CoreServices.framework */ = {isa = PBXBuildFile; fileRef = 5622D2E05ACA8C4395206C56; }; 07451DA87757F9EF80E31BE8 /* Main.cpp */ = {isa = PBXBuildFile; fileRef = 0564535EEA7E4462926EA0C9; }; + 2028993D80CFDE5A0ABA4A52 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 932123993B04597421D5C406; }; 2BAED5B831BB736E77A718AE /* include_juce_audio_basics.mm */ = {isa = PBXBuildFile; fileRef = 89B3243200BAA6BD72905DBB; }; 30BE30F31D1AAED9FC893AA5 /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = 18C1CCE5684F9FA0478F27AD; }; 3C0CA1E555411B8B5B8F8FF0 /* LaunchScreen.storyboard */ = {isa = PBXBuildFile; fileRef = C8D9488DE9A88E4FBF28D417; }; @@ -20,6 +21,7 @@ 65FC2E13B65977FED63BDDE3 /* include_juce_graphics.mm */ = {isa = PBXBuildFile; fileRef = 7E951216B6138C76653B1460; }; 699954AF666E644C7B688381 /* include_juce_gui_basics.mm */ = {isa = PBXBuildFile; fileRef = 0BC3C6A4F4FC1DD30DD8E17C; }; 71863EE98034AB7C3CBCAA81 /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = 24D90B40648CC05A9B1AA55B; }; + 7BB1EEA0BB910DD93C1DBAD5 /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = CBD298606CB4777F17CFCC2F; }; 7E870C094BAE67D7EB149F1C /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 248FAA119A4FC24C522165EF; }; 893A86EF99F57B81286E58A1 /* CoreImage.framework */ = {isa = PBXBuildFile; fileRef = F40C1815F7E7E4FBAF3A3091; }; 8A0F71A4EEC7FE694352DD94 /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 9EADBF913B7A454B6BE93A4A; }; @@ -65,6 +67,7 @@ 8693552B5FA53C2003A66302 /* Images.xcassets */ /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AudioPerformanceTest/Images.xcassets; sourceTree = SOURCE_ROOT; }; 89B3243200BAA6BD72905DBB /* include_juce_audio_basics.mm */ /* include_juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_basics.mm; path = ../../JuceLibraryCode/include_juce_audio_basics.mm; sourceTree = SOURCE_ROOT; }; 920FF34D4A00A5AD433EE5F4 /* juce_audio_basics */ /* juce_audio_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_basics; path = ../../../../modules/juce_audio_basics; sourceTree = SOURCE_ROOT; }; + 932123993B04597421D5C406 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 9516A19EE58DED8326DD0306 /* Info-App.plist */ /* Info-App.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = SOURCE_ROOT; }; 9E05B63699A307598B66F829 /* include_juce_audio_formats.mm */ /* include_juce_audio_formats.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_formats.mm; path = ../../JuceLibraryCode/include_juce_audio_formats.mm; sourceTree = SOURCE_ROOT; }; 9EADBF913B7A454B6BE93A4A /* Accelerate.framework */ /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; @@ -77,6 +80,7 @@ C8D9488DE9A88E4FBF28D417 /* LaunchScreen.storyboard */ /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = LaunchScreen.storyboard; sourceTree = SOURCE_ROOT; }; C8EE61FDD1F06817A014B881 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; }; CBBC98B7CD350A07F5145FB4 /* juce_audio_utils */ /* juce_audio_utils */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_utils; path = ../../../../modules/juce_audio_utils; sourceTree = SOURCE_ROOT; }; + CBD298606CB4777F17CFCC2F /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; D03C9A859FB4DBA8268D7FBA /* juce_audio_processors */ /* juce_audio_processors */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_processors; path = ../../../../modules/juce_audio_processors; sourceTree = SOURCE_ROOT; }; E1BB9D521BF6C055F5B88628 /* Foundation.framework */ /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; E575FE2AD2F19FA6AEB536C2 /* juce_core */ /* juce_core */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_core; path = ../../../../modules/juce_core; sourceTree = SOURCE_ROOT; }; @@ -137,6 +141,8 @@ 322D3066DCD98A8D0542236A, 9E05B63699A307598B66F829, 18E39207A0F5F9B8BC7EE94F, + CBD298606CB4777F17CFCC2F, + 932123993B04597421D5C406, BAFDA8DE51E7A69E477439EB, 24425FFB0BCC7E54CADAA013, EDD11E2CC0B18196ADA0C87B, @@ -241,7 +247,7 @@ 9CE2A44801B5B4BE7A9667DA = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { @@ -306,6 +312,8 @@ 01C9BC9A0A0F54B693CDA31A, 48ADBEF873A610909D727C97, D145903EE5DBFD1BD98423F3, + 7BB1EEA0BB910DD93C1DBAD5, + 2028993D80CFDE5A0ABA4A52, C7B090C29D8DE4D2503204B1, FFAF94080FF4A9995B33151E, D2CECF93178A1738DA02CA4A, @@ -338,7 +346,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -359,10 +367,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -374,6 +382,7 @@ INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest; PRODUCT_NAME = "AudioPerformanceTest"; USE_HEADERMAP = NO; @@ -399,7 +408,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -420,10 +429,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -436,6 +445,7 @@ INSTALL_PATH = "$(HOME)/Applications"; LLVM_LTO = YES; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest; PRODUCT_NAME = "AudioPerformanceTest"; USE_HEADERMAP = NO; diff --git a/extras/AudioPerformanceTest/CMakeLists.txt b/extras/AudioPerformanceTest/CMakeLists.txt index e575c295..e6178ad1 100644 --- a/extras/AudioPerformanceTest/CMakeLists.txt +++ b/extras/AudioPerformanceTest/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_ara.cpp b/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_ara.cpp new file mode 100644 index 00000000..e0c34d43 --- /dev/null +++ b/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_ara.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp b/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp new file mode 100644 index 00000000..64b4d5f4 --- /dev/null +++ b/extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/extras/AudioPerformanceTest/Source/Main.cpp b/extras/AudioPerformanceTest/Source/Main.cpp index b99329a1..292f9efe 100644 --- a/extras/AudioPerformanceTest/Source/Main.cpp +++ b/extras/AudioPerformanceTest/Source/Main.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/AudioPerformanceTest/Source/MainComponent.h b/extras/AudioPerformanceTest/Source/MainComponent.h index 542ccab6..8785b1cd 100644 --- a/extras/AudioPerformanceTest/Source/MainComponent.h +++ b/extras/AudioPerformanceTest/Source/MainComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/AudioPluginHost/AudioPluginHost.jucer b/extras/AudioPluginHost/AudioPluginHost.jucer index d8961520..09277e3d 100644 --- a/extras/AudioPluginHost/AudioPluginHost.jucer +++ b/extras/AudioPluginHost/AudioPluginHost.jucer @@ -54,29 +54,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -203,6 +180,8 @@ + + + JUCE_PLUGINHOST_VST3="1" JUCE_PLUGINHOST_LADSPA="1" JUCE_PLUGINHOST_LV2="1"/> @@ -260,5 +239,7 @@ + + diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt index 132b0f8c..0c74a7b7 100644 --- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt +++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt @@ -15,6 +15,14 @@ set_source_files_properties("${ANDROID_NDK}/sources/android/cpufeatures/cpu-feat add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]]) include_directories( AFTER + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK" "../../../JuceLibraryCode" "../../../../../modules" @@ -24,9 +32,9 @@ include_directories( AFTER enable_language(ASM) if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60106]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60106]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) if(NOT (ANDROID_ABI STREQUAL "mips" OR ANDROID_ABI STREQUAL "mips64")) set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto") @@ -40,6 +48,8 @@ add_library( ${BINARY_NAME} SHARED + "../../../Source/Plugins/ARAPlugin.cpp" + "../../../Source/Plugins/ARAPlugin.h" "../../../Source/Plugins/InternalPlugins.cpp" "../../../Source/Plugins/InternalPlugins.h" "../../../Source/Plugins/IOConfigurationWindow.cpp" @@ -70,6 +80,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" @@ -84,7 +95,6 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" - "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" @@ -121,6 +131,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" + "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h" "../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" @@ -163,9 +174,9 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp" "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" - "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" @@ -459,6 +470,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.h" "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" @@ -483,6 +496,116 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" @@ -580,16 +703,27 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.h" "../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" "../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" "../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" "../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" @@ -618,6 +752,17 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h" "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" @@ -631,6 +776,9 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" "../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" @@ -641,6 +789,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" @@ -692,9 +842,12 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/containers/juce_HashMap.h" "../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" "../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" + "../../../../../modules/juce_core/containers/juce_ListenerList.cpp" "../../../../../modules/juce_core/containers/juce_ListenerList.h" "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" "../../../../../modules/juce_core/containers/juce_NamedValueSet.h" + "../../../../../modules/juce_core/containers/juce_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.h" "../../../../../modules/juce_core/containers/juce_PropertySet.cpp" @@ -708,6 +861,9 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/containers/juce_SparseSet.h" "../../../../../modules/juce_core/containers/juce_Variant.cpp" "../../../../../modules/juce_core/containers/juce_Variant.h" + "../../../../../modules/juce_core/files/juce_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.h" "../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" "../../../../../modules/juce_core/files/juce_DirectoryIterator.h" "../../../../../modules/juce_core/files/juce_File.cpp" @@ -774,6 +930,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/misc/juce_Uuid.h" "../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" "../../../../../modules/juce_core/native/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" "../../../../../modules/juce_core/native/juce_android_Files.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" @@ -1085,6 +1242,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_events/native/juce_android_Messaging.cpp" "../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" "../../../../../modules/juce_events/native/juce_linux_EventLoop.h" + "../../../../../modules/juce_events/native/juce_linux_EventLoopInternal.h" "../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" "../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" "../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" @@ -1467,6 +1625,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" "../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" @@ -1498,13 +1657,13 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" "../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" "../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" - "../../../../../modules/juce_gui_basics/native/juce_common_MimeTypes.cpp" "../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" "../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" "../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" "../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" "../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" "../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" "../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" "../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" "../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" @@ -1647,7 +1806,6 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" "../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" "../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" - "../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" "../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" @@ -1704,6 +1862,8 @@ add_library( ${BINARY_NAME} "../../../JuceLibraryCode/include_juce_audio_devices.cpp" "../../../JuceLibraryCode/include_juce_audio_formats.cpp" "../../../JuceLibraryCode/include_juce_audio_processors.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_ara.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp" "../../../JuceLibraryCode/include_juce_audio_utils.cpp" "../../../JuceLibraryCode/include_juce_core.cpp" "../../../JuceLibraryCode/include_juce_cryptography.cpp" @@ -1717,1669 +1877,1820 @@ add_library( ${BINARY_NAME} "../../../JuceLibraryCode/JuceHeader.h" ) -set_source_files_properties("../../../Source/Plugins/InternalPlugins.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/Plugins/IOConfigurationWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/Plugins/PluginGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/UI/GraphEditorPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/UI/MainHostWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/UI/PluginWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/JUCEAppIcon.png" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../examples/Assets/cassette_recorder.wav" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../examples/Assets/cello.wav" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../examples/Assets/guitar_amp.wav" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../examples/Assets/proaudio.path" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../examples/Assets/reverb_ir.wav" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../examples/Assets/singing.ogg" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Bela.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/assert.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/callback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/compat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/export.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterfunctionname.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_MathsFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_NormalisableRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Range.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Atomic.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Reservoir.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Functional.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/java/README.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Misc.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_curl_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_intel_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_CFHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Files.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Network.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Strings.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Registry.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerSupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerWarnings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_PlatformDefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_StandardHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_TargetPlatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_NewLine.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringRef.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_CriticalSection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_DynamicLibrary.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_InterProcessLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Process.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedReadLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_SpinLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTestCategories.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/adler32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/compress.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/infback.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/uncompr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.in.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zlib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_BlowFish.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_BlowFish.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_Primes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_Primes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_RSAKey.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_RSAKey.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_MD5.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_MD5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_SHA256.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_SHA256.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_AudioBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_AudioBlock_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister_Impl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Windowing.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_FastMathApproximations.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LogRampedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LogRampedValue_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LookupTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LookupTable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Phase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Polynomial.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DelayLine.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DelayLine.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DryWetMixer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_DryWetMixer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter_Impl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Panner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Panner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Bias.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Chorus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Chorus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Compressor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Compressor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Gain.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_LadderFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_LadderFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Limiter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Limiter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_NoiseGate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_NoiseGate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Oscillator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Phaser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Phaser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/widgets/juce_WaveShaper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Initialisation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Message.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_NotificationType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_android_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_EventLoop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_PixelFormats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_BorderSize.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Line.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Parallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Point.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ScaledImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_Justification.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_common_MimeTypes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_MessageBoxOptions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_HWNDComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Draggable3DOrientation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Matrix3D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Quaternion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Vector3D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_android.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_ios.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_linux_X11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_osx.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_win32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGLExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gl.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gles2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gles2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_khrplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_wgl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../JuceLibraryCode/BinaryData.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../JuceLibraryCode/JuceHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties( + "../../../Source/Plugins/ARAPlugin.h" + "../../../Source/Plugins/InternalPlugins.h" + "../../../Source/Plugins/IOConfigurationWindow.h" + "../../../Source/Plugins/PluginGraph.h" + "../../../Source/UI/GraphEditorPanel.h" + "../../../Source/UI/MainHostWindow.h" + "../../../Source/UI/PluginWindow.h" + "../../../Source/JUCEAppIcon.png" + "../../../../../examples/Assets/cassette_recorder.wav" + "../../../../../examples/Assets/cello.wav" + "../../../../../examples/Assets/guitar_amp.wav" + "../../../../../examples/Assets/proaudio.path" + "../../../../../examples/Assets/reverb_ir.wav" + "../../../../../examples/Assets/singing.ogg" + "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" + "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiFile.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiFile.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPENote.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPENote.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" + "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" + "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h" + "../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h" + "../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" + "../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" + "../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" + "../../../../../modules/juce_audio_basics/utilities/juce_ADSR_test.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" + "../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" + "../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" + "../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" + "../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.mm" + "../../../../../modules/juce_audio_basics/juce_audio_basics.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" + "../../../../../modules/juce_audio_devices/native/oboe/README.md" + "../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" + "../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp" + "../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_ios_Audio.h" + "../../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp" + "../../../../../modules/juce_audio_devices/native/juce_linux_Bela.cpp" + "../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" + "../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" + "../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" + "../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" + "../../../../../modules/juce_audio_devices/native/juce_win32_Midi.cpp" + "../../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp" + "../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp" + "../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h" + "../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp" + "../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h" + "../../../../../modules/juce_audio_devices/juce_audio_devices.cpp" + "../../../../../modules/juce_audio_devices/juce_audio_devices.mm" + "../../../../../modules/juce_audio_devices/juce_audio_devices.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/assert.h" + "../../../../../modules/juce_audio_formats/codecs/flac/callback.h" + "../../../../../modules/juce_audio_formats/codecs/flac/compat.h" + "../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" + "../../../../../modules/juce_audio_formats/codecs/flac/export.h" + "../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/flac/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h" + "../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.h" + "../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp" + "../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h" + "../../../../../modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h" + "../../../../../modules/juce_audio_formats/sampler/juce_Sampler.cpp" + "../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" + "../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" + "../../../../../modules/juce_audio_formats/juce_audio_formats.mm" + "../../../../../modules/juce_audio_formats/juce_audio_formats.h" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterfunctionname.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.h" + "../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" + "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" + "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" + "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" + "../../../../../modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h" + "../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.h" + "../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp" + "../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" + "../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" + "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.h" + "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" + "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" + "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" + "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" + "../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" + "../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" + "../../../../../modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm" + "../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm" + "../../../../../modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm" + "../../../../../modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp" + "../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp" + "../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h" + "../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.cpp" + "../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.h" + "../../../../../modules/juce_audio_utils/juce_audio_utils.cpp" + "../../../../../modules/juce_audio_utils/juce_audio_utils.mm" + "../../../../../modules/juce_audio_utils/juce_audio_utils.h" + "../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp" + "../../../../../modules/juce_core/containers/juce_AbstractFifo.h" + "../../../../../modules/juce_core/containers/juce_Array.h" + "../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" + "../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" + "../../../../../modules/juce_core/containers/juce_ArrayBase.h" + "../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" + "../../../../../modules/juce_core/containers/juce_DynamicObject.h" + "../../../../../modules/juce_core/containers/juce_ElementComparator.h" + "../../../../../modules/juce_core/containers/juce_HashMap.h" + "../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" + "../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" + "../../../../../modules/juce_core/containers/juce_ListenerList.cpp" + "../../../../../modules/juce_core/containers/juce_ListenerList.h" + "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" + "../../../../../modules/juce_core/containers/juce_NamedValueSet.h" + "../../../../../modules/juce_core/containers/juce_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" + "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" + "../../../../../modules/juce_core/containers/juce_OwnedArray.h" + "../../../../../modules/juce_core/containers/juce_PropertySet.cpp" + "../../../../../modules/juce_core/containers/juce_PropertySet.h" + "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" + "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" + "../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" + "../../../../../modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h" + "../../../../../modules/juce_core/containers/juce_SortedSet.h" + "../../../../../modules/juce_core/containers/juce_SparseSet.cpp" + "../../../../../modules/juce_core/containers/juce_SparseSet.h" + "../../../../../modules/juce_core/containers/juce_Variant.cpp" + "../../../../../modules/juce_core/containers/juce_Variant.h" + "../../../../../modules/juce_core/files/juce_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.h" + "../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_DirectoryIterator.h" + "../../../../../modules/juce_core/files/juce_File.cpp" + "../../../../../modules/juce_core/files/juce_File.h" + "../../../../../modules/juce_core/files/juce_FileFilter.cpp" + "../../../../../modules/juce_core/files/juce_FileFilter.h" + "../../../../../modules/juce_core/files/juce_FileInputStream.cpp" + "../../../../../modules/juce_core/files/juce_FileInputStream.h" + "../../../../../modules/juce_core/files/juce_FileOutputStream.cpp" + "../../../../../modules/juce_core/files/juce_FileOutputStream.h" + "../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" + "../../../../../modules/juce_core/files/juce_FileSearchPath.h" + "../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" + "../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" + "../../../../../modules/juce_core/files/juce_TemporaryFile.h" + "../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" + "../../../../../modules/juce_core/files/juce_WildcardFileFilter.h" + "../../../../../modules/juce_core/javascript/juce_Javascript.cpp" + "../../../../../modules/juce_core/javascript/juce_Javascript.h" + "../../../../../modules/juce_core/javascript/juce_JSON.cpp" + "../../../../../modules/juce_core/javascript/juce_JSON.h" + "../../../../../modules/juce_core/logging/juce_FileLogger.cpp" + "../../../../../modules/juce_core/logging/juce_FileLogger.h" + "../../../../../modules/juce_core/logging/juce_Logger.cpp" + "../../../../../modules/juce_core/logging/juce_Logger.h" + "../../../../../modules/juce_core/maths/juce_BigInteger.cpp" + "../../../../../modules/juce_core/maths/juce_BigInteger.h" + "../../../../../modules/juce_core/maths/juce_Expression.cpp" + "../../../../../modules/juce_core/maths/juce_Expression.h" + "../../../../../modules/juce_core/maths/juce_MathsFunctions.h" + "../../../../../modules/juce_core/maths/juce_NormalisableRange.h" + "../../../../../modules/juce_core/maths/juce_Random.cpp" + "../../../../../modules/juce_core/maths/juce_Random.h" + "../../../../../modules/juce_core/maths/juce_Range.h" + "../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h" + "../../../../../modules/juce_core/memory/juce_AllocationHooks.cpp" + "../../../../../modules/juce_core/memory/juce_AllocationHooks.h" + "../../../../../modules/juce_core/memory/juce_Atomic.h" + "../../../../../modules/juce_core/memory/juce_ByteOrder.h" + "../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" + "../../../../../modules/juce_core/memory/juce_HeapBlock.h" + "../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" + "../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" + "../../../../../modules/juce_core/memory/juce_Memory.h" + "../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" + "../../../../../modules/juce_core/memory/juce_MemoryBlock.h" + "../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h" + "../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h" + "../../../../../modules/juce_core/memory/juce_Reservoir.h" + "../../../../../modules/juce_core/memory/juce_ScopedPointer.h" + "../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" + "../../../../../modules/juce_core/memory/juce_Singleton.h" + "../../../../../modules/juce_core/memory/juce_WeakReference.h" + "../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" + "../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" + "../../../../../modules/juce_core/misc/juce_Functional.h" + "../../../../../modules/juce_core/misc/juce_Result.cpp" + "../../../../../modules/juce_core/misc/juce_Result.h" + "../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" + "../../../../../modules/juce_core/misc/juce_RuntimePermissions.h" + "../../../../../modules/juce_core/misc/juce_Uuid.cpp" + "../../../../../modules/juce_core/misc/juce_Uuid.h" + "../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" + "../../../../../modules/juce_core/native/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" + "../../../../../modules/juce_core/native/juce_android_Files.cpp" + "../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" + "../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" + "../../../../../modules/juce_core/native/juce_android_Misc.cpp" + "../../../../../modules/juce_core/native/juce_android_Network.cpp" + "../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp" + "../../../../../modules/juce_core/native/juce_android_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_android_Threads.cpp" + "../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h" + "../../../../../modules/juce_core/native/juce_curl_Network.cpp" + "../../../../../modules/juce_core/native/juce_intel_SharedCode.h" + "../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp" + "../../../../../modules/juce_core/native/juce_linux_Files.cpp" + "../../../../../modules/juce_core/native/juce_linux_Network.cpp" + "../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_linux_Threads.cpp" + "../../../../../modules/juce_core/native/juce_mac_CFHelpers.h" + "../../../../../modules/juce_core/native/juce_mac_Files.mm" + "../../../../../modules/juce_core/native/juce_mac_Network.mm" + "../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" + "../../../../../modules/juce_core/native/juce_mac_Strings.mm" + "../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" + "../../../../../modules/juce_core/native/juce_mac_Threads.mm" + "../../../../../modules/juce_core/native/juce_posix_IPAddress.h" + "../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" + "../../../../../modules/juce_core/native/juce_posix_SharedCode.h" + "../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" + "../../../../../modules/juce_core/native/juce_win32_Files.cpp" + "../../../../../modules/juce_core/native/juce_win32_Network.cpp" + "../../../../../modules/juce_core/native/juce_win32_Registry.cpp" + "../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_win32_Threads.cpp" + "../../../../../modules/juce_core/network/juce_IPAddress.cpp" + "../../../../../modules/juce_core/network/juce_IPAddress.h" + "../../../../../modules/juce_core/network/juce_MACAddress.cpp" + "../../../../../modules/juce_core/network/juce_MACAddress.h" + "../../../../../modules/juce_core/network/juce_NamedPipe.cpp" + "../../../../../modules/juce_core/network/juce_NamedPipe.h" + "../../../../../modules/juce_core/network/juce_Socket.cpp" + "../../../../../modules/juce_core/network/juce_Socket.h" + "../../../../../modules/juce_core/network/juce_URL.cpp" + "../../../../../modules/juce_core/network/juce_URL.h" + "../../../../../modules/juce_core/network/juce_WebInputStream.cpp" + "../../../../../modules/juce_core/network/juce_WebInputStream.h" + "../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp" + "../../../../../modules/juce_core/streams/juce_BufferedInputStream.h" + "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp" + "../../../../../modules/juce_core/streams/juce_FileInputSource.h" + "../../../../../modules/juce_core/streams/juce_InputSource.h" + "../../../../../modules/juce_core/streams/juce_InputStream.cpp" + "../../../../../modules/juce_core/streams/juce_InputStream.h" + "../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp" + "../../../../../modules/juce_core/streams/juce_MemoryInputStream.h" + "../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp" + "../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h" + "../../../../../modules/juce_core/streams/juce_OutputStream.cpp" + "../../../../../modules/juce_core/streams/juce_OutputStream.h" + "../../../../../modules/juce_core/streams/juce_SubregionStream.cpp" + "../../../../../modules/juce_core/streams/juce_SubregionStream.h" + "../../../../../modules/juce_core/streams/juce_URLInputSource.cpp" + "../../../../../modules/juce_core/streams/juce_URLInputSource.h" + "../../../../../modules/juce_core/system/juce_CompilerSupport.h" + "../../../../../modules/juce_core/system/juce_CompilerWarnings.h" + "../../../../../modules/juce_core/system/juce_PlatformDefs.h" + "../../../../../modules/juce_core/system/juce_StandardHeader.h" + "../../../../../modules/juce_core/system/juce_SystemStats.cpp" + "../../../../../modules/juce_core/system/juce_SystemStats.h" + "../../../../../modules/juce_core/system/juce_TargetPlatform.h" + "../../../../../modules/juce_core/text/juce_Base64.cpp" + "../../../../../modules/juce_core/text/juce_Base64.h" + "../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp" + "../../../../../modules/juce_core/text/juce_CharacterFunctions.h" + "../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h" + "../../../../../modules/juce_core/text/juce_Identifier.cpp" + "../../../../../modules/juce_core/text/juce_Identifier.h" + "../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp" + "../../../../../modules/juce_core/text/juce_LocalisedStrings.h" + "../../../../../modules/juce_core/text/juce_NewLine.h" + "../../../../../modules/juce_core/text/juce_String.cpp" + "../../../../../modules/juce_core/text/juce_String.h" + "../../../../../modules/juce_core/text/juce_StringArray.cpp" + "../../../../../modules/juce_core/text/juce_StringArray.h" + "../../../../../modules/juce_core/text/juce_StringPairArray.cpp" + "../../../../../modules/juce_core/text/juce_StringPairArray.h" + "../../../../../modules/juce_core/text/juce_StringPool.cpp" + "../../../../../modules/juce_core/text/juce_StringPool.h" + "../../../../../modules/juce_core/text/juce_StringRef.h" + "../../../../../modules/juce_core/text/juce_TextDiff.cpp" + "../../../../../modules/juce_core/text/juce_TextDiff.h" + "../../../../../modules/juce_core/threads/juce_ChildProcess.cpp" + "../../../../../modules/juce_core/threads/juce_ChildProcess.h" + "../../../../../modules/juce_core/threads/juce_CriticalSection.h" + "../../../../../modules/juce_core/threads/juce_DynamicLibrary.h" + "../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp" + "../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h" + "../../../../../modules/juce_core/threads/juce_InterProcessLock.h" + "../../../../../modules/juce_core/threads/juce_Process.h" + "../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp" + "../../../../../modules/juce_core/threads/juce_ReadWriteLock.h" + "../../../../../modules/juce_core/threads/juce_ScopedLock.h" + "../../../../../modules/juce_core/threads/juce_ScopedReadLock.h" + "../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h" + "../../../../../modules/juce_core/threads/juce_SpinLock.h" + "../../../../../modules/juce_core/threads/juce_Thread.cpp" + "../../../../../modules/juce_core/threads/juce_Thread.h" + "../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h" + "../../../../../modules/juce_core/threads/juce_ThreadPool.cpp" + "../../../../../modules/juce_core/threads/juce_ThreadPool.h" + "../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp" + "../../../../../modules/juce_core/threads/juce_TimeSliceThread.h" + "../../../../../modules/juce_core/threads/juce_WaitableEvent.cpp" + "../../../../../modules/juce_core/threads/juce_WaitableEvent.h" + "../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp" + "../../../../../modules/juce_core/time/juce_PerformanceCounter.h" + "../../../../../modules/juce_core/time/juce_RelativeTime.cpp" + "../../../../../modules/juce_core/time/juce_RelativeTime.h" + "../../../../../modules/juce_core/time/juce_Time.cpp" + "../../../../../modules/juce_core/time/juce_Time.h" + "../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp" + "../../../../../modules/juce_core/unit_tests/juce_UnitTest.h" + "../../../../../modules/juce_core/unit_tests/juce_UnitTestCategories.h" + "../../../../../modules/juce_core/xml/juce_XmlDocument.cpp" + "../../../../../modules/juce_core/xml/juce_XmlDocument.h" + "../../../../../modules/juce_core/xml/juce_XmlElement.cpp" + "../../../../../modules/juce_core/xml/juce_XmlElement.h" + "../../../../../modules/juce_core/zip/zlib/adler32.c" + "../../../../../modules/juce_core/zip/zlib/compress.c" + "../../../../../modules/juce_core/zip/zlib/crc32.c" + "../../../../../modules/juce_core/zip/zlib/crc32.h" + "../../../../../modules/juce_core/zip/zlib/deflate.c" + "../../../../../modules/juce_core/zip/zlib/deflate.h" + "../../../../../modules/juce_core/zip/zlib/infback.c" + "../../../../../modules/juce_core/zip/zlib/inffast.c" + "../../../../../modules/juce_core/zip/zlib/inffast.h" + "../../../../../modules/juce_core/zip/zlib/inffixed.h" + "../../../../../modules/juce_core/zip/zlib/inflate.c" + "../../../../../modules/juce_core/zip/zlib/inflate.h" + "../../../../../modules/juce_core/zip/zlib/inftrees.c" + "../../../../../modules/juce_core/zip/zlib/inftrees.h" + "../../../../../modules/juce_core/zip/zlib/trees.c" + "../../../../../modules/juce_core/zip/zlib/trees.h" + "../../../../../modules/juce_core/zip/zlib/uncompr.c" + "../../../../../modules/juce_core/zip/zlib/zconf.h" + "../../../../../modules/juce_core/zip/zlib/zconf.in.h" + "../../../../../modules/juce_core/zip/zlib/zlib.h" + "../../../../../modules/juce_core/zip/zlib/zutil.c" + "../../../../../modules/juce_core/zip/zlib/zutil.h" + "../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp" + "../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h" + "../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp" + "../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h" + "../../../../../modules/juce_core/zip/juce_ZipFile.cpp" + "../../../../../modules/juce_core/zip/juce_ZipFile.h" + "../../../../../modules/juce_core/juce_core.cpp" + "../../../../../modules/juce_core/juce_core.mm" + "../../../../../modules/juce_core/juce_core.h" + "../../../../../modules/juce_cryptography/encryption/juce_BlowFish.cpp" + "../../../../../modules/juce_cryptography/encryption/juce_BlowFish.h" + "../../../../../modules/juce_cryptography/encryption/juce_Primes.cpp" + "../../../../../modules/juce_cryptography/encryption/juce_Primes.h" + "../../../../../modules/juce_cryptography/encryption/juce_RSAKey.cpp" + "../../../../../modules/juce_cryptography/encryption/juce_RSAKey.h" + "../../../../../modules/juce_cryptography/hashing/juce_MD5.cpp" + "../../../../../modules/juce_cryptography/hashing/juce_MD5.h" + "../../../../../modules/juce_cryptography/hashing/juce_SHA256.cpp" + "../../../../../modules/juce_cryptography/hashing/juce_SHA256.h" + "../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.cpp" + "../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.h" + "../../../../../modules/juce_cryptography/juce_cryptography.cpp" + "../../../../../modules/juce_cryptography/juce_cryptography.mm" + "../../../../../modules/juce_cryptography/juce_cryptography.h" + "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp" + "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" + "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" + "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" + "../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp" + "../../../../../modules/juce_data_structures/values/juce_CachedValue.h" + "../../../../../modules/juce_data_structures/values/juce_Value.cpp" + "../../../../../modules/juce_data_structures/values/juce_Value.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTree.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" + "../../../../../modules/juce_data_structures/juce_data_structures.cpp" + "../../../../../modules/juce_data_structures/juce_data_structures.mm" + "../../../../../modules/juce_data_structures/juce_data_structures.h" + "../../../../../modules/juce_dsp/containers/juce_AudioBlock.h" + "../../../../../modules/juce_dsp/containers/juce_AudioBlock_test.cpp" + "../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction.h" + "../../../../../modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp" + "../../../../../modules/juce_dsp/containers/juce_SIMDRegister.h" + "../../../../../modules/juce_dsp/containers/juce_SIMDRegister_Impl.h" + "../../../../../modules/juce_dsp/containers/juce_SIMDRegister_test.cpp" + "../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.cpp" + "../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.h" + "../../../../../modules/juce_dsp/frequency/juce_Convolution.cpp" + "../../../../../modules/juce_dsp/frequency/juce_Convolution.h" + "../../../../../modules/juce_dsp/frequency/juce_Convolution_test.cpp" + "../../../../../modules/juce_dsp/frequency/juce_FFT.cpp" + "../../../../../modules/juce_dsp/frequency/juce_FFT.h" + "../../../../../modules/juce_dsp/frequency/juce_FFT_test.cpp" + "../../../../../modules/juce_dsp/frequency/juce_Windowing.cpp" + "../../../../../modules/juce_dsp/frequency/juce_Windowing.h" + "../../../../../modules/juce_dsp/maths/juce_FastMathApproximations.h" + "../../../../../modules/juce_dsp/maths/juce_LogRampedValue.h" + "../../../../../modules/juce_dsp/maths/juce_LogRampedValue_test.cpp" + "../../../../../modules/juce_dsp/maths/juce_LookupTable.cpp" + "../../../../../modules/juce_dsp/maths/juce_LookupTable.h" + "../../../../../modules/juce_dsp/maths/juce_Matrix.cpp" + "../../../../../modules/juce_dsp/maths/juce_Matrix.h" + "../../../../../modules/juce_dsp/maths/juce_Matrix_test.cpp" + "../../../../../modules/juce_dsp/maths/juce_Phase.h" + "../../../../../modules/juce_dsp/maths/juce_Polynomial.h" + "../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.cpp" + "../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.h" + "../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp" + "../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.h" + "../../../../../modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h" + "../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp" + "../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.h" + "../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp" + "../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.h" + "../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_BallisticsFilter.h" + "../../../../../modules/juce_dsp/processors/juce_DelayLine.cpp" + "../../../../../modules/juce_dsp/processors/juce_DelayLine.h" + "../../../../../modules/juce_dsp/processors/juce_DryWetMixer.cpp" + "../../../../../modules/juce_dsp/processors/juce_DryWetMixer.h" + "../../../../../modules/juce_dsp/processors/juce_FIRFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_FIRFilter.h" + "../../../../../modules/juce_dsp/processors/juce_FIRFilter_test.cpp" + "../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h" + "../../../../../modules/juce_dsp/processors/juce_IIRFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_IIRFilter.h" + "../../../../../modules/juce_dsp/processors/juce_IIRFilter_Impl.h" + "../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h" + "../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp" + "../../../../../modules/juce_dsp/processors/juce_Oversampling.h" + "../../../../../modules/juce_dsp/processors/juce_Panner.cpp" + "../../../../../modules/juce_dsp/processors/juce_Panner.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessContext.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp" + "../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h" + "../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h" + "../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_StateVariableTPTFilter.h" + "../../../../../modules/juce_dsp/widgets/juce_Bias.h" + "../../../../../modules/juce_dsp/widgets/juce_Chorus.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Chorus.h" + "../../../../../modules/juce_dsp/widgets/juce_Compressor.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Compressor.h" + "../../../../../modules/juce_dsp/widgets/juce_Gain.h" + "../../../../../modules/juce_dsp/widgets/juce_LadderFilter.cpp" + "../../../../../modules/juce_dsp/widgets/juce_LadderFilter.h" + "../../../../../modules/juce_dsp/widgets/juce_Limiter.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Limiter.h" + "../../../../../modules/juce_dsp/widgets/juce_NoiseGate.cpp" + "../../../../../modules/juce_dsp/widgets/juce_NoiseGate.h" + "../../../../../modules/juce_dsp/widgets/juce_Oscillator.h" + "../../../../../modules/juce_dsp/widgets/juce_Phaser.cpp" + "../../../../../modules/juce_dsp/widgets/juce_Phaser.h" + "../../../../../modules/juce_dsp/widgets/juce_Reverb.h" + "../../../../../modules/juce_dsp/widgets/juce_WaveShaper.h" + "../../../../../modules/juce_dsp/juce_dsp.cpp" + "../../../../../modules/juce_dsp/juce_dsp.mm" + "../../../../../modules/juce_dsp/juce_dsp.h" + "../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" + "../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" + "../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" + "../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp" + "../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h" + "../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp" + "../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h" + "../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h" + "../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp" + "../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" + "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" + "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" + "../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" + "../../../../../modules/juce_events/messages/juce_ApplicationBase.h" + "../../../../../modules/juce_events/messages/juce_CallbackMessage.h" + "../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp" + "../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h" + "../../../../../modules/juce_events/messages/juce_Initialisation.h" + "../../../../../modules/juce_events/messages/juce_Message.h" + "../../../../../modules/juce_events/messages/juce_MessageListener.cpp" + "../../../../../modules/juce_events/messages/juce_MessageListener.h" + "../../../../../modules/juce_events/messages/juce_MessageManager.cpp" + "../../../../../modules/juce_events/messages/juce_MessageManager.h" + "../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h" + "../../../../../modules/juce_events/messages/juce_NotificationType.h" + "../../../../../modules/juce_events/native/juce_android_Messaging.cpp" + "../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" + "../../../../../modules/juce_events/native/juce_linux_EventLoop.h" + "../../../../../modules/juce_events/native/juce_linux_EventLoopInternal.h" + "../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" + "../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" + "../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" + "../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp" + "../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h" + "../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h" + "../../../../../modules/juce_events/native/juce_win32_Messaging.cpp" + "../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp" + "../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h" + "../../../../../modules/juce_events/timers/juce_MultiTimer.cpp" + "../../../../../modules/juce_events/timers/juce_MultiTimer.h" + "../../../../../modules/juce_events/timers/juce_Timer.cpp" + "../../../../../modules/juce_events/timers/juce_Timer.h" + "../../../../../modules/juce_events/juce_events.cpp" + "../../../../../modules/juce_events/juce_events.mm" + "../../../../../modules/juce_events/juce_events.h" + "../../../../../modules/juce_graphics/colour/juce_Colour.cpp" + "../../../../../modules/juce_graphics/colour/juce_Colour.h" + "../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp" + "../../../../../modules/juce_graphics/colour/juce_ColourGradient.h" + "../../../../../modules/juce_graphics/colour/juce_Colours.cpp" + "../../../../../modules/juce_graphics/colour/juce_Colours.h" + "../../../../../modules/juce_graphics/colour/juce_FillType.cpp" + "../../../../../modules/juce_graphics/colour/juce_FillType.h" + "../../../../../modules/juce_graphics/colour/juce_PixelFormats.h" + "../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp" + "../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" + "../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp" + "../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h" + "../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp" + "../../../../../modules/juce_graphics/effects/juce_GlowEffect.h" + "../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h" + "../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp" + "../../../../../modules/juce_graphics/fonts/juce_AttributedString.h" + "../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp" + "../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h" + "../../../../../modules/juce_graphics/fonts/juce_Font.cpp" + "../../../../../modules/juce_graphics/fonts/juce_Font.h" + "../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp" + "../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h" + "../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp" + "../../../../../modules/juce_graphics/fonts/juce_TextLayout.h" + "../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp" + "../../../../../modules/juce_graphics/fonts/juce_Typeface.h" + "../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp" + "../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h" + "../../../../../modules/juce_graphics/geometry/juce_BorderSize.h" + "../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp" + "../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h" + "../../../../../modules/juce_graphics/geometry/juce_Line.h" + "../../../../../modules/juce_graphics/geometry/juce_Parallelogram.h" + "../../../../../modules/juce_graphics/geometry/juce_Path.cpp" + "../../../../../modules/juce_graphics/geometry/juce_Path.h" + "../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp" + "../../../../../modules/juce_graphics/geometry/juce_PathIterator.h" + "../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp" + "../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h" + "../../../../../modules/juce_graphics/geometry/juce_Point.h" + "../../../../../modules/juce_graphics/geometry/juce_Rectangle.h" + "../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp" + "../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" + "../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp" + "../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp" + "../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp" + "../../../../../modules/juce_graphics/images/juce_Image.cpp" + "../../../../../modules/juce_graphics/images/juce_Image.h" + "../../../../../modules/juce_graphics/images/juce_ImageCache.cpp" + "../../../../../modules/juce_graphics/images/juce_ImageCache.h" + "../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp" + "../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h" + "../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp" + "../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h" + "../../../../../modules/juce_graphics/images/juce_ScaledImage.h" + "../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp" + "../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp" + "../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp" + "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h" + "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm" + "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h" + "../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm" + "../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp" + "../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp" + "../../../../../modules/juce_graphics/placement/juce_Justification.h" + "../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp" + "../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h" + "../../../../../modules/juce_graphics/juce_graphics.cpp" + "../../../../../modules/juce_graphics/juce_graphics.mm" + "../../../../../modules/juce_graphics/juce_graphics.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.h" + "../../../../../modules/juce_gui_basics/application/juce_Application.cpp" + "../../../../../modules/juce_gui_basics/application/juce_Application.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_Button.h" + "../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h" + "../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h" + "../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h" + "../../../../../modules/juce_gui_basics/components/juce_Component.cpp" + "../../../../../modules/juce_gui_basics/components/juce_Component.h" + "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" + "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" + "../../../../../modules/juce_gui_basics/components/juce_ComponentTraverser.h" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.h" + "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" + "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" + "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" + "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" + "../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" + "../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" + "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h" + "../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h" + "../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h" + "../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h" + "../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h" + "../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" + "../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" + "../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_Grid.h" + "../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" + "../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h" + "../../../../../modules/juce_gui_basics/layout/juce_SidePanel.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_SidePanel.h" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_Viewport.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h" + "../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h" + "../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h" + "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" + "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" + "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" + "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" + "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h" + "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h" + "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h" + "../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h" + "../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" + "../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h" + "../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" + "../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" + "../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h" + "../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" + "../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" + "../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" + "../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" + "../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" + "../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" + "../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm" + "../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h" + "../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" + "../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp" + "../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h" + "../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h" + "../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h" + "../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_Label.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h" + "../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_Slider.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h" + "../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h" + "../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h" + "../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h" + "../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_MessageBoxOptions.h" + "../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h" + "../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h" + "../../../../../modules/juce_gui_basics/juce_gui_basics.cpp" + "../../../../../modules/juce_gui_basics/juce_gui_basics.mm" + "../../../../../modules/juce_gui_basics/juce_gui_basics.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h" + "../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp" + "../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h" + "../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_HWNDComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h" + "../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h" + "../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h" + "../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.h" + "../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.h" + "../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h" + "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" + "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" + "../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" + "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" + "../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.mm" + "../../../../../modules/juce_gui_extra/juce_gui_extra.h" + "../../../../../modules/juce_opengl/geometry/juce_Draggable3DOrientation.h" + "../../../../../modules/juce_opengl/geometry/juce_Matrix3D.h" + "../../../../../modules/juce_opengl/geometry/juce_Quaternion.h" + "../../../../../modules/juce_opengl/geometry/juce_Vector3D.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_android.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_ios.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_linux_X11.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_osx.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_win32.h" + "../../../../../modules/juce_opengl/native/juce_OpenGLExtensions.h" + "../../../../../modules/juce_opengl/opengl/juce_gl.cpp" + "../../../../../modules/juce_opengl/opengl/juce_gl.h" + "../../../../../modules/juce_opengl/opengl/juce_gles2.cpp" + "../../../../../modules/juce_opengl/opengl/juce_gles2.h" + "../../../../../modules/juce_opengl/opengl/juce_khrplatform.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLRenderer.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.h" + "../../../../../modules/juce_opengl/opengl/juce_wgl.h" + "../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp" + "../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.h" + "../../../../../modules/juce_opengl/juce_opengl.cpp" + "../../../../../modules/juce_opengl/juce_opengl.mm" + "../../../../../modules/juce_opengl/juce_opengl.h" + "../../../JuceLibraryCode/BinaryData.h" + "../../../JuceLibraryCode/JuceHeader.h" + PROPERTIES HEADER_FILE_ONLY TRUE) target_compile_options( ${BINARY_NAME} PRIVATE "-fsigned-char" ) if( JUCE_BUILD_CONFIGURATION MATCHES "DEBUG" ) - target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) + target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) endif() if( JUCE_BUILD_CONFIGURATION MATCHES "RELEASE" ) - target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) + target_compile_options( ${BINARY_NAME} PRIVATE -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override) endif() find_library(log "log") diff --git a/extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml b/extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml index 38e3ae11..c550fe9d 100644 --- a/extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml +++ b/extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml @@ -4,7 +4,7 @@ package="com.juce.pluginhost"> - + diff --git a/extras/AudioPluginHost/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h b/extras/AudioPluginHost/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h index 463dfc85..dc75464e 100644 --- a/extras/AudioPluginHost/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h +++ b/extras/AudioPluginHost/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff --git a/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DSPDemos_Common.h b/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DSPDemos_Common.h index 07a2bd7c..49ccc278 100644 --- a/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DSPDemos_Common.h +++ b/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DSPDemos_Common.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff --git a/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DemoUtilities.h b/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DemoUtilities.h index 73ac930a..bfc1c5d2 100644 --- a/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DemoUtilities.h +++ b/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DemoUtilities.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff --git a/extras/AudioPluginHost/Builds/Android/app/src/main/assets/WavefrontObjParser.h b/extras/AudioPluginHost/Builds/Android/app/src/main/assets/WavefrontObjParser.h index 396c9c7a..01f51770 100644 --- a/extras/AudioPluginHost/Builds/Android/app/src/main/assets/WavefrontObjParser.h +++ b/extras/AudioPluginHost/Builds/Android/app/src/main/assets/WavefrontObjParser.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE examples. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission diff --git a/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile b/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile index 04ea6394..f2a7a5ea 100644 --- a/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile +++ b/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile @@ -11,6 +11,10 @@ endif # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ ifeq ($(CONFIG),Debug) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := AudioPluginHost JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,18 +60,19 @@ ifeq ($(CONFIG),Release) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := AudioPluginHost JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -Os $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif OBJECTS_APP := \ + $(JUCE_OBJDIR)/ARAPlugin_e9864935.o \ $(JUCE_OBJDIR)/InternalPlugins_8278e3f5.o \ $(JUCE_OBJDIR)/IOConfigurationWindow_d71a5732.o \ $(JUCE_OBJDIR)/PluginGraph_6bd15e2d.o \ @@ -79,6 +84,8 @@ OBJECTS_APP := \ $(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o \ $(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o \ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o \ $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o \ $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \ $(JUCE_OBJDIR)/include_juce_cryptography_8cb807a8.o \ @@ -95,14 +102,19 @@ OBJECTS_APP := \ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors alsa freetype2 libcurl + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors alsa freetype2 libcurl @echo Linking "AudioPluginHost - App" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) -$(V_AT)mkdir -p $(JUCE_OUTDIR) $(V_AT)$(CXX) -o $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(OBJECTS_APP) $(JUCE_LDFLAGS) $(JUCE_LDFLAGS_APP) $(RESOURCES) $(TARGET_ARCH) +$(JUCE_OBJDIR)/ARAPlugin_e9864935.o: ../../Source/Plugins/ARAPlugin.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling ARAPlugin.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/InternalPlugins_8278e3f5.o: ../../Source/Plugins/InternalPlugins.cpp -$(V_AT)mkdir -p $(JUCE_OBJDIR) @echo "Compiling InternalPlugins.cpp" @@ -158,6 +170,16 @@ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o: ../../JuceLibraryCode/i @echo "Compiling include_juce_audio_processors.cpp" $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" +$(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o: ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_ara.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o: ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_lv2_libs.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o: ../../JuceLibraryCode/include_juce_audio_utils.cpp -$(V_AT)mkdir -p $(JUCE_OBJDIR) @echo "Compiling include_juce_audio_utils.cpp" diff --git a/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj b/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj index 4437f8df..d45c9c47 100644 --- a/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj +++ b/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj @@ -14,12 +14,12 @@ 15CCE43D7DCFC649638919D4 /* include_juce_audio_basics.mm */ = {isa = PBXBuildFile; fileRef = 4C7D82F9274A4F9DBF11235C; }; 21D330A5B13178B12BEAFC3C /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = D4EBC17BDB7F88CCBC76730B; }; 2727A191DB1BAAC9C04B9081 /* include_juce_opengl.mm */ = {isa = PBXBuildFile; fileRef = 37E4D5C341406B7072120006; }; - 2B4B9CF71F94BDD1E3AC89AE /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = B0935EBBA4F6E2B05F3D1C0A; }; 2C3D221D2AA87F07B3F1044D /* include_juce_gui_basics.mm */ = {isa = PBXBuildFile; fileRef = 8FE7B37CDE0818DB27BDDEBD; }; 3E1689E23B9C85F03209DCEF /* GraphEditorPanel.cpp */ = {isa = PBXBuildFile; fileRef = 3D78A731234A833CA112AE45; }; 443244451A0F2064D4767337 /* Icon.icns */ = {isa = PBXBuildFile; fileRef = 2A6983F82B13F9E8B10299AE; }; 4DB15177DDC357F4503F88CF /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = B457EE687507BF1DEEA7581F; }; 5C4D406B924230F83E3580AD /* include_juce_audio_devices.mm */ = {isa = PBXBuildFile; fileRef = 65968EA1B476D71F14DE1D58; }; + 60BBD03840ABDD719FED194F /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 5183A94449F6317518C48B0C; }; 68FBFDA1FE637B3EDA09A592 /* IOKit.framework */ = {isa = PBXBuildFile; fileRef = 4DF6E6E41E10965AD169143B; }; 70580743C3D5695F065FF698 /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = E68018DE199135B7F738FB17; }; 73E371F1B912FCCAE0CD7E5D /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 86CA337014D3F67E906FFD28; }; @@ -27,6 +27,7 @@ 7DE202DC1D876F49266D9E7D /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 8290D7BAC160B3A56B66891A; }; 7FF8A938915488310A7F5921 /* InternalPlugins.cpp */ = {isa = PBXBuildFile; fileRef = 87A7AAB053051C49EAF4EE88; }; 9056B642BEF870098DE344E5 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = 03FA420AACDD03D50AA16E4A; }; + 970A893BD34180916C9D01C4 /* ARAPlugin.cpp */ = {isa = PBXBuildFile; fileRef = 6A01D5F304346E0332264056; }; A0144A682BF4843C8CF53FE4 /* BinaryData.cpp */ = {isa = PBXBuildFile; fileRef = 6D107D7946DC5976B766345B; }; A02C9F4C4B840C27B6CAFEBD /* QuartzCore.framework */ = {isa = PBXBuildFile; fileRef = 89309C0C5F3269BD06BE7F27; }; A09E93F1B354E1FF8B3E9ABE /* include_juce_data_structures.mm */ = {isa = PBXBuildFile; fileRef = 5EF1D381F42AA8764597F189; }; @@ -36,6 +37,7 @@ B288A89F96704F142ED8E939 /* AudioUnit.framework */ = {isa = PBXBuildFile; fileRef = 5ACC21AA45BBF48C3C64D56D; }; BBA1733CF8B064A5FD0B4CF4 /* OpenGL.framework */ = {isa = PBXBuildFile; fileRef = D313CF37B25D7FD313C4F336; }; C38D14DC58F1941DD5E4BF60 /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = 2BE6C2DFD6EBB9A89109AEB5; }; + CAC10E4345428CAEE6F0DA1B /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = A43CE79CB190C2D69E17E1E3; }; CAF0DE157C8F7D9F168AA3B6 /* include_juce_audio_processors.mm */ = {isa = PBXBuildFile; fileRef = 5FBD6C402617272052BB4D81; }; D92C7BF86C9CCF6B4D14F809 /* RecentFilesMenuTemplate.nib */ = {isa = PBXBuildFile; fileRef = 7DA35787B5F6F7440D667CC8; }; E092A70431B046BF1F50A482 /* CoreMIDI.framework */ = {isa = PBXBuildFile; fileRef = 5AF0CA7CDFCA90B4DE1F55C3; }; @@ -67,6 +69,7 @@ 46C3C2CD301CD59C51FD02D6 /* PluginGraph.h */ /* PluginGraph.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginGraph.h; path = ../../Source/Plugins/PluginGraph.h; sourceTree = SOURCE_ROOT; }; 4C7D82F9274A4F9DBF11235C /* include_juce_audio_basics.mm */ /* include_juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_basics.mm; path = ../../JuceLibraryCode/include_juce_audio_basics.mm; sourceTree = SOURCE_ROOT; }; 4DF6E6E41E10965AD169143B /* IOKit.framework */ /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; + 5183A94449F6317518C48B0C /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 5313EB852E41EE58B199B9A2 /* juce_audio_devices */ /* juce_audio_devices */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_devices; path = ../../../../modules/juce_audio_devices; sourceTree = SOURCE_ROOT; }; 57DF618F1DE781556B7AFC32 /* Info-App.plist */ /* Info-App.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = SOURCE_ROOT; }; 59842A98E5EBBC54B50C04CD /* juce_events */ /* juce_events */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_events; path = ../../../../modules/juce_events; sourceTree = SOURCE_ROOT; }; @@ -78,6 +81,7 @@ 5FBD6C402617272052BB4D81 /* include_juce_audio_processors.mm */ /* include_juce_audio_processors.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_processors.mm; path = ../../JuceLibraryCode/include_juce_audio_processors.mm; sourceTree = SOURCE_ROOT; }; 65968EA1B476D71F14DE1D58 /* include_juce_audio_devices.mm */ /* include_juce_audio_devices.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_devices.mm; path = ../../JuceLibraryCode/include_juce_audio_devices.mm; sourceTree = SOURCE_ROOT; }; 683CEE986A2467C850FE99E6 /* include_juce_core.mm */ /* include_juce_core.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_core.mm; path = ../../JuceLibraryCode/include_juce_core.mm; sourceTree = SOURCE_ROOT; }; + 6A01D5F304346E0332264056 /* ARAPlugin.cpp */ /* ARAPlugin.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ARAPlugin.cpp; path = ../../Source/Plugins/ARAPlugin.cpp; sourceTree = SOURCE_ROOT; }; 6A71B2BCAC4239072BC2BD7E /* juce_audio_basics */ /* juce_audio_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_basics; path = ../../../../modules/juce_audio_basics; sourceTree = SOURCE_ROOT; }; 6D107D7946DC5976B766345B /* BinaryData.cpp */ /* BinaryData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = SOURCE_ROOT; }; 7DA35787B5F6F7440D667CC8 /* RecentFilesMenuTemplate.nib */ /* RecentFilesMenuTemplate.nib */ = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = SOURCE_ROOT; }; @@ -96,12 +100,12 @@ 9794142D24966F93FFDE51A1 /* Cocoa.framework */ /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 97E63C295843A1E665E70473 /* cello.wav */ /* cello.wav */ = {isa = PBXFileReference; lastKnownFileType = file.wav; name = cello.wav; path = ../../../../examples/Assets/cello.wav; sourceTree = SOURCE_ROOT; }; 9F9B445E6755CAA19E4344ED /* CoreAudio.framework */ /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + A43CE79CB190C2D69E17E1E3 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; A5DFC13E4F09134B0D226A3E /* MainHostWindow.h */ /* MainHostWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainHostWindow.h; path = ../../Source/UI/MainHostWindow.h; sourceTree = SOURCE_ROOT; }; A5E7CA8A71D049BE2BD33861 /* JuceHeader.h */ /* JuceHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = SOURCE_ROOT; }; A66EFAC64B1B67B536C73415 /* HostStartup.cpp */ /* HostStartup.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HostStartup.cpp; path = ../../Source/HostStartup.cpp; sourceTree = SOURCE_ROOT; }; A692426308435C2002F988FE /* proaudio.path */ /* proaudio.path */ = {isa = PBXFileReference; lastKnownFileType = file.path; name = proaudio.path; path = ../../../../examples/Assets/proaudio.path; sourceTree = SOURCE_ROOT; }; A872AF2CAFFC72109B9C6348 /* cassette_recorder.wav */ /* cassette_recorder.wav */ = {isa = PBXFileReference; lastKnownFileType = file.wav; name = cassette_recorder.wav; path = ../../../../examples/Assets/cassette_recorder.wav; sourceTree = SOURCE_ROOT; }; - B0935EBBA4F6E2B05F3D1C0A /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; B285CAB91AE928C476CA4F9C /* include_juce_audio_utils.mm */ /* include_juce_audio_utils.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_utils.mm; path = ../../JuceLibraryCode/include_juce_audio_utils.mm; sourceTree = SOURCE_ROOT; }; B2A1E626CC120982805754F6 /* JUCEAppIcon.png */ /* JUCEAppIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = JUCEAppIcon.png; path = ../../Source/JUCEAppIcon.png; sourceTree = SOURCE_ROOT; }; B457EE687507BF1DEEA7581F /* WebKit.framework */ /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; @@ -110,6 +114,7 @@ B8E24A5CEE6B7055537725CF /* include_juce_cryptography.mm */ /* include_juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_cryptography.mm; path = ../../JuceLibraryCode/include_juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; B95B9D6774059DBB19F2B4E2 /* InternalPlugins.h */ /* InternalPlugins.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InternalPlugins.h; path = ../../Source/Plugins/InternalPlugins.h; sourceTree = SOURCE_ROOT; }; C37B2E77AAB6C9E13729BF99 /* IOConfigurationWindow.cpp */ /* IOConfigurationWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = IOConfigurationWindow.cpp; path = ../../Source/Plugins/IOConfigurationWindow.cpp; sourceTree = SOURCE_ROOT; }; + CA726B9AA0EC87B58D005C8D /* ARAPlugin.h */ /* ARAPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ARAPlugin.h; path = ../../Source/Plugins/ARAPlugin.h; sourceTree = SOURCE_ROOT; }; D313CF37B25D7FD313C4F336 /* OpenGL.framework */ /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; D4EBC17BDB7F88CCBC76730B /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; E68018DE199135B7F738FB17 /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; @@ -128,7 +133,6 @@ B288A89F96704F142ED8E939, 73E371F1B912FCCAE0CD7E5D, 21D330A5B13178B12BEAFC3C, - 2B4B9CF71F94BDD1E3AC89AE, AC3BED74AC7C6D9F5739F38B, E3CB85BA817BC9E3942A8AB0, 70580743C3D5695F065FF698, @@ -180,6 +184,8 @@ 65968EA1B476D71F14DE1D58, 5D250A57C7DEA80248F30EED, 5FBD6C402617272052BB4D81, + A43CE79CB190C2D69E17E1E3, + 5183A94449F6317518C48B0C, B285CAB91AE928C476CA4F9C, 683CEE986A2467C850FE99E6, B8E24A5CEE6B7055537725CF, @@ -228,6 +234,8 @@ 9F51E92D8C77FA9DDD1F7B10 /* Plugins */ = { isa = PBXGroup; children = ( + 6A01D5F304346E0332264056, + CA726B9AA0EC87B58D005C8D, 87A7AAB053051C49EAF4EE88, B95B9D6774059DBB19F2B4E2, C37B2E77AAB6C9E13729BF99, @@ -266,7 +274,6 @@ 5ACC21AA45BBF48C3C64D56D, 86CA337014D3F67E906FFD28, D4EBC17BDB7F88CCBC76730B, - B0935EBBA4F6E2B05F3D1C0A, 9794142D24966F93FFDE51A1, 9F9B445E6755CAA19E4344ED, E68018DE199135B7F738FB17, @@ -327,7 +334,7 @@ ADE6E539DB98A302483A82D0 = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { @@ -388,6 +395,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 970A893BD34180916C9D01C4, 7FF8A938915488310A7F5921, 025B22813EA4E34CE3630B9A, 09309BD494A05931864B6730, @@ -399,6 +407,8 @@ 5C4D406B924230F83E3580AD, F4DD98B9310B679D50A2C8A6, CAF0DE157C8F7D9F168AA3B6, + CAC10E4345428CAEE6F0DA1B, + 60BBD03840ABDD719FED194F, 0F20A4AE04736634F097F5A6, 76A80851698FC773D2479B4E, E4A926EF695823F0F13268FF, @@ -433,7 +443,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -457,6 +467,7 @@ "JUCE_PLUGINHOST_VST3=1", "JUCE_PLUGINHOST_AU=1", "JUCE_PLUGINHOST_LADSPA=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_USE_CDREADER=0", "JUCE_USE_CDBURNER=0", "JUCE_WEB_BROWSER=0", @@ -468,13 +479,21 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", @@ -485,9 +504,10 @@ INSTALL_PATH = "$(HOME)/Applications"; LLVM_LTO = YES; MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost; PRODUCT_NAME = "AudioPluginHost"; USE_HEADERMAP = NO; @@ -563,7 +583,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -587,6 +607,7 @@ "JUCE_PLUGINHOST_VST3=1", "JUCE_PLUGINHOST_AU=1", "JUCE_PLUGINHOST_LADSPA=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_USE_CDREADER=0", "JUCE_USE_CDBURNER=0", "JUCE_WEB_BROWSER=0", @@ -598,13 +619,21 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", @@ -614,9 +643,10 @@ INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost; PRODUCT_NAME = "AudioPluginHost"; USE_HEADERMAP = NO; diff --git a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost.sln b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost.sln deleted file mode 100644 index 9d0e28d2..00000000 --- a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost.sln +++ /dev/null @@ -1,21 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 14 - -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AudioPluginHost - App", "AudioPluginHost_App.vcxproj", "{5666EAA2-C82B-D06A-5228-D0E810428536}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5666EAA2-C82B-D06A-5228-D0E810428536}.Debug|x64.ActiveCfg = Debug|x64 - {5666EAA2-C82B-D06A-5228-D0E810428536}.Debug|x64.Build.0 = Debug|x64 - {5666EAA2-C82B-D06A-5228-D0E810428536}.Release|x64.ActiveCfg = Release|x64 - {5666EAA2-C82B-D06A-5228-D0E810428536}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj deleted file mode 100644 index 909c58f8..00000000 --- a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj +++ /dev/null @@ -1,3192 +0,0 @@ - - - - - - Debug - x64 - - - Release - x64 - - - - {5666EAA2-C82B-D06A-5228-D0E810428536} - - - - Application - false - false - v140 - 8.1 - - - Application - false - true - v140 - 8.1 - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - .exe - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - AudioPluginHost - true - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - AudioPluginHost - true - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Disabled - ProgramDatabase - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - true - NotUsing - $(IntDir)\ - $(IntDir)\ - $(IntDir)\AudioPluginHost.pdb - Level4 - true - true - /w44265 /w44062 /bigobj %(AdditionalOptions) - stdcpp14 - - - _DEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\AudioPluginHost.exe - true - libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries) - true - $(IntDir)\AudioPluginHost.pdb - Windows - true - - - true - $(IntDir)\AudioPluginHost.bsc - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Full - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreadedDLL - true - NotUsing - $(IntDir)\ - $(IntDir)\ - $(IntDir)\AudioPluginHost.pdb - Level4 - true - true - /w44265 /w44062 /bigobj %(AdditionalOptions) - stdcpp14 - - - NDEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\AudioPluginHost.exe - true - %(IgnoreSpecificDefaultLibraries) - false - $(IntDir)\AudioPluginHost.pdb - Windows - true - true - true - UseLinkTimeCodeGeneration - - - true - $(IntDir)\AudioPluginHost.bsc - - - - - - - - - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - - - - - - - - - - - - /bigobj %(AdditionalOptions) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters deleted file mode 100644 index a75bf0cc..00000000 --- a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters +++ /dev/null @@ -1,5537 +0,0 @@ - - - - - - {346E906D-8A2B-A93A-4C90-BCD3C60D2FD0} - - - {8C61EB30-11E6-7029-4CC8-56C52EB1F1C3} - - - {57E59C1B-8971-243F-9A1A-8EABFD456232} - - - {7FF9F684-A465-C086-BEFF-C3EF408A7A84} - - - {297DEAC9-184C-CA1D-D75C-DAA34116691C} - - - {EB58F05A-A968-CEBE-40C4-107CDD8F240F} - - - {5FCF559E-451A-CB1E-B177-A5DC5A0005BB} - - - {05CE33FC-868F-AA1A-12B8-79C98E753648} - - - {D78296AF-218E-B17E-7F8B-9D148601188D} - - - {B96EBA26-E668-FFAF-FC53-1EC1337DAF5A} - - - {D8532E5E-469E-5042-EFC8-238241704735} - - - {777B5D1D-9AF0-B22B-8894-034603EE97F5} - - - {8292766D-2459-2E7E-7615-17216318BA93} - - - {9BD56105-DAB4-EBD5-00DD-BD540E98FE88} - - - {10472B2C-9888-D269-F351-0D0AC3BCD16C} - - - {BF23FC10-1D57-2A9B-706F-6DD8A7B593D4} - - - {386862D5-4DCC-A4B3-5642-60A201E303EF} - - - {092EFC17-7C95-7E04-0ACA-0D61A462EE81} - - - {285118C6-8FDA-7DCE-BEF4-FFB2120876C5} - - - {69ED6B61-9B8D-D47E-E4A6-2E9F9A94A75A} - - - {7CDB7CD1-BB96-F593-3C78-1E06182B5839} - - - {B0A708DE-B4CF-196B-14FB-DC8221509B8E} - - - {34F46ADE-EE31-227A-A69E-7732E70145F1} - - - {BB9B3C77-17FB-E994-8B75-88F1727E4655} - - - {C0971D77-2F14-190A-E2AE-89D6285F4D5A} - - - {AABEA333-6524-8891-51C7-6DAEB5700628} - - - {F2D29337-983E-BAD7-7B5C-E0AB3D53D404} - - - {C674B0FB-1FC0-2986-94B1-083845018994} - - - {0AFC1CE8-F6E6-9817-8C21-8432B2A375DA} - - - {0D1AF264-3AC1-78A2-B2A4-AE6171F9194A} - - - {9A5DB854-CFFB-5F88-C566-0E10F994DDB3} - - - {38A5DDC7-416E-548F-39DA-887875FE6B20} - - - {980FE2DB-05D3-5FDA-79DA-067A56F5D19D} - - - {F336DC25-747A-0663-93D6-E3EB9AA0CBF8} - - - {7D78546A-80FC-4DCA-00B9-F191F0AB2179} - - - {9EB3EC7F-2AB7-DDAA-3C05-DF382B728D3F} - - - {6B9FBFDC-1D10-6246-356D-00FF4535CECB} - - - {D6FCFC8E-7136-9109-78C0-91A3EB4C443F} - - - {EBF18AC1-F0ED-937A-2824-4307CE2ADAF7} - - - {5A0F7922-2EFB-6465-57E4-A445B804EFB5} - - - {4EC45416-0E7C-7567-6F75-D0C8CEE7DC4F} - - - {C2985031-0496-55B5-41A8-BAB99E53D89D} - - - {FB4AB426-7009-0036-BB75-E34256AA7C89} - - - {E684D858-09E8-0251-8E86-5657129641E1} - - - {1EF1BF17-F941-243A-04D1-EE617D140CBA} - - - {344DB016-679C-FBD0-3EC6-4570C47522DE} - - - {3D9758A0-9359-1710-87C1-05D475C08B17} - - - {E824435F-FC7B-10BE-5D1A-5DACC51A8836} - - - {86737735-F6BA-F64A-5EC7-5C9F36755F79} - - - {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} - - - {80C72173-A1E1-C3C5-9288-B889CE2EAFEA} - - - {4138B955-AA0B-FA86-DBF9-404CAFFFA866} - - - {2B4166B8-F470-F07C-4F51-D2DAAAECBB18} - - - {9C295115-C0CD-3129-1C4D-FB53299B23FB} - - - {65526A8B-3447-9DF0-FD5D-00D111126027} - - - {A54A1F5C-F32F-F97B-9E8A-69922B770A54} - - - {B90A44F3-B62D-B5C0-81A2-683D2650AEE6} - - - {DAF30656-5915-0E45-C4E4-54439617D525} - - - {9266EA90-6A0A-5DDB-9CB7-966BEF03BA5C} - - - {9C713CBA-A9E2-5F4E-F83C-2CAB8533913C} - - - {63571A07-9AA3-5BB0-1103-0B42A2E6BC9E} - - - {314F43F2-BC8F-B464-EAE7-86B9675454E9} - - - {874C5D0C-6D29-68EE-38BB-26200B56BC89} - - - {86BAA7A7-DC50-35B6-910B-932AEAF257F2} - - - {6B7BE34D-1BC1-C7B9-111F-C55CA8250943} - - - {9B6B6D54-D378-80C2-8CC9-D1D8FB44C2A8} - - - {D0584AC3-6837-14F6-90BF-5EA604D1F074} - - - {794B64EC-B809-32E3-AD00-4EE6A74802CA} - - - {67BE498C-9E1F-C73A-B99A-387C034CE680} - - - {1A9C8538-959B-25E3-473D-B462C9A9D458} - - - {AA9F594C-DFAF-C0A7-0CCD-9F90E54D3A01} - - - {230BF784-34F4-3BE8-46D4-54E6B67E5E9E} - - - {39F680F3-5161-4D1C-EAD0-3911ED808874} - - - {3197198B-A978-E330-C7FB-07E5CE8236C7} - - - {42F7BE9D-3C8A-AE26-289B-8F355C068036} - - - {7868764A-6572-381A-906C-9C26792A4C29} - - - {03678508-A517-48BB-FB4A-485628C34E08} - - - {07D27C1D-3227-F527-356C-17DA11551A99} - - - {6146D580-99D2-A6C8-5908-30DC355BB6BA} - - - {C67003E8-BEA8-2188-F4B3-A122F4B4FA3F} - - - {09B91E68-1FF4-C7ED-9055-D4D96E66A0BA} - - - {30B3DA63-C1E4-F2EA-CEF0-8035D8CBFF64} - - - {4F24EEED-AA33-AC6C-9A39-72E71CF83EF0} - - - {0F70B1A9-BB50-23F5-2AE7-F95E51A00389} - - - {D4C8DC40-2CD2-04B6-05D0-1E7A88841390} - - - {58BED6AF-DB89-7560-B2B8-D937C1C0825A} - - - {B958F86B-6926-8D9B-2FC6-8BFD4BDC72C9} - - - {DB624F7D-D513-25AC-C13C-B9062EB3BEEE} - - - {89AA9B6C-4029-A34F-C1B0-3B5D8691F4D4} - - - {1A7F541C-B032-9C66-C320-A13B2A8A9866} - - - {4BAB7C18-51AB-0D9D-83CD-9C37F28D2E38} - - - {5523922E-8B0C-A52B-477C-752C09F8197F} - - - {857B6D8B-0ECB-FE9E-D1EB-D5E45E72F057} - - - {BAA582FA-40B7-320E-EE7A-4C3892C7BE72} - - - {89B3E447-34BE-C691-638E-09796C6B647E} - - - {9BE78436-DBF4-658C-579B-ED19FFD0EB5D} - - - {21E7FA61-9E0A-4BA1-04B7-AF47AFA9CB8B} - - - {632B4C79-AF7D-BFB5-D006-5AE67F607130} - - - {B10E20C2-4583-2B79-60B7-FE4D4B044313} - - - {CFB54F15-8A8A-0505-9B7F-ECA41CEE38E8} - - - {911F0159-A7A8-4A43-3FD4-154F62F4A44B} - - - {53CF03D3-988B-CD28-9130-CE08FDCEF7E9} - - - {29C6FE02-507E-F3FE-16CD-74D84842C1EA} - - - {8001BD68-125B-E392-8D3B-1F9C9520A65A} - - - {EDC17061-CFA0-8EA0-0ADA-90F31C2FB0F2} - - - {B813BD14-6565-2525-9AC3-E3AA48EDDA85} - - - {DDF4BA73-8578-406D-21F8-06B9BC70BFEA} - - - {73374573-0194-9A6E-461A-A81EEB511C26} - - - {5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E} - - - {9D5816C2-E2B2-2E3F-B095-AC8BD1100D29} - - - {3FDCD000-763F-8477-9AF8-70ABA2E91E5E} - - - {0947506F-66FA-EF8D-8A4E-4D48BCDBB226} - - - {E4B6AED3-F54C-3FF2-069F-640BACAE0E08} - - - {D5EADBCC-6A1C-C940-0206-26E49110AF08} - - - {D27DC92D-5BEB-9294-DCD1-81D54E245AD5} - - - {BCD73D20-42B1-6CDB-DE66-B06236A60F47} - - - {20DC13F6-2369-8841-9F0B-D13FA14EEE74} - - - {A302A8DB-120F-9EBB-A3D5-2C29963AA56B} - - - {45489C2A-6E0E-CCDC-6638-0DACEEB63CCA} - - - {F1B90726-DB55-0293-BFAF-C65C7DF5489C} - - - {2C55FD42-0ACD-B0B8-7EAE-EB17F09BAEEC} - - - {B68CD2B2-701F-9AB7-4638-2485D6E06BCF} - - - {B0B7C78E-729E-0FFA-D611-82AE8BC7FE2C} - - - {0A4F7E12-220C-14EF-0026-9C0629FA9C17} - - - {37F49E10-4E62-6D5C-FF70-722D0CA3D97E} - - - {160D9882-0F68-278D-C5F9-8960FD7421D2} - - - {4CED05DA-E0A2-E548-F753-1F2EF299A8E3} - - - {46AE69B8-AD58-4381-6CDE-25C8D75B01D2} - - - {E56CB4FC-32E8-8740-A3BB-B323CD937A99} - - - {4ECDCA0C-BB38-0729-A6B6-2FB0B4D0863B} - - - {294E4CD5-B06F-97D1-04A3-51871CEA507C} - - - {77228F15-BD91-06FF-2C7E-0377D25C2C94} - - - {5CB531E6-BF9A-2C50-056C-EE5A525D28D3} - - - {E4EA47E5-B41C-2A19-1783-7E9104096ECD} - - - {B331BC33-9770-3DB5-73F2-BC2469ECCF7F} - - - {46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC} - - - {D90A8DF7-FBAB-D363-13C0-6707BB22B72B} - - - {8AE77C40-6839-EC37-4515-BD3CC269BCE4} - - - {0EAD99DB-011F-09E5-45A2-365F646EB004} - - - {F57590C6-3B90-1BE1-1006-488BA33E8BD9} - - - {7C319D73-0D93-5842-0874-398D2D3038D5} - - - {2CB4DB0C-DD3B-6195-D822-76EC7A5C88D2} - - - {FE3CB19C-EF43-5CF5-DAF0-09D4E43D0AB9} - - - {C0E5DD5D-F8F1-DD25-67D7-291946AB3828} - - - {FE7E6CD5-C7A0-DB20-4E7E-D6E7F08C4578} - - - {895C2D33-E08D-B1BA-BB36-FC4CA65090C8} - - - {D64A57DB-A956-5519-1929-1D929B56E1B0} - - - {5A99CC24-AC45-7ED6-C11A-B8B86E76D884} - - - {7A131EEC-25A7-22F6-2839-A2194DDF3007} - - - {EA9DB76C-CEF7-6BFC-2070-28B7DF8E8063} - - - {3C206A40-6F1B-E683-ACF1-DEC3703D0140} - - - {DF95D4BF-E18C-125A-5EBB-8993A06E232C} - - - {118946F2-AC24-0F09-62D5-753DF87A60CD} - - - {07329F9B-7D3D-CEB3-C771-714842076140} - - - {08BBBECB-B0D1-7611-37EC-F57E1D0CE2A2} - - - {268E8F2A-980C-BF2F-B161-AACABC9D91F3} - - - {A4D76113-9EDC-DA60-D89B-5BACF7F1C426} - - - {1A9221A3-E993-70B2-6EA2-8E1DB5FF646A} - - - {CC2DAD7A-5B45-62AB-4C54-6FE6B1AE86C3} - - - {599138A9-EA63-53DD-941F-ABE3412D2949} - - - {422A4014-8587-1AE6-584F-32A62613A37B} - - - {9FBFF5E5-56F1-34A1-2C85-F760DA2B1EB7} - - - {FE955B6B-68AC-AA07-70D8-2413F6DB65C8} - - - {7ED5A90E-41AF-A1EF-659B-37CEEAB9BA61} - - - - - AudioPluginHost\Source\Plugins - - - AudioPluginHost\Source\Plugins - - - AudioPluginHost\Source\Plugins - - - AudioPluginHost\Source\UI - - - AudioPluginHost\Source\UI - - - AudioPluginHost\Source - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\synthesisers - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\midi_io\ump - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\sampler - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\native - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\filter_design - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\utils - - - JUCE Modules\juce_opengl - - - JUCE Modules\juce_opengl - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - - - AudioPluginHost\Source\Plugins - - - AudioPluginHost\Source\Plugins - - - AudioPluginHost\Source\Plugins - - - AudioPluginHost\Source\UI - - - AudioPluginHost\Source\UI - - - AudioPluginHost\Source\UI - - - JUCE Modules\juce_audio_basics\audio_play_head - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\buffers - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi\ump - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\midi - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\mpe - - - JUCE Modules\juce_audio_basics\native - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\sources - - - JUCE Modules\juce_audio_basics\synthesisers - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics\utilities - - - JUCE Modules\juce_audio_basics - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\audio_io - - - JUCE Modules\juce_audio_devices\midi_io\ump - - - JUCE Modules\juce_audio_devices\midi_io\ump - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\midi_io - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\include\oboe - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\aaudio - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\common - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\fifo - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native\oboe\src\opensles - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\native - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices\sources - - - JUCE Modules\juce_audio_devices - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\private - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\include\protected - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\coupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\coupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\floor - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\books\uncoupled - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib\modes - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7\lib - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\codecs - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\format - - - JUCE Modules\juce_audio_formats\sampler - - - JUCE Modules\juce_audio_formats - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\thread\include - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\gui - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\format_types - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\processors - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\scanning - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors\utilities - - - JUCE Modules\juce_audio_processors - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\audio_cd - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\gui - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils\players - - - JUCE Modules\juce_audio_utils - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\containers - - - JUCE Modules\juce_dsp\filter_design - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\frequency - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\maths - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\native - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\processors - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp\widgets - - - JUCE Modules\juce_dsp - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\geometry - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\native - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\opengl - - - JUCE Modules\juce_opengl\utils - - - JUCE Modules\juce_opengl - - - JUCE Library Code - - - JUCE Library Code - - - - - AudioPluginHost\Source - - - AudioPluginHost\BinaryData - - - AudioPluginHost\BinaryData - - - AudioPluginHost\BinaryData - - - AudioPluginHost\BinaryData - - - AudioPluginHost\BinaryData - - - AudioPluginHost\BinaryData - - - JUCE Modules\juce_audio_devices\native\oboe - - - JUCE Modules\juce_audio_devices\native\oboe - - - JUCE Modules\juce_audio_formats\codecs\flac - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis\libvorbis-1.3.7 - - - JUCE Modules\juce_audio_formats\codecs\oggvorbis - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_audio_processors\format_types\VST3_SDK - - - JUCE Modules\juce_core\native\java - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Library Code - - - - - JUCE Library Code - - - diff --git a/extras/AudioPluginHost/Builds/VisualStudio2015/icon.ico b/extras/AudioPluginHost/Builds/VisualStudio2015/icon.ico deleted file mode 100644 index d2ad57bff889bf1d68cb1764769cfb2f1fadd21f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42800 zcmdpe1z1+g_BSFZVv%AY2qFq9p@bl%q#_+62uO$$Qc4JjA}ZZ24bmOb-7SrDcX!XX z=hfHi(c``6+`r<6sh@Ij}#c(2;IL*H!JL} zaFsiHaF*M*bCx@-ea-gmunxZa9X(e;5DsU#qnA*X+m1(H0dVOr0a=r+sBG0+3}796 z2iw55KlTHEbCo;f>$S#!i1B7nwJ-`a`jK+350&XU8o=b*E=U+&0D7&l0Ji3+Tuay@&qbBZ%YRJ1^p;`*hl2R0x}kNWGpt9;ko29NhUF1uQ$$ zz~=5YKqvTY`6UAg6bu8c>NU_hzXKo*M}@r`oafB`7!Z(!4+@(eftPLJU}<|DP5Qlr zbtcW(APAv1N?ittef`K79GcPzKQQ(~@b7qK{5e2l|;Gfw_4w zDjViT0_7J?C|YNmS)kwY5BY)gX!(UQ*xnoi*5(I6phhC_x*vtg@h@{gTjM5(NuC0F z2<^}Ei|zyBK(C*Sx(1M!T!+dz%}xJw{Xlwj`n&6Q{wM}U;a&`kS9`u@bU(i<(d{4& zq=owoIg+`N4EG)s>pU>kJ%ue6TVu&=+!7S)Wa!kHYQtw;Bx(ex3N%yxtA-CeMP zI>=fuVCP*a-v1(;P-@U5u{HxgZZs> zu)4E_;^(ul2Iw0Sf8h`7Xa{D$W7(k9FBUbzNBdNz?hW&!LAjRErbGYnt9_t!ax?T6PF zfMsv#_p=9{KhA?SV0?QAF#cxz{>a>PEbIUw;Ft1zRH>d zxQ)zLKQiv0c|-nkEvaB@cL!*+{rdd{o07pgGU;aD&QmmhG=_d;9$?>J=fTnX$2oxO z1TE*ECR;%Gcz_17pyWrdGygk3G+*J*vEWvfClIJ|1x~%W;0vMypc8zCb@1KI(r6%%Kl2L?;er+9 z><1_wkQd|$=K$_i=)I+Ewg=T^)=VEt=Dzc8i~~0--N57Kk6>bB5zY3O6260Nc*=r+ zVE+6cFg!x!5hln3@`pUHWZ54??U%@JiCQ1919rjo&IZ`o*+k@T38goQBC^j{;|CNQ zg22l5#xFd7u7GV|+gl|WC^^)xT?26gTVNgz9!Zb~4#I%7E91-uQPDq!Ik|54{Yn-#txS29Otuf0^Up zxAPOV=0o!+e&MfHB#)Y}zsnzfPl3$zKa3q>P>xzc@%qZ&e(`^u|G$|3|MvKQng5D^ z$X{`@_V@Ys&pZk~)rbPK&(6TCBN?^!){u3HPV2~d2-h0S@EM(88(0TvbnCK!Y5MXX zzJYzgALZ}I^|!UX2HFM!K-WkNSl^rjJ6mg@us#IvmD-@>1?m{+WRCO?zah-<8J%Do zSjS!H0{qi^!8UT;`HZZ;mzgWTByAZC%5u$X0=xmtKk|odZokb25<){Lye1zwiwB@%-6Xo&qJVH2-z}DiV_@ z{_u=LeV=dV59I&z`P*0O_zQp6@Vh{^?gQBQHjz3lQ9#Sp50&9FOz<6SBWzgy%lJR~ zFa7rXg&2O+KL%H(Ky!lHA24Kk&;#KjE7V@B{5cr#7C8Z1t#DL^&#(^exjb2(Ktg!n z5B%R4&w>8s-|HWc|Ihl@#Ghd3>B<6Lx!J(*eE_h3{PFue4nD)Wpqe7^A$al^-ouMa zC~RNX%b)9Cs5wCC-T%-(2M`SXWiFsPkQek8+o9$-$|&PIU-Uf^U6y}r0JGCOKuci? z$nZ^o@DEF%4;lAg(LW)7nEp)v{k6<~FK?LWSMpfP-vhd;l6rA#z|21Li`LB0>n@EO*@ zyV-x^{)NT>OSm@S{(#mIzsk@*zk|ZIkmg4n_s2f}o##K?zrUVY|CReUDBKGG1_szh zKKnWb2H89Y#?gKZjQxce7<*xUg_sXu#`v2FO;`A>pMIoI*f-<>c|o3#H?&jGBUu^A z-|ZBL?exE$cx!ErLb<+K>Bz%X;b@MWd$CAa&sE_tg5Nc-Q$ z^H=+W`vGT#gD%8`$WBkw;ywYWqunmG6Jrj;qSbf(OX` zinr1k*=xK&+*m#8J^}A9@EO*@cd!j?3uz$jk9~dZ+x{`+^*bE@PCZAtBQw%>5?7hS z#*h4@>->Nnavy+p|Gw2}(2ZnRcfZ~rEFwB4I>Bdo8sr{w59xmdDZk6NaJ2{UA1nu>h%E-KV{ag5o5%D7;HmccEq=}_A0RR~ z1Ufdp+WH|a>>~i_3-51``xeqJ3CTNKKN@lyj=*AK- z?-+rJ9B@ZDplmB%6vLo{Ucyt6TAY*Mud~&kLod0Z36v{{Lvxv`X1d%If z?}iv4mT&t<(m&fwc8}!olCTL!n1!4%l->qMP z8Xu50KZP3Wo2IY+&7bkZ-*61@J3v{27{0G*6gKMhKXNRnZS!7K^|1IhppuPiw@lVca zPNp18LB|Bu3i{J+2(&Y z@4|@vn7`%&VsmyvVYBQ^Mf^s?V0vR2krDI`2~f|l4*Hc~8#oTGayM|RI2XbH&&L4m z>&S8e5EB|7QVwucyL{LApbm)E#qQOAK%I$j0CR|c$Ed6DH|rL`Uh9wOFpfYLp@Dne zKMMq~S(v!MBR@kufa(>36t`*yfXmzS_{nkaHShgJbxL)lmVFpTVz)|GWmCx6oz- z$G}@uf#6^MJ_hLLkuO~Z?j0Lo8aiK)1a%FF4bIoM?-0jaX?cXF&YtX>{*L&>+(6D$ zJF5K-5`(b1j+~Q734J?5>x;mDv=K-)B_Z(+5rC({1&AX1a~bTg<64zA6D@!2X6 zRdfZhnc|{s=RKo|V08o8_mFXnA!mVpdlIUTAALnX^7%W@?tKMFUyk5;OA#3R26%mI z7fdhjfVS~%kcymfwTKL@Aa)OkP39l^>h6tlTQ2SjXR~kP0gsy^!1Bg4NGRj@ZtsP* zerWSetr7w){k~vep#x|&N1}XYlgL>9(**l~{x?me&!(v*kkh#dJQ070UeXef4*44U z0ZX6qHL$$74W1wv(Rgo^JG|hoa*RR$c0_z#6LU2nEdT5u@S|f*0r-an@o8bL$>^-t>;7g^JU;A6pg zU|+6?tThLair96wk@E~@wC@GI9#H=JZ|}ah`AIv1H0XD*FQ^x2<|BGa%p#CMWc|mz z2R^GJ`)B9mulpx=)gRBV4J7Wcsm~Kc7SbX<`x79(lnoR$>wxy55HP#c4%!w+QL#6w zjiIQRJQ&xQG0}pCjwc6(UA*a4T)Ptu3caf(I4WPHh?AK9}Ph6 z_%J@<&-91i>2HwNE@I)ZPS10+M7 ze}U%vac)TO6DcIqn1-}KET_Tgizg!OPU$VZ&x1#6!=kov7{G;*9@=t(Ii7P1i`NRDYvEBddGx+8Hj@*wX+EYN8 z=hc5X|4@JYF~QhlI8WAw|B#>X;mRMI0CQyh{!V_-_!UJaK~2Rv=>8Y?clZr{wx2*- z>JoD2>c}wqE&fzwY!dk|fgEBl-$2$nI>8u^nIcNd zdw!9BG=A52^I&du{V&;1;23_kUqvAH+6}~R@Htuzlpt~1Kg&<9>m^{Aq=wx8>`{IR z>&{Q8yA5Kq2C~r}z*#i{mEkitQm2XBcVQdo!{91&1Ojf!Ktf>n7yMGU#=#4nS+Kmi z4IqXe?N<;Z#QJCHclN{8xdG4=r}U>|NDkluR>)Z-4 zO*kqXWPkKqpzY^SmcC?~fC_I`BnF5c)C38DnZ6>FSm*mx{el@C|L|k!s~7_&duG52 za-O=|E+Fv`Ut|0q2u}bvn|YMX{9-?cJ`}_cgvR$*%HR1f7Li!Y+5S>6-kJ!OCR&k0 z`m22=Trc%6;fG^sFX%;$c@nWNB*(0PP~Rm`R$=Z0zE#|7=G~|MgJkj z6}_jx*ozpx;-;qbS&cTs)nwjy@XpZrG<0~*i2Q=(+)t3Lzf6M*~r z9hCpB3^}Lg!P>VNxrOm1kn|=W1ZyS%f3d$a?gGtOU8v_Cqz=Z& ztgdhTkNQv1V}g4t>U{Xge+}mg?Z1XGdN$ozAPTXEpQDjFTjU*VgZ5wl zFyH8TpN2gCnU4jH=ie<+=QQf?-Tr&=17B_Ti2vbF{1X2z&VNPs|7!fk&*Osk2Y3g9 z_c(YLMct==7e9m8DpB@U#AXa>Annin{oUWFASHC55-edb5iARl03%qwLgI&D2|Gsq z*@Yz+1_lyqgesA^BP8+&`P(R1BGEkkutfeU2VEAz-^kxiq03kBHxl)PF5%Dr&GZT~ z{{c@S{QU#oe)#)`@u0_v9yfX(Q1fE>k9qn&Z-w9H5k0TpgS3#g$b8z0i3l9VJ&B8O zIV>c|D}e%o0K$P02MPvJ&~cAtcvDCU2TA5QYBm@cLbmGfgi*3$BHJjF7}a)ztRaZ3a{MC{)CfQv#8WAJ^$W9pnJ z9m|;l_p#k2Znt?C-x{I4a-5P>hU%;pozv;${JYq%jqEBP#&!}*bbh2@z0K%rlUX$X zzF{N2ud|azM~8AIRJ!xAB!1(937tCbt@GJ?)D`b)(LNID+V`dKd>4Q0r7vj@j?~UX zwPQ*0JUZ~gk3|2NU87fF`=hC;XG4N{Ho-CX?1OFYTV&x?-`TBq$RD0tKFp8B@Toq;ayALjReg?7)?IcOH9k$8!7?NzJC>cwCALRt`%U zQbYq~%r^M?9LdaL;%UtXeRrw`l%4l2CY5ng6POybg=8n_bcx7z20J>^-28IeN4XkT z*-D%*e|f&sGE!-sb@;~ zGy5Wzcb%1R6l0C1`|aJ{t0ui86;4~My!^8?S0i#ivB_Nw5uCD-usrDSK zzq?1MsTVzur5`Jl!`b`WmC56*Hh7=Y- zEH0UjYbIk<1w9=ypK$E>(c&4ADw6>Gp%U$ zj2mff$W$K9UrM$=Gp;s#O8D6+QR!;Z<#SJT%F@!KKk3{bl+L)8z{tOQ^Rnz7{8j_5 z(?`$EoOQ4tsA!ukIC6S=`)=1eo#;=@t_E>MRpK%jrcIr8A@QCU<>wMe&lv1>EYt>t zW*3W2t|u0G3x!3UBH$agC08$y6F;%tKc4d3B26be4rei}Ti-C)E-n4+bJ@6n3HdFa zcEbc>pUFs~@abCG14L6VtZwE6;XXBT+-T@k(&7Bv#(%xz!hUsZmp7-#6mpI)Czdg^ z+lW2cD_yO)Em3w-fYf*Kj&=EShTWGCo7t}NQ==_#O}G)(>}~U?0!6!pfN}-$>~0NPda6%>9!1$)Nevq2;yq6;F%4 z+~coA%j@3y23g(?j?(ADe-Wn(o=Duxe=$S#VTiCN&UTn+W*j@z29xE6$-oEF_HJ^D zgP2MyQaIg0ERDhU;?9e!;GE&7IDUZ8h{oo{bE!-wsrM&sGt;fRX^KTWk|eRYE2Ga% z%j8XG9k6s!qxaaIQ+DCSqntQOu(owv(1>w*jquKj8_v6Azf#T9RJM3!f)_}~ql|bP zJ(ww9^M%IbVD`NnBpmAll6!XX!VccaFCigpU7p)%D$yEyxK2ZpNH@|?%7dq$ta%{q zU=pu?G_S(@ca=9zhTVB=b0wHfO5kp$Ym6S{S!%Wjo!k2u_7PSb7d#!t_2sUyHc3FT z&a;X&ytTc9JnYJPY6Sd;VqOZ-V&m^=>`FFYPHflib>Gb(c&g{R@kSgYKHg`1bBV@L zKhcn5Y>1~x#xpRQ?zp~qdiXR0g$Op&z!%|Yzq;i~`^R=yf@u^4q)iAabY3qv@xB1_ z>!EaQ7B}90Rt~i<;-w=^esKC^M{#43#WM9O!|6kVz88-(+*`SrbabU(k= zj-}JiW=IGZ5%ojc1BD&IcH2u~Bo8n~rwS*SFT|VXE8{#nE?^!Zb6K5#Wui9bK|}bs zaA?R$UVm@wTyL>vrE+~~z1;YiJ;`cZ93}5f^5Vc6)?LTU2)tg4DYdStkfoQ zd6&m*MCQ6UALE-i-CZ{uDDcH}+9-RlL6yl#^`zJeb()R}7LV~}=-gIm%w^|7t!9>a zzbVs+(`K=hgZ#VuVuMol^zsVbdlCDpsGY=zNUqqeJcBWD!2Bew#?>o{ib|gSYil}$ zrhJXE-fn#)SDxmG*fd>FbLQwdni9Vx@T@Fjp!!guNVgP^_>fC+<;r9Qm`H5DL0}nw z@pZcg=3^ZlCU-^4hB%^nW9<5L8R~OB)Etpy!Nu{)FL%oPnO5?I6SRwt>khxbSITkn z`9kqz>-lidPNpcM7rEd@_@I!~<(D+9PaUpyaN6v9QbbT8#*{wEXB;|p-R5|%AWnth z0ltzWT3Ea8?t zl&s<;Lnr)`>`8F(6CA}DqU}26+@qc*goJ*wo4lCLJ4Jhu^NBj%+WU^?JYQ<3?%P|R z6Y!Oatj+H~zcC@Sv8fSsFLh&oBJrL6^k9tPQM2}UX0#)lh3y3==Nz)FirfnEy*E}! z^hK7~eedUGM%@+DvRx@1@6fl&-|2Zad!txPfUBwqi}_4&KDI1<;HygeQH#!)_QtJN z{!mq?28?IJ7cf6a%o8shIzNpUgDcLF?sV~v#%J?Y?URp~kL77xyuDR;bWl2&zMD+7A)u>ctzTr{krncU69*J7Dl+l$5g+#0yngqR zWqX$JgC@rFGc%-|wYtvT)vKypR09+Xqp3#UNxSdWrGW@BF znYDq1jDzkpbH@5bok#vJYZgomDuwjhS`NqgY*O>ydd?T$yXh5R{8YVbjjZIT#Ds>o zUg;n$K4pis`smw(_cn^sO^8D%+Ff3fB&*ShrU8-ytv+7HdBtU22g1o02CS}0?X}l$ zjD%$5=}6Km5|g+~O6*Cai5MNQ=Q`)qOSH~gp{t{WbG=wj68TG^CvzVur0%?|m>Cf@ zSN0Joc*!F0GKY-NKx90C%QMRFeg##~OTxx?G2L%P{n9dzQg4|IR%UGUGzPgGQp}!s zqAgT$2(OuY*BJP1?W%@(NT^A^^f$l_Ug=GLsw0&k8%riz!&<<0FMX*gq1)asYP{{wOmMcCQxt-4=Zv#RN_%7&cGyYuU<2gYCq8p20Ma|bD|l*W$Wnfsn>@cvzX}JOdm(; zceh(iPv;!*$|krlktQ2c>3B5$0l|9oWuw}+N@DMP(zZKqi3&5M9Ge45Fh5zyX!+-H#fYavFnqyLM#66M2)^^Q3p54zL%OcutUbc zJI!H5RS(ou9_y6dIF_aCJH=`otA0}T!uDSXBXg-*36=sB2qA5L>+koaQ7Bb1W#kZF#6$n27Tu2DCoO-|q( zc`xCqb~frmZv#sz1dmWtmv-V?zjbeqD0p5n>FV)FH4;lZ*wIOU&MrYIXAoJF9>dD= z2Dtrjb?%QaRy>Vc#c^_cI5|c@Pp=M7*Jn+xH*MTr^;4QR@!R}c52BRZ-rQ;wk1cgB z6D)Hl>~wk@<-~G%lL9tWxOy!`ftC4ju=}mES!0FE_4aqf4|u>srR+vux4zfV0wvc+ zX@|zjL@eQWzbZ3t;M45a<~VY}h4l675(~kq=l01Zx}p&~q=ee|2j3y@7J5gx9%;7L zCOrePGNT4^Oe|lNGS^rN!({*ZnVG*XVsWw&(v#s zukTR9OJ}`)z_NR+gwXE#nH=dtU74~~BlpgY(>wxXeu7(~{z9It&5;9jN?7MJ{14pJ zDU<5WAO6r?08VXx+L0*?>!=pOIv{a>cs1MmquqJ; zQp*)u6|S89mhC)A740iZ28yq(orrpFS;(yY2~`v%h+SvFRSAaIBth7v4y*+=_z5eL~4eT7FHo>qfol zo_#M350=wjtkKiPD>`1{sbt1N%+$E8=oO*5^*%%U;rvox>3IS?MwiP3QiAdrxAbWg z3%p{cc8MhAJSD%--0quy_!0>bh%j5fpnC1DIKyc@g}G1(8$zFZ*uj+~vjxfqe3d;a z@mJIinG@JG6mO>IKHZJv_gXV}j%lK4dGr)ncZKTv{g3CHMq?5SoGA$lajbcdA0leU z(GB48Eyz}8c1(A5e-ZsYh_ld(ZhM>Q)Sh*TQv8@xQ>Hy6EXv*6oayE7Ckh7oZ2I!C zX>Q^9t6d8^?l2_2^wybxQ$za9F&BaAS=zl73;sA+)|RX%=HHsF&S!jBW4z{Hdi5rT zf2I1zSBX#flwU>WsG4hNv8RSUJSI|QIVK;@TwSlkQN~MsnUsX+e*K4r<j>j-(3%4x!h z9CJ5T_g=72+Ge!f3c`xyo)RQJz29<6kzkFJdwjZ?{`p}!U3`Yx7QIC#Q4$RtYoNtM~~srn0G3) zdl(GvpF2k!3sn1hKCn0eDdlcr)b>fRbC(P=FTX>-$*RbZK$~^v6mpVz8V-|*teej! z^q6lXzsZ!y6`jI7N;*CAJay_xRCV5dPKi?=%|!R#da#!;?*^yQ1z|b1H(y9bI}b-a z*0$*tH9xyUQ?Azc$|ZA1Tw9kt#IU}ajS3HcGVF3~42Snv_Dkzl3Od3FvgeBH{r;3> z<~`NaEIOT>2^`7_4;td*<3~3}!^UjGSn?*HO=997B35)Wrps}BVtQ_5dfa(wRX%8N ztKoUSpi$&vm0P`J==L1D@u;*So>$(K!nJ6^886bS+7!y8d zF8-Frd7z6dbS#ncu3j9amOhVl#phT1BblwDHoc`&PQ>?I)hPuQ~xmm>f zl2NZh>if09TWRyunU5xPT4aT(y@_-zLY$xXS-3smNMePG|F&`ihv zU6UCnscAi{SuSvG!ECNdF8fMTEz=zq;vND#o^222JIYVx-DOKp%ZUr_r@FDVg9;S%D|U8irc#T=peR zzg;tFnsw05WxFn{pSPl&gpuH4$68k6Rg)#lu}gt6n5xPL!qrvp>V72Z;qtO&Fvk3Z zsNWUE+YDYGE@aP-u`J3T3@Xqf0Sm(+t}Ts20_pf?xY#P$y+n!(1LEkoUu|YNPG@P! zv-Qm^xNH#aTx3c~Z>1SCA6L2AczW*#npSIfi0cl!td&293 zGO57>E7RlI#C_RB$+EWhWw_Rhr)S3MO!}PaKCn1X*dK3B2)8qzX*{U0zuYv}r{ej6 zBM({XbG$~5?ebPP8I6fN?fPQN!ed1kwb&l3v7`~J@yG|0cCW4K=~JCG+$kSOjX8=6 z2WAO5?_iP`C+(ZNclgm~Y+B{>k0+GFpURK8`*k}jwK}sU()VEJKDMTk4X__GL98e~ z3fH|S=hYOy>|Em%9`l^LerAVV{~RWTZoZ9Q!KUFke-4}|mX|(rPkXqFor!coVI_l_ z)8YD!8pF9h7O#O~)$;@uq7!Ajvu)h6B%wPGWP7luhKp#Am-V!2KS87n*Ue6MBs#UOC+UtOC zKakoUpF5YT`VpgCn3<+eukmEqwvv{8)(48B5ksz`;wtZ9s_nJY)0cfOrs7OboDBZB z%f9`hPvgXGDxoc9`-KOGU$&AbHyejC-CplkjbHTY$&O}2va(L~L^~Y+ zwZZ{82Rwi3tOt&ENLjze5sqO-mK)UUQ7;pIyNgo z@RFS1E31F6HC3~9kpzay_ zySK{vUdG}i50h{oJ9f20L%)PLE^r|vPCf3eWu_su@tN_WkZaat!Hm}`-%%-ruyyWH z%|7DFd5S}>kFSEsxSxe6P`gFfrcu9+^xRa=@u^StH;r%Eb%7M`d$$ho@tr)oP$;=< zIWeW2N;}(nm9up49j%>g208gbTdD&3V|U*0rDNQeXDEox9LH3xEw~rUXZlI`v0Z)t zWqaL1Cg1cJ%%B28>WtZOa;ckgMl^ZHEz_23cyA7wdE{nad^biGv6z)*!-dO1ryRyf zdJ4Iu93n1wEjNFwdiSb(tp%f%JdM{Y)p_ITlGW3c=8B^w(Y%LJr`nSeH4Y}Xke98G zPSiOVtWwg|=IX92@6ZulEi-Angdu${dpGwsz0y(h%hl%u@rs}NWL(O2b#b@2KB_d= zS798)ar@#(E4@mVO3_;RgLP*@sY3?Sb!(A%OVmq>Sa>5HALgi|j-QSlRp)(u@0xOr z+5QV&TbUQEPrtJ?qI<()NiC3!+nX}ZU;K38h?h`}$Ht3iJEopxX;^lfFAzKCUJ*K( zs6@BnYV4p$wkD7C?xR6$#RXgoH-$dRr{mCmAXAg5Q#{`kAK-89@wzpq`E0o<#cTSc z7c5m(rqim&Z*@jeeR*km`r^k*!FKxPfFJ^}5+G+UE#Q}FP&6iP=Z`LEz&=c}!2x}-^$;k_*S`0>%jSdCmdtt`qs z{oVz4olFmz_3b1k1?Hir4hvP0sgYNYA8wRL_2WCN8_w3v-C?@&G*gXUSSj>PPml4u zdEXnHR@1oik6#?nUAfu<7X6<&a5I~SSgu@+GE{IeOz+`2p)4}9QLAf0nm%y;rbt!beFQx>+IJ2fS>>|QR9ED=njfZ}$5=iIxPS1j6&*BiA)A3|AmmY8|qffP0i2==fN%G6|{mHcO-B@sr;2ZmJT_4hr zdV4+~$-zxzRDb2NXmSCIj6|{St0eYX_WE4>b|Ke0HXg4=tIHHP=bD9M{5`#Qr92Ws zcDl3HUN{|kN*PeY$xdJ*ytOJ%pFBbUQ;>71w-br5kRQFDx!-bS}*fO*%N`RkHf z>;_H_n3)$#aj#cdL zsMVIG#CR%hAakGjT&K;D-zmGZ+vN8KwjgSIgzkU9zGV{{H0(-c5jxA6LHc~rH{AXTMERy5?C*Jj%jp-8$|28vFgGAgOFE$jN0qR*j}EN3nhsCiYrBK&1fmMU zMWqisw~n82yc7wxk-qT!Su zH?NsxKHC>kdN4r(iznKca#5)BzQB&Z_(crq@YUq~k5n_;Hp@Dm4<^Me+#bDl|13*5 zIu;g z!hzUiDpoo36GY<7%=%bLNgRW+NaNb)$(!$!(%QL-I=_(B+~X(ybfdk>a&G)W(=o&} zG>o6F!o+VeoECaNHQm*B*l6EWZD+1?rqxdBy;Kj=he>qYc$yNWdc|H$gpzn*eBWHJtp(6)ub8> zWIY&%xs!aZy(j$xn`HLhLjA=JyxVR`@&OtXD((-@T&8R-T5&3 z3u(RSAFSuxX`W9se2`dHyL&Cs)tCSa>wS)GpRw*STJC$-HdO9w%1AhbhibMOdNeqU z_PWPBAkJDSO1H;PIB{2m)FVqw>KcXh*BlSF&2>qNwD{L+az~>R$yaxjZn|6_ zuVAa|J&5j{N(@b=SvqM%la%)K%biRQ zqYaOX?gzOF`#yOqU+8Lz`+Se-{YOVxVk%~C`UITz^mIp8XwPeTkZg3Gzc>2R{Bz)9 zYcLRZ)cx)jM`n&asYS_1V?k~7TTDeP%ZjVladAoNH|fv14;6Zt$E3v^H`VAN*3t+R zR^Z-M)sm;pPbVV^NfB!(2#wRsKR@MHfZ6vVJ7ALF(E3Hm^VGy=cJtqu62+=ZFEJ6F z{z74c-DZdAABXgz4iYTNhLao6hXBwO6$mjZ1DCAP1q**EVnc4r9t z`s0|AJ1^=niK40G4<5 zJduc2ZNN2sdRL04cUXoI=5hD`<{&W$jPv19mk`OtoLxMq>JhYBOAse6-y-%Q_qS*3^5=pMFdPTs7xdaMd%V zJT4_Gm2vG+y}~BJBK~70{@r5HW5<^0j>p`Ryw`0a#5qGTcpXc9zp}3+KE7~zQ2^7L z+EW$%Au6f&5k%7m=iO<_E0tUX9&6P5<)@5T@k=Mrv@DT5cJOTGbXhyrG?^q&O0=N- zno+&{VEfrL?E?{m!=LV$iD1)4TD&56w!oLe=k<(*l;sM1hT8JC+!B_adSG64#=*~U zqPja(MJo`qTRB@Ej+&&LBGmhfa^1qd>X)13g zF|SUFQ8_fHrK3d}fcdypM)LVap2k6g`#hKTSQ8-*teJCjuh%XGRC9m9zc(sXgfmFX zWC^^L`N@h>R64s{Lc@=^H^*KnSew>DWxwv!S%8KiwM=gO2odSAQ#Z|dF;*wuT z#3GjQ3TZ@im{yc_%_zL%>8$1>eZ|f8t+tqjbf7&_n*WMW9zzGiApI~d zyI-T5@{^${y}EJ3_cn!*?R8^u5t9^DQdcA+xOvId@f$ua=IN?58SlRRoO0Fv{#&gZ zUd;JN?j)Rx{~}bAq!8dWA!|sn$NS4%4&Cqz1;vg}N=5yKox`yQkBr6Rk zNRLVtJ|~|bRLt@h;##L+vfT0Z*(4-;AbSWa#a7(+C=bp?y^>PPZyZKO4;mvw3 z$+fql1HvB^)3RP(@nW*TQ|dbSg1?_O%3{hkA@BB{v__ipt5di=D`Z9yj5)itp$8){ z++#}2M^iR#EDjiM6iMGP?P_|`B5QJp_K=e>el>20@I#z%%wk&a&+{{up|i0{g#p*u zFRu@s+s3R-;Brs8>S-0R2N&tIQ=}iq+|xdJGK8Hvmhe6w&(^NzL~D)ByU7!G#1EMr zi5+E5(tNu26!HzTN_MnO^FM$u77jfeC0H>ntnbuZMF|MFc?J9nBco!j6Mwjz8`Go7 zU(a}bH&RStfA;%%nE?J)rR@VDR5f<tuTI zou(2eS;C7m#VR(>PGXh4BX>@fQ*<2T9>eIZZjR2L5XHIt0GE$#CkhYi;X*jAN&XtX zgTwA=A?X7TZ+c^97KdrZ+KeC^7qN%8`B-XB1u65FH1p>2C>V1+CZ&`0x*~J%`n=&K z{LOmPbE(!*doJG{Q71Z+zudb22^MB!_}P<&K3TN2x%*36PSZd3*)FH2{LEov+@=!q zG}{Z=ri%2->uMX`XRXBQos)8T9TsDwcj61tD;k4lN(BjS4xHkan75Rppj3Z*E6eG# zlzdT8!jpl$WA(ur^hHMlXNFhD*i0j|Y_M+E2@VkE^$(5h-*lPwVs`U!ncay&N(`{CZ9=tt&G>?}Ue`DvCq7(+=B$dD7uT#vJig%Fv^~Q=8 z?h~~}Q}GkWLz2%I2L*MZ^1+^x?&PpHb6o9J^??t0J!n+t1tJdM`ZGUaAFJCr>m-D+ zPx}3~&U?n8qJ>^fA}NoZrNPs?_uQBY;vTh8DsBq%Q1#%)-J~IZ)@u;Msdu=yxU5V| zz`&>fvue1a$>}Z&j8jv5?hNM?Y;D^fPRh^UuP^h>$6OG(B3rn<$#nWex3t(6ui7X? z8vg?158dwP!~V=4+hVe&c)?2E#%W>Y_|nNX;+D?~D*U&w$yjxd&2i}-YapE*bLy#B zZ%j~~o^%|#Uc6CvG*xA^LCE>)gvlIZf-TM3egsoWV3IdOl3mzg^&gIr@*b%(okfBUEFw#ywaC>o~ zvOd1R+U%(L30Zz!Is5*TqF1!To^xrNXJG~(o*q$njO(xyd$2B&nNeM8ZR!q~S_iHq z;N(^BPz-xNt$QsBCGXp7Rn{8!2jGcoXLwkHbRu%PujnT$&%X?bFUMgOxDx4~Axx>*L^^*Pnd%VWcF@d+v?pNC`} z`nbs-K+8=WXK+@>d~CfSFABr!(w8gmZ$7%~BBAb)a(<98{RK_JbyMnlx)kMv6-V@y z)*c3)n$);(qQoYo*j`WM?q02vesaC^j(%dVt85wda=EN;z3cR|xOT1kT`QjY0N0A? za*D{KfZZ1{S`ozRPKnVE-PmWzvvw>$-#f}m?61Hjiu(Cyo18*&Z!9pI3=W6kw+$L&UsFL7FaWgd?YM^uV@2qznI z;sCESv8v7Rln8Oo&UP;y%{AM&Y<>0gtss&%>h!6n1fl?gy1W zGpFsTZtmk{9{3=+wa>`t0oUdTH+K59xu9P5=yXrjQ!FYEUQy|sQtNv&qhZJTJWMH< z#DnL)X8r3MX@ZRN8=VOiPr5QZiTd{#sm*#|xzRo6z0HOhE^s+x?aT;C-i)=;jas{E zwgjK<;@0L-hS-SLE=yYv-iK}A+oi-0kt~-URSnl961^a4cfo6R{o$wQ+g7Q5EdFXF zvh$MRs}4B3V#Y6=baNXI?$QR)U0J9oaBQYOsxdj?pSebJnQ1Ke5GFpqx^IN@(O5~x zpsaA6k{<1Dk53rPNmae2oqUvUW-ruP-il{&uGYKTW`J8NaiDi&edb0>yDb$*O}$3k zVg8e2$lLR|^4<9Mf{q(?r*4re8xfa= zDgM#eiz2J4_f}H611jOAIN=8L(v!eEdhdd$HjYP9#ltRSgqT3>Za zv~E$2hFuKqOaGSM{em}kIHtwuY_dZaxfnV>V$oSL|73>fywY`UpE! ztKDh+#-io(m_5x}A`Lm_oV5uYZ&p&d#4GpJ=Zd8ZC(0?dXow_U4`{F3IAq{fJkrIw zwaJ`XFn54_%S)jwk~ZJHz9{cnyPBwBbQO<;8QHmw+O_70d|M}+-Q$~Yu91&xQD=>v zxoI!*%)qPvy7)<&$>Wn`DrwD9;k&-dC>VV5FsV~9)lsb8adR&j1)sx(n!gteD`39^@n_nb+ zclIE1%XPA_0PkE6Ep%rkhu~`Ty4`&u5G*czojxP1S9IUyn6SCJ*G5eW7BVuV8#N_4 zStH~5p$EYoaq@R=7??wPtbz;i^*ai?!w+h6#|qX{spm$M>)({_wAhb0_kH19RuG8{ zZRNT0c!O|Ml&wI`8XP@QL~q%&f!yAxJ5ImXI*H%;K5%GF$wDoFlaqVU7O2d>Cp*8} z1#S}FQl=>vop%oN3f?lEE^H)J+UFPBK=HZ0Q8vU!s;Qn0L3pN6C+uzvfiSV?Nk0CZ z^t(9hbyDxI?!OqWUD!8g?hx)%{D11Y#^}hJXxp)E+mi_=wr$&)I33%zZ95ZZVjC0N znqXq{_4n3#Ki{veuIk?R+^W7^2m92S6`94L`lo~m;&m~@w*UKkx9MfZxzGjczsR2b zG^I6^vp()2fh&hxtS!)C1pC`HXW7G?ESkzZDh9m#hr#$@_-D2ns+k^*=C|N+;~FI9 zeWUOWDgHOnB;G4w-)z5mt?bv|sObeCcyiOt7zTC7D;REBl5T~0KD^?n!uUT5Rh2t7 zK`8~XdVG^yMaA;qrMTEg?eWO!#fh5DPDxR+{nnkuy-j7m`{wFB1e|oh?;(>@{(2?H` ziAwf&GqBC^qne3qF@zwJD;4n#&LzbUa1fDXf<3@S{b9sEtr#l+R#CJlS!UEo`SreB zsQ(kru34%Gu>ze9d1GJn{UFeeFmBXIi-wi;i9UBn`IyVohoEIl2}V@#Lsn&0Fb7Gkga~TBjVBB^83_19!%3GIjqM?f{ zBL|k9f%Vg&kkSa>m-eRcRN{xArK%V~=B@cHnG`xA;iSiJ9=^%~2vH%*>z3aS26`Az zx$x)b_j;qSmV;7IAlEl*rjg`9u!l|-v}Pu2X}EkiVLoah$7V=k@+8eQD`rEFLcCWr zJz}BKDwm4k7%_l?tcpS&Pu7;;FBvTv$dqTLiVd0D=Eq~wl+1#6mOwBetaK+=H!dEW zNfAjuF0#kU8*i4^^yF9$SJeQRPaKBh27QX+$y>~dMRbJPX<(pDIhsXD!>c05f>)`9 z;y3A+@e)(?{(NUOpCE-Mn7n`hNSM_HEc#ZJ#K`@SFiUC)m9{KhNw~?XPuo_@QT^fT zm&u9|NF653b|pPd?fhcIXfh%F z&6hq_D1ujRUgL^m$998vbhBg6k(oF54Z1}a%4B^xp!u`tI5HWk1F%-tUyksf3oHQvkdXF*v}3NMuB<#&;U-#gDmaQD z!#{&V#>}bQ-qNc#Qc7IkLMpaF}iYKrjeJJ7x@jg`NA+?d|9K~P{ zTYw2^CO39Ii4R~#6gqz{#^K=jOE9wfv|wUW8Y zjVoh5VT_Dr5FtG>Ob2{X1f!dtt=7>(Ut%>C?%5eqPZmIEUIY$Cq;o&{b7W4!u#opS z#N(lH>s6$GPvZlcLPm6uoyncP0l-5_I?M$1RHUJSNy5i^cIMRJRCq&D&^I;6R$zR( z`xIyZa0OU6@$p3xw((7AwZb4m4vm({i~%oa4!gss!kOrl=4JIhVX2Djg#fwr;*uaU z?RQyNC>7zP5`LNQ!-Tg;$Cy&ejC=42Q`lC8*a0jR>Ko=FGTz28!LY&OGq&kg5n_?~ z;N%!97v(s#GV>!+(4o9W6PW2{3FKByBv*Api+SMD^VTeLQ`)ToXqg1vn^CZNOKucc z{c|EG%`E;2DY2GSQ42*akW>N=8U-uM(5O8fAZBMGW^*sYk)?u`A?L zU(GO;qE*@Wi+##%b20?Aw6LmHqn?#TSu=kHKANfLu91W;Q9|6r#ZaZGtsJDZgEP}g z2Js|Z5c{pL&k0=fP6!03h**(46V;9T2v7xxSIYDJq??rlV-H-Mp7ih}-40x$EWQkm zS{L#TdNvvm+ca8jcd9^@ELbvrMbD&&Di^DglD4vhxec(_4gQIYAjHQLmQNq;4_7EO zdaas4nCYZm@Lk#C{e9JxIW_b4lfgFsK6{PRa%iW_ABIK)}vqD*5Yy?XxTp8b2lHS8Jda6byV3yOQO_C6bA1az3A z(nPl-Bu$8F?ivhp!e4r3qKvA8iM`nL-R$LM4P^!x1nGY^6(y!W-{9)u{^)5-MyqN) z-ZW4HI+iHP=4xn4>A<>gEF<3LGR`WZ|+h9`w?WeU`Qh{#I3W&*->2) z?M9WfrHCk4<3SryY*rKuF9IAi`VAMhH&3y)tyl&|?Q~1Gv52w|5Es_^HUnwtMr6lf zv{>8xmh^-1tT9d5$Z4RT?uANdcu@|FyP-&BSL?#6Bp_ILD57M)UqMLzweYs)e7qvK z0;-V44>Oyp%EL`w6wN6kj>tH~8fi5%D>h+DXPE`<@qU{{fsr9On!nq9H$!TfHISAq ztT@GwFkzpaamHh59h3j27^+s}cb=Ab9u%`(GyGpaf*6Az^l2W!V;%o^dh;`ey6h6y?PT?LrUh6|GrZQqL?l4^P${V$ha=mN0W15 zy=*qei$2%Yj9$AU_RlEmlcyY7rxFD~uK zgC5QO!w&|oMyA!Gr=&isn5I7kfzzG)G;JWWD$Rt#O)V!ot-VT!ft`pt>+Mg!^-q<7s3r(WDrUd=29VrNHN0z9j@P#T_%ig1qp zmadb1bj$kSd)TDm!_~g{4Yr=l{jEk-{VRUrUHxF@W{?!T?JZSWKNl%-nIF$~(2DuD zqQ3smPGCs_7C_F4YqiO4@D!c`d}l;rNr>338(gGhXr6ylmVQuy8>}v~2esj#6B|`L zqUtDUo%&MWlS+{5ihfxxSH4UfML0vdEhd63_JYJPvUGiI<0E?xMmY`dM^t0m8|RS9 zKQqp)P|$Fu>trL>3}mG}dGk-A)cW4Qi8jCFF;D-%1ui07A)RQ)$;M^^I} zWfkF=%RK|!?q1>*43I?jrUzG8ebgMd(Y^{zi~%P?OY`ZQgGxn$rkS$Y7HkwM+{YSy z(M{ay-)n3RFH<$0&VOq*`Z%%0W#kYqM(7U4WU-O1^Z+W4BOkM)mo8Xo#xeeJnwIcL z(oKSfBHDj&Pe{MU!PUva5VJy-OvebP-8{%RmwP!d4q@0g9r`^Wh7{B{GY(R-_IPl z7={64MDx+~=_?#JyH%XGf+szhY}AUgve$+aw`H8>vEO8iyO^&r|3P$4YV>gx(SjPD z#=CS*766s}BY6j&-|&a+td7icJR;@Yk$wl+Rg@|hz0AB`JF}En$p=dF zd*gF)YAy*&M4lk?5{{7wWCD9V+5yg%KY zaJ|pqh@Vb@ZglXGZ~@83Osoy1hDcg4=;6#n?R8qt?E2z)Pr`j~{))b)QSS5s&0Ke3 z$IW~yOY$=2hVcGr76?jnUa2~L60jv~68rb%a5Xh}Kwl^J#p~+eZqr~ZZE&~+ZHwJB zWQ0u+)Gq`(P60=`D~Zn9N9jPF3<(Ps9um@!l4-`u0;ioR7Z6AZi9rZ00-Md!ifHgl zJBG7Mx7A#G*<^g(tFvw9t(eNB&$?xivGVBe=+oYns-~v;jxH!|z0z6XL2jVJON~?W zV2!r!^g>G_!++iOQF4%P!7;#v|13PBVEJS))b#l>1uuuC$Qfti5|vq4fq*-l6PYjl zK9E6x7e7sTMW=u4eH_oqJHd?BwHE8*r&gHD-UkhCSu9t+P`N1!QqW5~#_Uk8BQ>`l z;+GQD=coG6Q*9r|#mFluwV?5wCc?6)9lydSkn2E!lIx!{*C0*una7Q7%GvQ5X7l_E z8pZzbMU{MZSvPP07d5tQf6YD?TF;`Yxkdx~h}#^lKwrfBxa1XN!U1%<|A^#o^DS9E zWd%TJ^#5@II^!c;1Tp8pVstDpV-CY6@=I6CBm9&Ou$xh zUMGba3(}QS%&`!dS-U33jauT^?wF_wsqRP0n)rv7koIEuh%FayAO&5B@a;#4x1;T< z23iS)z+a?3rKYZvSzbgFh5X*S6n$&h!%+Uloz=6t^9XOmdmei*SUaU>EwbqyRM<-K+d7zWfq=z_RsZNGM4Q2{H z*v^prKua!^5*4qs_lkB$77!8jU=v9QPGq*DGXtpD9k7+ZCmlr1ObaPOpT=w<*?8>d z){`ZrH|GG7YX(Ot;60NaB@F|0Sqa7o7GS#7c=9*L1nV%P;AF#eKWKh zg}O2{Edurc#{)J)#F|sDD3BXHLg>H9_MT_7WcszIZd<7>rCPGj?_MWftEk@oBUC5E zxG-^(>jOUN{hD3KE&3>9*6x*2zC0Fy- z^>UN+S~_3HUVerBT3%j*_NwdK)GeJP{pOYSsrVmnjRs7w?*Pow4s!;(2I$+M%1VaN zLcJcZeeU;OjG2<6$~=8WB-@`=<=G-xC*UN~8vReBe^LH`xL)l&zxWvmT3XLUwcssZCb!!68(rTp#7gfzp-`qDy zJd)s<@DiEIl4<^|;CA9KJL*WE7|2Uf{B4(GBphBWLKj${%YJ(QIo&s;!Y4Se9j3Xa z^Tuq~fFFY>3_HJ8rGklwhU{+Vg9ctx>lJ|!&1ABefHBq@$nL0Yt?Sn4_9Y6dueG)z z$j?dqw?u6;V`9)@HPXj@=Fg}_@o$4D-f_`E?v#J18uPgVB&)nkb7Rm0X>Z}v9Aja^KXsO*|XXTtKT03lwK zlzn$GO#&HOpoBPV8CHta|$l>c+|^)*70MSAns?Iq!w^GEA8%keX#n~%Ps^)R|;zj zu#=MCL7(bOQ+4iF9m&T5=8nXg`q#JFUT2JRP!9W0wXAd~AATJ!d~hYb_`qwHrIu#* zuZ@3*w+74VOlH2*Y$dFFm|Ppqcu5+|`Hu}`+y%gQQ3q7-lhF{v5B5Y(d#WCHH2gXk zf^v#@HHShW@j;#N z;0Zhzyj}h@M19Dza`%#pHV#A$#8f1XIc#X&_j_bVEJHr0^TyvcvKs!#_#XF8N=6)| z&b4rUd6o~JnXVOM)D@}7Ibi@6pF?(Rf@rTA`zCEJcI9H zF;OeDylqF?cVj!I`Rhr{cf%lW+mEJ_rrMASH^a2f7I|%ZU@b) zS)1BIS6=Cc{Ygu=d9xS_c~bgz@Og;dsJRxYdT#*maHm!6U3ob8J*6gY4$Ow zud=2Fn`_b;@1VT?s5C6dtpsawu--FuEQ@JxrDjYE0lZ7~3Gz|@sf~EqRIH1ONrTVl zM%e+KyF)-1zCaO|CbrMC57orvKOfSo9yWo>5^4fz!dzM)BDx>HfdbQrKbq{Z-X06 zv=l8~95W;9ILsxMABt1PzT_wx;)6=A@5hY;BI;%Z@yehUhz(9+J3r47bcvL&}UzpR% z(w-aGLha<(V?pO9SdNkZd;q;(c&9xFpud#`)JpPP1R*u$mR z*4Z-zcVRKj{THZ-H`vo1`BoXTr;i!{P_19({y}bJzg)ra1u``F9W=g(S19A%F5pM8 z-YdQq3oB2CPbs&*pC+qnl~~!AsPnsV_RQ=_x$-P^$*P(O9`QO*5b~z592h8$J40YX zscOz)=0~KD9%MUMEcBmvHCRGK%fsX!+)Q&~+^Do|XzlVb^_2*0Je5a@*OIk9luMeS zoDqjpEM3_9@Ynt^1gQIjmUt&AKnZ20tfk?cbb)!@^Y(Tupn-RJ?%udmlU=qoI6b*X zzRdaMzY}3Xi(s~I{Vp9g!OGit;7|Ma3DqO-2RGgj<6!!2;{yTI+3jZIZ+)c}sOlTu zv~TZrrhK-yQa`|Pbvd`P!*|WKKCFI1=Vs`;h8$p3javxg*_f1s#tc)3?HT7KQ|k~Y`z55J(&7nGEw2om86&x1%_O12$c?3LbX(a&GE+8% z9iFD^*2)eGWROmsEksg$1c^S6ZMFv}1P;5QL|?+XH4W)rYfsI?_@2h2{@3BLoWFX_ z3CLfz8uw_K_qN6be+5Z(Ukr82h2TE!8`ZS)*Li`On0CW-*W>DgqmpO)%`52szc zk7Zcu|9$-c_Ig(e=@!96dhj-mT&E)n(~gguO0^*d6VXy58!3uQ=UmvU$CVD3*q_B$Y}XoTRYxU2PRrClY*B3Mgo z+jd*CGYpg1O-9!Gv?Y7rZ}W2mspJV9Gk)Z+@OGtd55W#Pa*N%Fl(dfB6BT$2;*r~+ z`E&4(=c+FC?u@scuB4OJFNPnCSXvKrk6(=_b~^`ei_L1+n~(lSpPcoFwP(Z6>mS!^ zar2hm-_wVJwCmoe$c8l^6#m_@OQ4h;Jwxn5Lkimat9tz_OWAZ#-Tal7Ie;R+dgOUb zvY4cZ-~UHKM6IQ3BwS*4n5D8NX`*K&{U;&{A4-SbDAg|RfPtc+^*}>Oot>ZqkxvGH ztSlNMC6kiW*ff={6B4bAY;&HSD}z?!8*f*~Rc{5#N^u6Um7R!*c?Uc3E+SI`Rc|8= z?PUf7^UL_%=jc1LqFpyub*^Qp3>t$(mGkX;{l`OZ4=y9qRYzkAq>v}K*P}1z@Fss} z6yeI0!U;T!(*80!YWmIKjNB;!OqM}0OIP^k^|Nd`NE>q2A6OoJoB{W3NEVt ztoCgvq{jL7^t(VmhW!O=^`G^R_+L#owavP0al781O!zZB_b-jyM|9l*i?!;d=Ixq# z_W|nm;^T@m-1($6l{#amRQcqBs}FgSL(G3PzK}6t@xyPpUlxbSn_V(BYVNWyQ6!^o zmKy6lF}$<3#fAz=nWK`(RB_qN@M$ooEyVodoja&YTU~KF@zb0O%rTZ2d4EQ(6rHt| zSECcsT{ggHx6>jh+z@?_fpKhka~C(m2?~)($T`$qSzaYuR%4VCTruBYuh&?~fT3lS zeX*g7UcGg4IezAsFT|jhN2joSsz{dHwMl7T8G#!Z2 z+I(Z$H$oG_8f&q^ysv{?6f=q{5_CHs3{^S{f_vx`L1%;EhP3|8HQ!txs&#AA(u%4! zt6hM`2Jo<89E$?dc9ZrUI$M&5xq(YlL+JOMFA4!SzeQ;s+0Mt)R&8uLTNimFDBqbu zu`%%gtDeCVa@rCPnsm?zDD#H=X!-H;8 zk}vXl2^K1>N5y=E%|o&Z`hQ*q3tdFrbUXeL+3K5|mYup`FSd0uJYwR7aCRQxluQ&+Hv4J3kMEV>@j%3$g-N zF+()^5XWj2i)NtlV^84+m7^KXnJb$()u+~UmlT<}^hnSLWeJ%x>vyfV56Cy*W+KaS^dHxfi zqw~qXEsnU&Kqm}m?n~^a6pe!sj0iH*If6G9_Bo%hEBTMO+W=JXJPxN1D}>*`SBn2e!j59dZ=$!~dNvzKgheR0 zIJS!eg#I>nqP5+f?+)AycD0`iuHTWAgwsd;*%iMR>;xTf?dSCkFfs9~7ROM})bvp@ zF56-R6_9eQ#XtG9ncb|We0h_@a{N{Lk1dyxmiPdHX@rtnk#k=qhZn4R3#IhZrY4MT zCOhT+319@?ejwN{bbt9y3Jg;H!eeuhnO6aU$U1lB$!UEMX%3BC#OpBiw3qRod|uJi zPMd?&uRY+)?<#x6@;qcQaN7#~smE6=X?cWElrJs}1g2@RqJ11+{80voF z;-=2ljV4(jsul8}-zej6ME6Y^o)10c)|GlA(SQ3fIUttK*&_(lv(d${GT||~*Gj>2 z=;@-%Wg(1836cBT_K)~wO745{kkfnPtTirlxM>iJ^- zI%h_x{u|4AyLfz&wx`Abtt1=Gj{F~KHg6e0wjM_fnWL^}1!Jn1=G9Qw@X+Osdcm*!Tj-rp?fNLm?vwd*bUf zd4<769Y=h?T}WS`C`Hmm%Kb^kiBg*nK^SWr_Zk+q8c{sL3qeO|a7!BYI3?ycX2L#gQ6A|ypnJjw*SAI4Hr29%ays7WIW8WvMyoPiPaE0;` zzTaH4c_h}B6x~8o```l?WZ34yDPM7U%!$jcQxs(BWW)z`G}HtV8hm?!V%_cjvz!*G zR~PhamJ_ZPMM=mt50_9Jmit<$La?_}k5}`AmC`!)CUb-e#1DATDr3KvxJ<*RrRh9q zunizMUf9OIe!1F0x1U82w*irziXiH6<}ALFcwzXHdHNr*^CgMcC3dY9IF_U4t(lBs-xDJ#DrV6b`PtCmclJVW@!BuCrz z?L0IfLe%(j{17I5A$7f)L$1q?PU-}idMy%aKZL+vfxfC65&<~sn^d#3&mO1i#ND54 zuV5hO3&Mf0UVk*VowSJAee>F}J7M(yk<0c~yqr5eL0Slxfb)+0w^h!fe$(l%r-tTs zewQ60+lYVc9MnnDG%|IMor%aEjf&D&s>dNw%@&0A_rk8dZ5q-2RBkF*3`NdyZnp_@s6)ZduKd60N?%TCyLY z{6A+Pjh<*Lln?jt2|CY*J#+5W36}Xmf4R2yi*Cr2oq3GtCI%>B^nN%ue6mc{-$4zY z`D*j1n&lS4lrmTrh#c*{BP%|*{yjt};*Q!kIw=UxET8(%<$E%3VKk;?R14$K;AFtJ zUKl1iyCEH%z0s#qwRNJEOQO~2%vhDteaw9MzxP)`$v(H5>^0^$m)>L$exF3R6xbAk z8Sa<2hssW;&2zd~5EVEti32v78}PJM1BR_z;;whtNwra+Z3A?lv~*m&)wbYOXd^fV zX)1oAOpQe6n&1$pG4DUQnt!}AmnNZ)(J-G%{Q4k#E+JO9;nr91Q>w~tyH2-rFQhk< zQ&m;l`|&_7I3X7*S-t`p0Q(xNT}=V@KFbScHI{;^^es>Q(|t1iXAGefC^}1Kq0kW> zDV|=Oxe;3u8e#0xpIO4HR8$*}2z%9A2aIU>gcEEHSMzJ*eT1j96#23O!yhGbhAL#c zyfnELH9Z7;bsouja5(=)S6+mZ5(RwS?PRp@%oBKjA$vW*MHf8G>NnC{o~E-|ttk5x z8AOBG7-f}HG?CVL~l#n=)z4}7;GykC!APrk1$WG9on_JMWQ z)J)A}tAEmrrsiARj?$(%@{J9|uDH=biXkqHey}ab2<+UX%efYB#C*?4RN-dosP^6A z`?K_gjM%U&SbB-W{HP*laJA|1M>`u3c+ewsT~hB>=}Srd)e>^hALI2isvwR*FqgCX zUD4e9RQ$D6B>%4#`A_5OZKxXZ;Ny!BR4I830N3xsrX2pgb2DnEhPR3l6_?LIt#c8x zzT6L*K^XE7f=jYeG9z%vxZZ}VE(mehTqo~z1%d0fRL~)-=Ii{rf$E{PUYZW|phshk z`n-($NZIwm)n2HI^@tvEYXOpUkHcs0Mv(IFeaqEvRHta#nd~eP?R>2bbkgOG+%r=j z6FY>PB3@~6SS~6YBY1@Z_wY*6Kt89Lu5wwB&eff2h~)~QQX1EN34-=5dweKO70>?i z8vp#c=(h~Cnk-5Flb9tW>LI9az@FsKnlATY9tC{P6n3Pg%gCD#tuU}<;^>JCJbh0_ zgt}FIL;#R6KVW+~6PVr7Bs$Od(;!_)7qEvsJ~-%>Gg<*d=XM@WmO7Y_Zkv+J85x)~HqR$0^9 zKuC~&imWM0^?26aPjsbAb&D!%>4ddZ!G-?`={_YnmU)9gX(={89|b}}h_}tizDXrP zKZbrddOWC-(RdsNRS123&oRH;6!%-GF@K6q^rjTO0VkqOYbV*inKm@m{FtDG6Gw;4 zA)LYg`Z0s=4kLlsO$7-#_&4Z|PGPPB%f>fKjwi*8M0g$lxLivER^fwHVQg-v$?=-v-aV9^8L&iXUvcLCnLti9!IyV zdOqdgS)9pD?e)pO9gC0tx}-8#^00$2!;u_1L7VvLSr;d?VAF34qgy#iSG`wDyQ4c6 zyXIr3$N~mta0cwdo!{gV{^0ElgU<12E??Ifkd}0kMCWHby|l8wMljJzjwA?+6Kkm8`L_MQZ?NV}qS2{A z5`Ls`IFI2!4jd+NaL1n*Dn=un(LU%E_hbH@wI&aukTI2+2nfLmn8RAR6>O~d~2 z21)HpyuH;}N)8(`)EToI*PXQK>=%p2`g_tr`@zF}*7v^)VA9+%2x_s^%x&)COdO{? zWjB-?re}JR=xky~zT~4)Y>YieXo`j1>MRxWHMt5X*QeH{AgvrS`@W}V{y6nMZ09a1 zhNH9}X~^NeOndC|uUx{idBc#hU>!5#d>PuvD+f7ValuvX$xk+6fD&?&l!)ty=#W6+ zoS~}k_WKU_Fjm4+jF=Q)!yS_s0u*krGWMHTJgMlGYG}g;)%kuu zxFLt4kax53t0BI{ocrC^-K8!0mdDS$@fQ0-0pMuJmeL=$nr@32h%^mad)#s<>o;hT z_H_Ju_n_;z3R5Zv1vk~}VLM)O*lygYar|SDVEjZyJqUIwe|Kvt`w+qb->(_CN)PWK zbNE!!Eu$U?l>M1Tw{Ldllt`1L;IkxV1jhfmg8_&{3VarVmPmT0TsPBe$|+Rf z)6b!!6sK_VwjUWSVtV2bXg=8DfTuo=l%E1lW0iWW50;Cqwq=bCIqS=9aHD4pL&^^< z=tC^rm`8bie+y4o3LQDf+6pXv7rFk_IVFJ&Gcho|ss8J&~LPgG`rN&}>aR8MdR!>3IXFSPz7lPmy-$e`*dEb)7Wu z>-?nOuGF5N{^&+^yao9Mrhjcl9=40)WxtbyjTv!dUW|}hK$?Wz%brIaPxo2sse?N+W#cH?)BphXwEkgzEn$lqzjGw8w61Mk*@rKCwu$#E zwb!;gxmC*@L#f0IG1bd=gia(U(k#(rIl6ftTJc|c+J;H&yZL!8U+10Sjjf-BsOL^N zuvCHHd3=3BSr+FZxL8rsEEf&Au4>P7lzgdZT(a!D%O2J8p+M1)A~6?(DlIIV=e)A8Op!?3xVx7zk(t z%_;!_LvBXfQ<|L5c?RTR-S)=;yht^~Ot44F#YK z>8oWkSjUO;YGSD=O&6uYBH4k~Qn^tj*7t{a!{517B_lW>V$v*RXIV5D+f!rDWY`#Pa4Co8}!~2Pzi%K|ri9 z(+UBA63R-qyx@hZ^;T8xX3iA0p4gVzQjrK-P8R4S2g6E^CKH@h7S+6_-9|L}z!*qOKj;SdSl zO!j{&!K^zJ){^R-`EYiNF_ zyrc;+HN>;oQ2$iVdu>|Bp4FZs$@F0zZg5DLMzlRJguqJkEQso+-W)EoU8De+-Vbe=hLNQ z;q7g03T>2&f|dCNqnC5PrSVRQ+kx04=4|;NE?i>5b)Z20yMhq@exBdUqjTDaRe{z^ zC&&!|dOjGl1;6%b!u&6eR%#F4g?IUETH@Qdf)WX>Hy-aU;#8cr^vW>xr!tEjK-)H? zoVU!ifSM9CCJ}v?!@*+9rMdpY)#}`@m|r*}iQqB!vket2CRhf}HD50yIN#SOPSQy* zl1bvozyOiW2RbstiW<{hn4Bls(3gz@fjxOZIKdzvlOAK|Et%yNftl+ZRc_bAr5q(6 zFp4`GXWNS&)<_i)mug0oVO8yo@*xq4ixsVZSjumw?$Q4|2|t`GjAU2b&*iRW2`%$w zf`#p64;KUQCsEVL74msI=tq;G3z4T*BF56=hqo-EPBcX^HzDs7!<*kg)WjQZo--j$ z+%v9f)C_3PqVsRV4=e&Xri~;AZEUN(<6g(?Ya|@ySmI)!y8ITJhGB#3pTrz;+!bD| zrDAIR&J^l_Q*Z#TTX9Ci7Naf6nIgtV-_gYS=e&;YbGAR+Rm2kLY1gk(SPYL_qZ1Qf zMWD#RL9~UV$Xsa*BUf%h_LKeVb;z`p5kh$H2ei0)q?euA4+kU5L3FntUBb>?(CT(O z8{y38Vya{Nn>HWni@@PK-|qOXUH2YtU*I|CTP5ELDZDi>-DYf`RXJC z2k^(3RIi8pisB^SA;vqKz~%DV)J>}OTRmL1Ff3JgaBV7R?=@fglpF&(;o)b=jVDOQ zOk_uj8u+`n$P(VJYTbeVu&d@?Z458_356yYV(Q~jL>Y;acjCByo$$MS!RDcrQcNhXyeyk(R0O?S`d zn|J!pm68Ag>T9`J*;)3M&UYvo^hwD{UkTH6dqB=N%Y6s!%{|0BcPhZPI2sgoP5X6n zoDFuwnA(o&Kc+V!YB+As!wykiqJBy02|xeLIFkA+h85ve8}c)h_nP5 zraO02%b{?kg!wW}`cR%-Jb#{wb3c%E54Rs@(~2*jE4~Sp{jI%3xqeBMny!UKT5b}= zCr-`ZVK0Bz>J6l#gYYS^413|(Ib_o1n3zuFW!Wt0!Tt+~OU6A6hSdU=;7y7eh_^*7lsMGy&qzSSa4S)px4LS3PVZ&nY{hX|a)Z6(;zmBX_d<^&nowRs9=b<3FaI~T z-BIJ?c-zKS0oH}GG*r3hUzf)}%yO$=gbKGxPlADpGyY7$FPBvbwBMmDB+*+epVjfV-) zFNjJ>BM;ToW1nk!l(p~sEp60{vl7SK2XpFxc@7O3YRz;hc!+-|bZ~d%Eh~$0+VR@y zy*5<fUH)jflXv?0;kEdf)XViDGE-)GxbB;}{uR5Y9rOD2Xild_3<0V8JR9!x+ z&jLk_>AKxiyPDO^9QWPhg~1Yt!T-*t`Fog6xz=%p5eSz>?mp)^edEG5hxixATd^N( z---SMkr-|88Pn{ zg_)MF=w64MDm`0sR;Mbc3ZBg$$}?9~h@5#nA!P9r|feXxN?w7Z306aIQGko} z1E`+{6+?ikF0N*UDVmDYR2_326?@L$KIKi6jO$dz-4|M95i3pto{PWi}N-|I@oI}$CH)O9FyAz zHc{*oKNF;b^3cbC3Yf(hK8m9{ilcavQIv^jST<;w(y);fQvb+B`S-sfnJ8UQen9)S zAsG_HFuW0IRxM8Scns~7jqw(EQ;Izd=@;X3=<~|U(k+PV*>I$OpYLaTy)ab*Afl?N z%h099@jF?a`p_{jEPVO-h7sK4=mqsBgykk>Ft0}-YA!XzQBcI%fS;Y?s_RkUH)=>y z*^J^=Hqa}h@c|D59&9(CS~SF}YOH;gD%147NE@`+M;`{id>#q5-(T)Zo1420r_xnq i)Wx7RpTPRQV1!zxFvm)_ut7z@0Mg - -VS_VERSION_INFO VERSIONINFO -FILEVERSION 1,0,0,0 -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "Raw Material Software Limited\0" - VALUE "LegalCopyright", "Raw Material Software Limited\0" - VALUE "FileDescription", "AudioPluginHost\0" - VALUE "FileVersion", "1.0.0\0" - VALUE "ProductName", "AudioPluginHost\0" - VALUE "ProductVersion", "1.0.0\0" - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif - -IDI_ICON1 ICON DISCARDABLE "icon.ico" -IDI_ICON2 ICON DISCARDABLE "icon.ico" \ No newline at end of file diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj index 4c24ccab..82317de0 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -105,8 +106,8 @@ Full - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -141,6 +143,7 @@ + @@ -159,13 +162,13 @@ true - + true - + true - + true @@ -276,7 +279,7 @@ true - + true @@ -645,6 +648,9 @@ true + + true + true @@ -678,6 +684,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -747,15 +870,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -789,6 +930,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -807,6 +966,9 @@ true + + true + true @@ -819,6 +981,12 @@ true + + true + + + true + true @@ -885,9 +1053,15 @@ true + + true + true + + true + true @@ -903,6 +1077,9 @@ true + + true + true @@ -969,6 +1146,9 @@ true + + true + true @@ -1965,6 +2145,9 @@ true + + true + true @@ -1992,9 +2175,6 @@ true - - true - true @@ -2257,7 +2437,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2272,6 +2456,7 @@ + @@ -2316,6 +2501,7 @@ + @@ -2504,6 +2690,7 @@ + @@ -2516,6 +2703,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2581,9 +2838,14 @@ + + + + + @@ -2604,6 +2866,11 @@ + + + + + @@ -2611,6 +2878,8 @@ + + @@ -2642,6 +2911,7 @@ + @@ -2650,6 +2920,8 @@ + + @@ -2858,6 +3130,7 @@ + @@ -3056,6 +3329,7 @@ + @@ -3126,7 +3400,6 @@ - @@ -3170,6 +3443,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters index 58ea4cf6..c1ba13c7 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters @@ -149,6 +149,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -203,6 +329,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -496,6 +625,9 @@ + + AudioPluginHost\Source\Plugins + AudioPluginHost\Source\Plugins @@ -526,13 +658,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -646,8 +778,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1021,6 +1153,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1057,6 +1192,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1126,6 +1378,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1135,9 +1393,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1171,6 +1441,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1189,6 +1477,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1204,6 +1495,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1285,9 +1582,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1303,6 +1606,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1369,6 +1675,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2410,6 +2719,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2446,9 +2758,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2767,6 +3076,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -2799,6 +3114,9 @@ + + AudioPluginHost\Source\Plugins + AudioPluginHost\Source\Plugins @@ -2931,6 +3249,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3495,6 +3816,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3531,6 +3855,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3726,6 +4260,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3735,6 +4275,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3795,6 +4344,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3816,6 +4380,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -3909,6 +4479,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -3933,6 +4506,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4557,6 +5136,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5151,6 +5733,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5361,9 +5946,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -5489,6 +6071,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj index 2519b8cf..d34fc0f3 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -105,8 +106,8 @@ Full - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -141,6 +143,7 @@ + @@ -159,13 +162,13 @@ true - + true - + true - + true @@ -276,7 +279,7 @@ true - + true @@ -645,6 +648,9 @@ true + + true + true @@ -678,6 +684,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -747,15 +870,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -789,6 +930,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -807,6 +966,9 @@ true + + true + true @@ -819,6 +981,12 @@ true + + true + + + true + true @@ -885,9 +1053,15 @@ true + + true + true + + true + true @@ -903,6 +1077,9 @@ true + + true + true @@ -969,6 +1146,9 @@ true + + true + true @@ -1965,6 +2145,9 @@ true + + true + true @@ -1992,9 +2175,6 @@ true - - true - true @@ -2257,7 +2437,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2272,6 +2456,7 @@ + @@ -2316,6 +2501,7 @@ + @@ -2504,6 +2690,7 @@ + @@ -2516,6 +2703,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2581,9 +2838,14 @@ + + + + + @@ -2604,6 +2866,11 @@ + + + + + @@ -2611,6 +2878,8 @@ + + @@ -2642,6 +2911,7 @@ + @@ -2650,6 +2920,8 @@ + + @@ -2858,6 +3130,7 @@ + @@ -3056,6 +3329,7 @@ + @@ -3126,7 +3400,6 @@ - @@ -3170,6 +3443,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters index 3aa165b0..3b4beb21 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters @@ -149,6 +149,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -203,6 +329,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -496,6 +625,9 @@ + + AudioPluginHost\Source\Plugins + AudioPluginHost\Source\Plugins @@ -526,13 +658,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -646,8 +778,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1021,6 +1153,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1057,6 +1192,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1126,6 +1378,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1135,9 +1393,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1171,6 +1441,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1189,6 +1477,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1204,6 +1495,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1285,9 +1582,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1303,6 +1606,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1369,6 +1675,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2410,6 +2719,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2446,9 +2758,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2767,6 +3076,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -2799,6 +3114,9 @@ + + AudioPluginHost\Source\Plugins + AudioPluginHost\Source\Plugins @@ -2931,6 +3249,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3495,6 +3816,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3531,6 +3855,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3726,6 +4260,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3735,6 +4275,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3795,6 +4344,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3816,6 +4380,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -3909,6 +4479,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -3933,6 +4506,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4557,6 +5136,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5151,6 +5733,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5361,9 +5946,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -5489,6 +6071,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj index 02f36e9b..46fb36ee 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -105,8 +106,8 @@ Full - ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -141,6 +143,7 @@ + @@ -159,13 +162,13 @@ true - + true - + true - + true @@ -276,7 +279,7 @@ true - + true @@ -645,6 +648,9 @@ true + + true + true @@ -678,6 +684,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -747,15 +870,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -789,6 +930,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -807,6 +966,9 @@ true + + true + true @@ -819,6 +981,12 @@ true + + true + + + true + true @@ -885,9 +1053,15 @@ true + + true + true + + true + true @@ -903,6 +1077,9 @@ true + + true + true @@ -969,6 +1146,9 @@ true + + true + true @@ -1965,6 +2145,9 @@ true + + true + true @@ -1992,9 +2175,6 @@ true - - true - true @@ -2257,7 +2437,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2272,6 +2456,7 @@ + @@ -2316,6 +2501,7 @@ + @@ -2504,6 +2690,7 @@ + @@ -2516,6 +2703,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2581,9 +2838,14 @@ + + + + + @@ -2604,6 +2866,11 @@ + + + + + @@ -2611,6 +2878,8 @@ + + @@ -2642,6 +2911,7 @@ + @@ -2650,6 +2920,8 @@ + + @@ -2858,6 +3130,7 @@ + @@ -3056,6 +3329,7 @@ + @@ -3126,7 +3400,6 @@ - @@ -3170,6 +3443,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters index 58772fbb..431df436 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters @@ -149,6 +149,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -203,6 +329,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -496,6 +625,9 @@ + + AudioPluginHost\Source\Plugins + AudioPluginHost\Source\Plugins @@ -526,13 +658,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -646,8 +778,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1021,6 +1153,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1057,6 +1192,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1126,6 +1378,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1135,9 +1393,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1171,6 +1441,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1189,6 +1477,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1204,6 +1495,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1285,9 +1582,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1303,6 +1606,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1369,6 +1675,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2410,6 +2719,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2446,9 +2758,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2767,6 +3076,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -2799,6 +3114,9 @@ + + AudioPluginHost\Source\Plugins + AudioPluginHost\Source\Plugins @@ -2931,6 +3249,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3495,6 +3816,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3531,6 +3855,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3726,6 +4260,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3735,6 +4275,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3795,6 +4344,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3816,6 +4380,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -3909,6 +4479,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -3933,6 +4506,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4557,6 +5136,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5151,6 +5733,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5361,9 +5946,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -5489,6 +6071,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff --git a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj index 5895abd3..3867c2d6 100644 --- a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj +++ b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ 50AFD116DCA6EC228EFB322D /* UIKit.framework */ = {isa = PBXBuildFile; fileRef = F9EDC54DFBCF3A63E0AA5D73; }; 59F4F23BFFDAB414B4801F85 /* Images.xcassets */ = {isa = PBXBuildFile; fileRef = 29E0972229FB44D969035B4E; }; 5C4D406B924230F83E3580AD /* include_juce_audio_devices.mm */ = {isa = PBXBuildFile; fileRef = 65968EA1B476D71F14DE1D58; }; + 60BBD03840ABDD719FED194F /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 5183A94449F6317518C48B0C; }; 70580743C3D5695F065FF698 /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = E68018DE199135B7F738FB17; }; 73E371F1B912FCCAE0CD7E5D /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 86CA337014D3F67E906FFD28; }; 76A80851698FC773D2479B4E /* include_juce_core.mm */ = {isa = PBXBuildFile; fileRef = 683CEE986A2467C850FE99E6; }; @@ -31,6 +32,7 @@ 851C1165C9E4ACDD19C56A96 /* AVFoundation.framework */ = {isa = PBXBuildFile; fileRef = 942A0F04EFB8D0B2FF9780BA; }; 9056B642BEF870098DE344E5 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = 03FA420AACDD03D50AA16E4A; }; 92EE84159C7027A137F06204 /* CoreText.framework */ = {isa = PBXBuildFile; fileRef = 66643EDF46AE8C5B7956B91D; }; + 970A893BD34180916C9D01C4 /* ARAPlugin.cpp */ = {isa = PBXBuildFile; fileRef = 6A01D5F304346E0332264056; }; A0144A682BF4843C8CF53FE4 /* BinaryData.cpp */ = {isa = PBXBuildFile; fileRef = 6D107D7946DC5976B766345B; }; A02C9F4C4B840C27B6CAFEBD /* QuartzCore.framework */ = {isa = PBXBuildFile; fileRef = 89309C0C5F3269BD06BE7F27; }; A09E93F1B354E1FF8B3E9ABE /* include_juce_data_structures.mm */ = {isa = PBXBuildFile; fileRef = 5EF1D381F42AA8764597F189; }; @@ -39,6 +41,7 @@ B0D5475F716126465FCE1586 /* CoreImage.framework */ = {isa = PBXBuildFile; fileRef = CFFA8E9A7820C5A27B4393C9; }; C38D14DC58F1941DD5E4BF60 /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = 2BE6C2DFD6EBB9A89109AEB5; }; C81D59C798F9F1F1A549FF07 /* CoreServices.framework */ = {isa = PBXBuildFile; fileRef = 7D924E83DABA5B54205C52F4; }; + CAC10E4345428CAEE6F0DA1B /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = A43CE79CB190C2D69E17E1E3; }; CAF0DE157C8F7D9F168AA3B6 /* include_juce_audio_processors.mm */ = {isa = PBXBuildFile; fileRef = 5FBD6C402617272052BB4D81; }; E092A70431B046BF1F50A482 /* CoreMIDI.framework */ = {isa = PBXBuildFile; fileRef = 5AF0CA7CDFCA90B4DE1F55C3; }; E283262A07376A7EDFCEAF6F /* LaunchScreen.storyboard */ = {isa = PBXBuildFile; fileRef = F58EBA72DA53F75945B91321; }; @@ -70,6 +73,7 @@ 45098BAF7E088D41A4E69E42 /* singing.ogg */ /* singing.ogg */ = {isa = PBXFileReference; lastKnownFileType = file.ogg; name = singing.ogg; path = ../../../../examples/Assets/singing.ogg; sourceTree = SOURCE_ROOT; }; 46C3C2CD301CD59C51FD02D6 /* PluginGraph.h */ /* PluginGraph.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginGraph.h; path = ../../Source/Plugins/PluginGraph.h; sourceTree = SOURCE_ROOT; }; 4C7D82F9274A4F9DBF11235C /* include_juce_audio_basics.mm */ /* include_juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_basics.mm; path = ../../JuceLibraryCode/include_juce_audio_basics.mm; sourceTree = SOURCE_ROOT; }; + 5183A94449F6317518C48B0C /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 5313EB852E41EE58B199B9A2 /* juce_audio_devices */ /* juce_audio_devices */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_devices; path = ../../../../modules/juce_audio_devices; sourceTree = SOURCE_ROOT; }; 57DF618F1DE781556B7AFC32 /* Info-App.plist */ /* Info-App.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = SOURCE_ROOT; }; 59842A98E5EBBC54B50C04CD /* juce_events */ /* juce_events */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_events; path = ../../../../modules/juce_events; sourceTree = SOURCE_ROOT; }; @@ -81,6 +85,7 @@ 65968EA1B476D71F14DE1D58 /* include_juce_audio_devices.mm */ /* include_juce_audio_devices.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_devices.mm; path = ../../JuceLibraryCode/include_juce_audio_devices.mm; sourceTree = SOURCE_ROOT; }; 66643EDF46AE8C5B7956B91D /* CoreText.framework */ /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; 683CEE986A2467C850FE99E6 /* include_juce_core.mm */ /* include_juce_core.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_core.mm; path = ../../JuceLibraryCode/include_juce_core.mm; sourceTree = SOURCE_ROOT; }; + 6A01D5F304346E0332264056 /* ARAPlugin.cpp */ /* ARAPlugin.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ARAPlugin.cpp; path = ../../Source/Plugins/ARAPlugin.cpp; sourceTree = SOURCE_ROOT; }; 6A71B2BCAC4239072BC2BD7E /* juce_audio_basics */ /* juce_audio_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_basics; path = ../../../../modules/juce_audio_basics; sourceTree = SOURCE_ROOT; }; 6D107D7946DC5976B766345B /* BinaryData.cpp */ /* BinaryData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = SOURCE_ROOT; }; 7D924E83DABA5B54205C52F4 /* CoreServices.framework */ /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; }; @@ -99,6 +104,7 @@ 97918AB43AD460AFA8FA2FFE /* PluginWindow.h */ /* PluginWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginWindow.h; path = ../../Source/UI/PluginWindow.h; sourceTree = SOURCE_ROOT; }; 97E63C295843A1E665E70473 /* cello.wav */ /* cello.wav */ = {isa = PBXFileReference; lastKnownFileType = file.wav; name = cello.wav; path = ../../../../examples/Assets/cello.wav; sourceTree = SOURCE_ROOT; }; 9F9B445E6755CAA19E4344ED /* CoreAudio.framework */ /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + A43CE79CB190C2D69E17E1E3 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; A5DFC13E4F09134B0D226A3E /* MainHostWindow.h */ /* MainHostWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainHostWindow.h; path = ../../Source/UI/MainHostWindow.h; sourceTree = SOURCE_ROOT; }; A5E7CA8A71D049BE2BD33861 /* JuceHeader.h */ /* JuceHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = SOURCE_ROOT; }; A66EFAC64B1B67B536C73415 /* HostStartup.cpp */ /* HostStartup.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HostStartup.cpp; path = ../../Source/HostStartup.cpp; sourceTree = SOURCE_ROOT; }; @@ -111,6 +117,7 @@ B8E24A5CEE6B7055537725CF /* include_juce_cryptography.mm */ /* include_juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_cryptography.mm; path = ../../JuceLibraryCode/include_juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; B95B9D6774059DBB19F2B4E2 /* InternalPlugins.h */ /* InternalPlugins.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = InternalPlugins.h; path = ../../Source/Plugins/InternalPlugins.h; sourceTree = SOURCE_ROOT; }; C37B2E77AAB6C9E13729BF99 /* IOConfigurationWindow.cpp */ /* IOConfigurationWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = IOConfigurationWindow.cpp; path = ../../Source/Plugins/IOConfigurationWindow.cpp; sourceTree = SOURCE_ROOT; }; + CA726B9AA0EC87B58D005C8D /* ARAPlugin.h */ /* ARAPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ARAPlugin.h; path = ../../Source/Plugins/ARAPlugin.h; sourceTree = SOURCE_ROOT; }; CFFA8E9A7820C5A27B4393C9 /* CoreImage.framework */ /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; }; D0026F0A29B486D87E92BB8B /* OpenGLES.framework */ /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; D4EBC17BDB7F88CCBC76730B /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; @@ -185,6 +192,8 @@ 65968EA1B476D71F14DE1D58, 5D250A57C7DEA80248F30EED, 5FBD6C402617272052BB4D81, + A43CE79CB190C2D69E17E1E3, + 5183A94449F6317518C48B0C, B285CAB91AE928C476CA4F9C, 683CEE986A2467C850FE99E6, B8E24A5CEE6B7055537725CF, @@ -233,6 +242,8 @@ 9F51E92D8C77FA9DDD1F7B10 /* Plugins */ = { isa = PBXGroup; children = ( + 6A01D5F304346E0332264056, + CA726B9AA0EC87B58D005C8D, 87A7AAB053051C49EAF4EE88, B95B9D6774059DBB19F2B4E2, C37B2E77AAB6C9E13729BF99, @@ -334,7 +345,7 @@ ADE6E539DB98A302483A82D0 = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { @@ -396,6 +407,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 970A893BD34180916C9D01C4, 7FF8A938915488310A7F5921, 025B22813EA4E34CE3630B9A, 09309BD494A05931864B6730, @@ -407,6 +419,8 @@ 5C4D406B924230F83E3580AD, F4DD98B9310B679D50A2C8A6, CAF0DE157C8F7D9F168AA3B6, + CAC10E4345428CAEE6F0DA1B, + 60BBD03840ABDD719FED194F, 0F20A4AE04736634F097F5A6, 76A80851698FC773D2479B4E, E4A926EF695823F0F13268FF, @@ -442,7 +456,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -466,6 +480,7 @@ "JUCE_PLUGINHOST_VST3=1", "JUCE_PLUGINHOST_AU=1", "JUCE_PLUGINHOST_LADSPA=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_USE_CDREADER=0", "JUCE_USE_CDBURNER=0", "JUCE_WEB_BROWSER=0", @@ -477,13 +492,21 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", @@ -493,9 +516,10 @@ INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; LLVM_LTO = YES; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost; PRODUCT_NAME = "Plugin Host"; USE_HEADERMAP = NO; @@ -573,7 +597,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -597,6 +621,7 @@ "JUCE_PLUGINHOST_VST3=1", "JUCE_PLUGINHOST_AU=1", "JUCE_PLUGINHOST_LADSPA=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_USE_CDREADER=0", "JUCE_USE_CDBURNER=0", "JUCE_WEB_BROWSER=0", @@ -608,13 +633,21 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", @@ -623,9 +656,10 @@ INFOPLIST_FILE = Info-App.plist; INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost; PRODUCT_NAME = "Plugin Host"; USE_HEADERMAP = NO; diff --git a/extras/AudioPluginHost/CMakeLists.txt b/extras/AudioPluginHost/CMakeLists.txt index 8d7fafbf..cd7f495e 100644 --- a/extras/AudioPluginHost/CMakeLists.txt +++ b/extras/AudioPluginHost/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -31,6 +31,7 @@ juce_generate_juce_header(AudioPluginHost) target_sources(AudioPluginHost PRIVATE Source/HostStartup.cpp + Source/Plugins/ARAPlugin.cpp Source/Plugins/IOConfigurationWindow.cpp Source/Plugins/InternalPlugins.cpp Source/Plugins/PluginGraph.cpp @@ -46,12 +47,14 @@ juce_add_binary_data(AudioPluginHostData SOURCES ../../examples/Assets/singing.ogg) target_compile_definitions(AudioPluginHost PRIVATE - PIP_JUCE_EXAMPLES_DIRECTORY_STRING="${JUCE_SOURCE_DIR}/examples" JUCE_ALSA=1 JUCE_DIRECTSOUND=1 + JUCE_DISABLE_CAUTIOUS_PARAMETER_ID_CHECKING=1 JUCE_PLUGINHOST_LADSPA=1 + JUCE_PLUGINHOST_LV2=1 JUCE_PLUGINHOST_VST3=1 JUCE_PLUGINHOST_VST=0 + JUCE_PLUGINHOST_ARA=0 JUCE_USE_CAMERA=0 JUCE_USE_CDBURNER=0 JUCE_USE_CDREADER=0 @@ -60,7 +63,8 @@ target_compile_definitions(AudioPluginHost PRIVATE JUCE_USE_OGGVORBIS=1 JUCE_VST3_HOST_CROSS_PLATFORM_UID=1 JUCE_WASAPI=1 - JUCE_WEB_BROWSER=0) + JUCE_WEB_BROWSER=0 + PIP_JUCE_EXAMPLES_DIRECTORY_STRING="${JUCE_SOURCE_DIR}/examples") target_link_libraries(AudioPluginHost PRIVATE AudioPluginHostData diff --git a/extras/AudioPluginHost/JuceLibraryCode/BinaryData.cpp b/extras/AudioPluginHost/JuceLibraryCode/BinaryData.cpp index 1c440e39..77912a46 100644 --- a/extras/AudioPluginHost/JuceLibraryCode/BinaryData.cpp +++ b/extras/AudioPluginHost/JuceLibraryCode/BinaryData.cpp @@ -4,6 +4,8 @@ */ +#include + namespace BinaryData { @@ -10986,10 +10988,8 @@ const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8); const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8) { for (unsigned int i = 0; i < (sizeof (namedResourceList) / sizeof (namedResourceList[0])); ++i) - { - if (namedResourceList[i] == resourceNameUTF8) + if (strcmp (namedResourceList[i], resourceNameUTF8) == 0) return originalFilenames[i]; - } return nullptr; } diff --git a/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_ara.cpp b/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_ara.cpp new file mode 100644 index 00000000..e0c34d43 --- /dev/null +++ b/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_ara.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp b/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp new file mode 100644 index 00000000..64b4d5f4 --- /dev/null +++ b/extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/extras/AudioPluginHost/Source/HostStartup.cpp b/extras/AudioPluginHost/Source/HostStartup.cpp index 485fce90..136630c8 100644 --- a/extras/AudioPluginHost/Source/HostStartup.cpp +++ b/extras/AudioPluginHost/Source/HostStartup.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,6 +35,11 @@ class PluginScannerSubprocess : private ChildProcessWorker, private AsyncUpdater { public: + PluginScannerSubprocess() + { + formatManager.addDefaultFormats(); + } + using ChildProcessWorker::initialiseFromCommandLine; private: @@ -84,9 +89,6 @@ private: bool doScan (const MemoryBlock& block) { - AudioPluginFormatManager formatManager; - formatManager.addDefaultFormats(); - MemoryInputStream stream { block, false }; const auto formatName = stream.readString(); const auto identifier = stream.readString(); @@ -130,6 +132,10 @@ private: std::mutex mutex; std::queue pendingBlocks; + + // After construction, this will only be accessed by doScan so there's no need + // to worry about synchronisation. + AudioPluginFormatManager formatManager; }; //============================================================================== @@ -334,7 +340,8 @@ void setAutoScaleValueForPlugin (const String& identifier, AutoScale s) static bool isAutoScaleAvailableForPlugin (const PluginDescription& description) { return autoScaleOptionAvailable - && description.pluginFormatName.containsIgnoreCase ("VST"); + && (description.pluginFormatName.containsIgnoreCase ("VST") + || description.pluginFormatName.containsIgnoreCase ("LV2")); } bool shouldAutoScalePlugin (const PluginDescription& description) diff --git a/extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp b/extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp new file mode 100644 index 00000000..ef6cca45 --- /dev/null +++ b/extras/AudioPluginHost/Source/Plugins/ARAPlugin.cpp @@ -0,0 +1,33 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "ARAPlugin.h" + +#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + +const Identifier ARAPluginInstanceWrapper::ARATestHost::Context::xmlRootTag { "ARATestHostContext" }; +const Identifier ARAPluginInstanceWrapper::ARATestHost::Context::xmlAudioFileAttrib { "AudioFile" }; + +#endif diff --git a/extras/AudioPluginHost/Source/Plugins/ARAPlugin.h b/extras/AudioPluginHost/Source/Plugins/ARAPlugin.h new file mode 100644 index 00000000..be6353b9 --- /dev/null +++ b/extras/AudioPluginHost/Source/Plugins/ARAPlugin.h @@ -0,0 +1,1405 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#pragma once + +#include + +#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + +#include + +#include +#include + +class FileAudioSource +{ + auto getAudioSourceProperties() const + { + auto properties = ARAHostModel::AudioSource::getEmptyProperties(); + properties.name = formatReader->getFile().getFullPathName().toRawUTF8(); + properties.persistentID = formatReader->getFile().getFullPathName().toRawUTF8(); + properties.sampleCount = formatReader->lengthInSamples; + properties.sampleRate = formatReader->sampleRate; + properties.channelCount = (int) formatReader->numChannels; + properties.merits64BitSamples = false; + return properties; + } + +public: + FileAudioSource (ARA::Host::DocumentController& dc, const juce::File& file) + : formatReader ([&file] + { + auto result = rawToUniquePtr (WavAudioFormat().createMemoryMappedReader (file)); + result->mapEntireFile(); + return result; + }()), + audioSource (Converter::toHostRef (this), dc, getAudioSourceProperties()) + { + audioSource.enableAudioSourceSamplesAccess (true); + } + + bool readAudioSamples (float* const* buffers, int64 startSample, int64 numSamples) + { + // TODO: the ARA interface defines numSamples as int64. We should do multiple reads if necessary with the reader. + if (numSamples > std::numeric_limits::max()) + return false; + + return formatReader->read (buffers, (int) formatReader->numChannels, startSample, (int) (numSamples)); + } + + bool readAudioSamples (double* const* buffers, int64 startSample, int64 numSamples) + { + ignoreUnused (buffers, startSample, numSamples); + return false; + } + + MemoryMappedAudioFormatReader& getFormatReader() const { return *formatReader; } + + auto getPluginRef() const { return audioSource.getPluginRef(); } + + auto& getSource() { return audioSource; } + + using Converter = ARAHostModel::ConversionFunctions; + +private: + std::unique_ptr formatReader; + ARAHostModel::AudioSource audioSource; +}; + +//============================================================================== +class MusicalContext +{ + auto getMusicalContextProperties() const + { + auto properties = ARAHostModel::MusicalContext::getEmptyProperties(); + properties.name = "MusicalContext"; + properties.orderIndex = 0; + properties.color = nullptr; + return properties; + } + +public: + MusicalContext (ARA::Host::DocumentController& dc) + : context (Converter::toHostRef (this), dc, getMusicalContextProperties()) + { + } + + auto getPluginRef() const { return context.getPluginRef(); } + +private: + using Converter = ARAHostModel::ConversionFunctions; + + ARAHostModel::MusicalContext context; +}; + +//============================================================================== +class RegionSequence +{ + auto getRegionSequenceProperties() const + { + auto properties = ARAHostModel::RegionSequence::getEmptyProperties(); + properties.name = name.toRawUTF8(); + properties.orderIndex = 0; + properties.musicalContextRef = context.getPluginRef(); + properties.color = nullptr; + return properties; + } + +public: + RegionSequence (ARA::Host::DocumentController& dc, MusicalContext& contextIn, String nameIn) + : context (contextIn), + name (std::move (nameIn)), + sequence (Converter::toHostRef (this), dc, getRegionSequenceProperties()) + { + } + + auto& getMusicalContext() const { return context; } + auto getPluginRef() const { return sequence.getPluginRef(); } + +private: + using Converter = ARAHostModel::ConversionFunctions; + + MusicalContext& context; + String name; + ARAHostModel::RegionSequence sequence; +}; + +class AudioModification +{ + auto getProperties() const + { + auto properties = ARAHostModel::AudioModification::getEmptyProperties(); + properties.persistentID = "x"; + return properties; + } + +public: + AudioModification (ARA::Host::DocumentController& dc, FileAudioSource& source) + : modification (Converter::toHostRef (this), dc, source.getSource(), getProperties()) + { + } + + auto& getModification() { return modification; } + +private: + using Converter = ARAHostModel::ConversionFunctions; + + ARAHostModel::AudioModification modification; +}; + +//============================================================================== +class PlaybackRegion +{ + auto getPlaybackRegionProperties() const + { + auto properties = ARAHostModel::PlaybackRegion::getEmptyProperties(); + properties.transformationFlags = ARA::kARAPlaybackTransformationNoChanges; + properties.startInModificationTime = 0.0; + const auto& formatReader = audioSource.getFormatReader(); + properties.durationInModificationTime = formatReader.lengthInSamples / formatReader.sampleRate; + properties.startInPlaybackTime = 0.0; + properties.durationInPlaybackTime = properties.durationInModificationTime; + properties.musicalContextRef = sequence.getMusicalContext().getPluginRef(); + properties.regionSequenceRef = sequence.getPluginRef(); + + properties.name = nullptr; + properties.color = nullptr; + return properties; + } + +public: + PlaybackRegion (ARA::Host::DocumentController& dc, + RegionSequence& s, + AudioModification& m, + FileAudioSource& source) + : sequence (s), + audioSource (source), + region (Converter::toHostRef (this), dc, m.getModification(), getPlaybackRegionProperties()) + { + jassert (source.getPluginRef() == m.getModification().getAudioSource().getPluginRef()); + } + + auto& getPlaybackRegion() { return region; } + +private: + using Converter = ARAHostModel::ConversionFunctions; + + RegionSequence& sequence; + FileAudioSource& audioSource; + ARAHostModel::PlaybackRegion region; +}; + +//============================================================================== +class AudioAccessController : public ARA::Host::AudioAccessControllerInterface +{ +public: + ARA::ARAAudioReaderHostRef createAudioReaderForSource (ARA::ARAAudioSourceHostRef audioSourceHostRef, + bool use64BitSamples) noexcept override + { + auto audioReader = std::make_unique (audioSourceHostRef, use64BitSamples); + auto audioReaderHostRef = Converter::toHostRef (audioReader.get()); + auto* readerPtr = audioReader.get(); + audioReaders.emplace (readerPtr, std::move (audioReader)); + return audioReaderHostRef; + } + + bool readAudioSamples (ARA::ARAAudioReaderHostRef readerRef, + ARA::ARASamplePosition samplePosition, + ARA::ARASampleCount samplesPerChannel, + void* const* buffers) noexcept override + { + const auto use64BitSamples = Converter::fromHostRef (readerRef)->use64Bit; + auto* audioSource = FileAudioSource::Converter::fromHostRef (Converter::fromHostRef (readerRef)->sourceHostRef); + + if (use64BitSamples) + return audioSource->readAudioSamples ( + reinterpret_cast (buffers), samplePosition, samplesPerChannel); + + return audioSource->readAudioSamples ( + reinterpret_cast (buffers), samplePosition, samplesPerChannel); + } + + void destroyAudioReader (ARA::ARAAudioReaderHostRef readerRef) noexcept override + { + audioReaders.erase (Converter::fromHostRef (readerRef)); + } + +private: + struct AudioReader + { + AudioReader (ARA::ARAAudioSourceHostRef source, bool use64BitSamples) + : sourceHostRef (source), use64Bit (use64BitSamples) + { + } + + ARA::ARAAudioSourceHostRef sourceHostRef; + bool use64Bit; + }; + + using Converter = ARAHostModel::ConversionFunctions; + + std::map> audioReaders; +}; + +class ArchivingController : public ARA::Host::ArchivingControllerInterface +{ +public: + using ReaderConverter = ARAHostModel::ConversionFunctions; + using WriterConverter = ARAHostModel::ConversionFunctions; + + ARA::ARASize getArchiveSize (ARA::ARAArchiveReaderHostRef archiveReaderHostRef) noexcept override + { + return (ARA::ARASize) ReaderConverter::fromHostRef (archiveReaderHostRef)->getSize(); + } + + bool readBytesFromArchive (ARA::ARAArchiveReaderHostRef archiveReaderHostRef, + ARA::ARASize position, + ARA::ARASize length, + ARA::ARAByte* buffer) noexcept override + { + auto* archiveReader = ReaderConverter::fromHostRef (archiveReaderHostRef); + + if ((position + length) <= archiveReader->getSize()) + { + std::memcpy (buffer, addBytesToPointer (archiveReader->getData(), position), length); + return true; + } + + return false; + } + + bool writeBytesToArchive (ARA::ARAArchiveWriterHostRef archiveWriterHostRef, + ARA::ARASize position, + ARA::ARASize length, + const ARA::ARAByte* buffer) noexcept override + { + auto* archiveWriter = WriterConverter::fromHostRef (archiveWriterHostRef); + + if (archiveWriter->setPosition ((int64) position) && archiveWriter->write (buffer, length)) + return true; + + return false; + } + + void notifyDocumentArchivingProgress (float value) noexcept override { ignoreUnused (value); } + + void notifyDocumentUnarchivingProgress (float value) noexcept override { ignoreUnused (value); } + + ARA::ARAPersistentID getDocumentArchiveID (ARA::ARAArchiveReaderHostRef archiveReaderHostRef) noexcept override + { + ignoreUnused (archiveReaderHostRef); + + return nullptr; + } +}; + +class ContentAccessController : public ARA::Host::ContentAccessControllerInterface +{ +public: + using Converter = ARAHostModel::ConversionFunctions; + + bool isMusicalContextContentAvailable (ARA::ARAMusicalContextHostRef musicalContextHostRef, + ARA::ARAContentType type) noexcept override + { + ignoreUnused (musicalContextHostRef); + + return (type == ARA::kARAContentTypeTempoEntries || type == ARA::kARAContentTypeBarSignatures); + } + + ARA::ARAContentGrade getMusicalContextContentGrade (ARA::ARAMusicalContextHostRef musicalContextHostRef, + ARA::ARAContentType type) noexcept override + { + ignoreUnused (musicalContextHostRef, type); + + return ARA::kARAContentGradeInitial; + } + + ARA::ARAContentReaderHostRef + createMusicalContextContentReader (ARA::ARAMusicalContextHostRef musicalContextHostRef, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept override + { + ignoreUnused (musicalContextHostRef, range); + + return Converter::toHostRef (type); + } + + bool isAudioSourceContentAvailable (ARA::ARAAudioSourceHostRef audioSourceHostRef, + ARA::ARAContentType type) noexcept override + { + ignoreUnused (audioSourceHostRef, type); + + return false; + } + + ARA::ARAContentGrade getAudioSourceContentGrade (ARA::ARAAudioSourceHostRef audioSourceHostRef, + ARA::ARAContentType type) noexcept override + { + ignoreUnused (audioSourceHostRef, type); + + return 0; + } + + ARA::ARAContentReaderHostRef + createAudioSourceContentReader (ARA::ARAAudioSourceHostRef audioSourceHostRef, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept override + { + ignoreUnused (audioSourceHostRef, type, range); + + return nullptr; + } + + ARA::ARAInt32 getContentReaderEventCount (ARA::ARAContentReaderHostRef contentReaderHostRef) noexcept override + { + const auto contentType = Converter::fromHostRef (contentReaderHostRef); + + if (contentType == ARA::kARAContentTypeTempoEntries || contentType == ARA::kARAContentTypeBarSignatures) + return 2; + + return 0; + } + + const void* getContentReaderDataForEvent (ARA::ARAContentReaderHostRef contentReaderHostRef, + ARA::ARAInt32 eventIndex) noexcept override + { + if (Converter::fromHostRef (contentReaderHostRef) == ARA::kARAContentTypeTempoEntries) + { + if (eventIndex == 0) + { + tempoEntry.timePosition = 0.0; + tempoEntry.quarterPosition = 0.0; + } + else if (eventIndex == 1) + { + tempoEntry.timePosition = 2.0; + tempoEntry.quarterPosition = 4.0; + } + + return &tempoEntry; + } + else if (Converter::fromHostRef (contentReaderHostRef) == ARA::kARAContentTypeBarSignatures) + { + if (eventIndex == 0) + { + barSignature.position = 0.0; + barSignature.numerator = 4; + barSignature.denominator = 4; + } + + if (eventIndex == 1) + { + barSignature.position = 1.0; + barSignature.numerator = 4; + barSignature.denominator = 4; + } + + return &barSignature; + } + + jassertfalse; + return nullptr; + } + + void destroyContentReader (ARA::ARAContentReaderHostRef contentReaderHostRef) noexcept override + { + ignoreUnused (contentReaderHostRef); + } + + ARA::ARAContentTempoEntry tempoEntry; + ARA::ARAContentBarSignature barSignature; +}; + +class ModelUpdateController : public ARA::Host::ModelUpdateControllerInterface +{ +public: + void notifyAudioSourceAnalysisProgress (ARA::ARAAudioSourceHostRef audioSourceHostRef, + ARA::ARAAnalysisProgressState state, + float value) noexcept override + { + ignoreUnused (audioSourceHostRef, state, value); + } + + void notifyAudioSourceContentChanged (ARA::ARAAudioSourceHostRef audioSourceHostRef, + const ARA::ARAContentTimeRange* range, + ARA::ContentUpdateScopes scopeFlags) noexcept override + { + ignoreUnused (audioSourceHostRef, range, scopeFlags); + } + + void notifyAudioModificationContentChanged (ARA::ARAAudioModificationHostRef audioModificationHostRef, + const ARA::ARAContentTimeRange* range, + ARA::ContentUpdateScopes scopeFlags) noexcept override + { + ignoreUnused (audioModificationHostRef, range, scopeFlags); + } + + void notifyPlaybackRegionContentChanged (ARA::ARAPlaybackRegionHostRef playbackRegionHostRef, + const ARA::ARAContentTimeRange* range, + ARA::ContentUpdateScopes scopeFlags) noexcept override + { + ignoreUnused (playbackRegionHostRef, range, scopeFlags); + } +}; + +class PlaybackController : public ARA::Host::PlaybackControllerInterface +{ +public: + void requestStartPlayback() noexcept override {} + void requestStopPlayback() noexcept override {} + + void requestSetPlaybackPosition (ARA::ARATimePosition timePosition) noexcept override + { + ignoreUnused (timePosition); + } + + void requestSetCycleRange (ARA::ARATimePosition startTime, ARA::ARATimeDuration duration) noexcept override + { + ignoreUnused (startTime, duration); + } + + void requestEnableCycle (bool enable) noexcept override { ignoreUnused (enable); } +}; + +struct SimplePlayHead : public juce::AudioPlayHead +{ + Optional getPosition() const override + { + PositionInfo result; + result.setTimeInSamples (timeInSamples.load()); + result.setIsPlaying (isPlaying.load()); + return result; + } + + std::atomic timeInSamples { 0 }; + std::atomic isPlaying { false }; +}; + +struct HostPlaybackController +{ + virtual ~HostPlaybackController() = default; + + virtual void setPlaying (bool isPlaying) = 0; + virtual void goToStart() = 0; + virtual File getAudioSource() const = 0; + virtual void setAudioSource (File audioSourceFile) = 0; + virtual void clearAudioSource() = 0; +}; + +class AudioSourceComponent : public Component, + public FileDragAndDropTarget, + public ChangeListener +{ +public: + explicit AudioSourceComponent (HostPlaybackController& controller, juce::ChangeBroadcaster& bc) + : hostPlaybackController (controller), + broadcaster (bc), + waveformComponent (*this) + { + audioSourceLabel.setText ("You can drag and drop .wav files here", NotificationType::dontSendNotification); + + addAndMakeVisible (audioSourceLabel); + addAndMakeVisible (waveformComponent); + + playButton.setButtonText ("Play / Pause"); + playButton.onClick = [this] + { + isPlaying = ! isPlaying; + hostPlaybackController.setPlaying (isPlaying); + }; + + goToStartButton.setButtonText ("Go to start"); + goToStartButton.onClick = [this] { hostPlaybackController.goToStart(); }; + + addAndMakeVisible (goToStartButton); + addAndMakeVisible (playButton); + + broadcaster.addChangeListener (this); + + update(); + } + + ~AudioSourceComponent() override + { + broadcaster.removeChangeListener (this); + } + + void changeListenerCallback (ChangeBroadcaster*) override + { + update(); + } + + void resized() override + { + auto localBounds = getLocalBounds(); + auto buttonsArea = localBounds.removeFromBottom (40).reduced (5); + auto waveformArea = localBounds.removeFromBottom (150).reduced (5); + + juce::FlexBox fb; + fb.justifyContent = juce::FlexBox::JustifyContent::center; + fb.alignContent = juce::FlexBox::AlignContent::center; + + fb.items = { juce::FlexItem (goToStartButton).withMinWidth (100.0f).withMinHeight ((float) buttonsArea.getHeight()), + juce::FlexItem (playButton).withMinWidth (100.0f).withMinHeight ((float) buttonsArea.getHeight()) }; + + fb.performLayout (buttonsArea); + + waveformComponent.setBounds (waveformArea); + + audioSourceLabel.setBounds (localBounds); + } + + bool isInterestedInFileDrag (const StringArray& files) override + { + if (files.size() != 1) + return false; + + if (files.getReference (0).endsWithIgnoreCase (".wav")) + return true; + + return false; + } + + void update() + { + const auto currentAudioSource = hostPlaybackController.getAudioSource(); + + if (currentAudioSource.existsAsFile()) + { + waveformComponent.setSource (currentAudioSource); + audioSourceLabel.setText (currentAudioSource.getFullPathName(), + NotificationType::dontSendNotification); + } + else + { + waveformComponent.clearSource(); + audioSourceLabel.setText ("You can drag and drop .wav files here", NotificationType::dontSendNotification); + } + } + + void filesDropped (const StringArray& files, int, int) override + { + hostPlaybackController.setAudioSource (files.getReference (0)); + update(); + } + +private: + class WaveformComponent : public Component, + public ChangeListener + { + public: + WaveformComponent (AudioSourceComponent& p) + : parent (p), + thumbCache (7), + audioThumb (128, formatManager, thumbCache) + { + setWantsKeyboardFocus (true); + formatManager.registerBasicFormats(); + audioThumb.addChangeListener (this); + } + + ~WaveformComponent() override + { + audioThumb.removeChangeListener (this); + } + + void mouseDown (const MouseEvent&) override + { + isSelected = true; + repaint(); + } + + void changeListenerCallback (ChangeBroadcaster*) override + { + repaint(); + } + + void paint (juce::Graphics& g) override + { + if (! isEmpty) + { + auto rect = getLocalBounds(); + + const auto waveformColour = Colours::cadetblue; + + if (rect.getWidth() > 2) + { + g.setColour (isSelected ? juce::Colours::yellow : juce::Colours::black); + g.drawRect (rect); + rect.reduce (1, 1); + g.setColour (waveformColour.darker (1.0f)); + g.fillRect (rect); + } + + g.setColour (Colours::cadetblue); + audioThumb.drawChannels (g, rect, 0.0, audioThumb.getTotalLength(), 1.0f); + } + } + + void setSource (const File& source) + { + isEmpty = false; + audioThumb.setSource (new FileInputSource (source)); + } + + void clearSource() + { + isEmpty = true; + isSelected = false; + audioThumb.clear(); + } + + bool keyPressed (const KeyPress& key) override + { + if (isSelected && key == KeyPress::deleteKey) + { + parent.hostPlaybackController.clearAudioSource(); + return true; + } + + return false; + } + + private: + AudioSourceComponent& parent; + + bool isEmpty = true; + bool isSelected = false; + AudioFormatManager formatManager; + AudioThumbnailCache thumbCache; + AudioThumbnail audioThumb; + }; + + HostPlaybackController& hostPlaybackController; + juce::ChangeBroadcaster& broadcaster; + Label audioSourceLabel; + WaveformComponent waveformComponent; + bool isPlaying { false }; + TextButton playButton, goToStartButton; +}; + +class ARAPluginInstanceWrapper : public AudioPluginInstance +{ +public: + class ARATestHost : public HostPlaybackController, + public juce::ChangeBroadcaster + { + public: + class Editor : public AudioProcessorEditor + { + public: + explicit Editor (ARATestHost& araTestHost) + : AudioProcessorEditor (araTestHost.getAudioPluginInstance()), + audioSourceComponent (araTestHost, araTestHost) + { + audioSourceComponent.update(); + addAndMakeVisible (audioSourceComponent); + setSize (512, 220); + } + + ~Editor() override { getAudioProcessor()->editorBeingDeleted (this); } + + void resized() override { audioSourceComponent.setBounds (getLocalBounds()); } + + private: + AudioSourceComponent audioSourceComponent; + }; + + explicit ARATestHost (ARAPluginInstanceWrapper& instanceIn) + : instance (instanceIn) + { + if (instance.inner->getPluginDescription().hasARAExtension) + { + instance.inner->setPlayHead (&playHead); + + createARAFactoryAsync (*instance.inner, [this] (ARAFactoryWrapper araFactory) + { + init (std::move (araFactory)); + }); + } + } + + void init (ARAFactoryWrapper araFactory) + { + if (araFactory.get() != nullptr) + { + documentController = ARAHostDocumentController::create (std::move (araFactory), + "AudioPluginHostDocument", + std::make_unique(), + std::make_unique(), + std::make_unique(), + std::make_unique(), + std::make_unique()); + + if (documentController != nullptr) + { + const auto allRoles = ARA::kARAPlaybackRendererRole | ARA::kARAEditorRendererRole | ARA::kARAEditorViewRole; + const auto plugInExtensionInstance = documentController->bindDocumentToPluginInstance (*instance.inner, + allRoles, + allRoles); + playbackRenderer = plugInExtensionInstance.getPlaybackRendererInterface(); + editorRenderer = plugInExtensionInstance.getEditorRendererInterface(); + synchronizeStateWithDocumentController(); + } + else + jassertfalse; + } + else + jassertfalse; + } + + void getStateInformation (juce::MemoryBlock& b) + { + std::lock_guard configurationLock (instance.innerMutex); + + if (context != nullptr) + context->getStateInformation (b); + } + + void setStateInformation (const void* d, int s) + { + { + std::lock_guard lock { contextUpdateSourceMutex }; + contextUpdateSource = ContextUpdateSource { d, s }; + } + + synchronise(); + } + + ~ARATestHost() override { instance.inner->releaseResources(); } + + void afterProcessBlock (int numSamples) + { + const auto isPlayingNow = isPlaying.load(); + playHead.isPlaying.store (isPlayingNow); + + if (isPlayingNow) + { + const auto currentAudioSourceLength = audioSourceLength.load(); + const auto currentPlayHeadPosition = playHead.timeInSamples.load(); + + // Rudimentary attempt to not seek beyond our sample data, assuming a fairly stable numSamples + // value. We should gain control over calling the AudioProcessorGraph's processBlock() calls so + // that we can do sample precise looping. + if (currentAudioSourceLength - currentPlayHeadPosition < numSamples) + playHead.timeInSamples.store (0); + else + playHead.timeInSamples.fetch_add (numSamples); + } + + if (goToStartSignal.exchange (false)) + playHead.timeInSamples.store (0); + } + + File getAudioSource() const override + { + std::lock_guard lock { instance.innerMutex }; + + if (context != nullptr) + return context->audioFile; + + return {}; + } + + void setAudioSource (File audioSourceFile) override + { + if (audioSourceFile.existsAsFile()) + { + { + std::lock_guard lock { contextUpdateSourceMutex }; + contextUpdateSource = ContextUpdateSource (std::move (audioSourceFile)); + } + + synchronise(); + } + } + + void clearAudioSource() override + { + { + std::lock_guard lock { contextUpdateSourceMutex }; + contextUpdateSource = ContextUpdateSource (ContextUpdateSource::Type::reset); + } + + synchronise(); + } + + void setPlaying (bool isPlayingIn) override { isPlaying.store (isPlayingIn); } + + void goToStart() override { goToStartSignal.store (true); } + + Editor* createEditor() { return new Editor (*this); } + + AudioPluginInstance& getAudioPluginInstance() { return instance; } + + private: + /** Use this to put the plugin in an unprepared state for the duration of adding and removing PlaybackRegions + to and from Renderers. + */ + class ScopedPluginDeactivator + { + public: + explicit ScopedPluginDeactivator (ARAPluginInstanceWrapper& inst) : instance (inst) + { + if (instance.prepareToPlayParams.isValid) + instance.inner->releaseResources(); + } + + ~ScopedPluginDeactivator() + { + if (instance.prepareToPlayParams.isValid) + instance.inner->prepareToPlay (instance.prepareToPlayParams.sampleRate, + instance.prepareToPlayParams.samplesPerBlock); + } + + private: + ARAPluginInstanceWrapper& instance; + + JUCE_DECLARE_NON_COPYABLE (ScopedPluginDeactivator) + }; + + class ContextUpdateSource + { + public: + enum class Type + { + empty, + audioSourceFile, + stateInformation, + reset + }; + + ContextUpdateSource() = default; + + explicit ContextUpdateSource (const File& file) + : type (Type::audioSourceFile), + audioSourceFile (file) + { + } + + ContextUpdateSource (const void* d, int s) + : type (Type::stateInformation), + stateInformation (d, (size_t) s) + { + } + + ContextUpdateSource (Type t) : type (t) + { + jassert (t == Type::reset); + } + + Type getType() const { return type; } + + const File& getAudioSourceFile() const + { + jassert (type == Type::audioSourceFile); + + return audioSourceFile; + } + + const MemoryBlock& getStateInformation() const + { + jassert (type == Type::stateInformation); + + return stateInformation; + } + + private: + Type type = Type::empty; + + File audioSourceFile; + MemoryBlock stateInformation; + }; + + void synchronise() + { + const SpinLock::ScopedLockType scope (instance.innerProcessBlockFlag); + std::lock_guard configurationLock (instance.innerMutex); + synchronizeStateWithDocumentController(); + } + + void synchronizeStateWithDocumentController() + { + bool resetContext = false; + + auto newContext = [&]() -> std::unique_ptr + { + std::lock_guard lock { contextUpdateSourceMutex }; + + switch (contextUpdateSource.getType()) + { + case ContextUpdateSource::Type::empty: + return {}; + + case ContextUpdateSource::Type::audioSourceFile: + if (! (contextUpdateSource.getAudioSourceFile().existsAsFile())) + return {}; + + { + const ARAEditGuard editGuard (documentController->getDocumentController()); + return std::make_unique (documentController->getDocumentController(), + contextUpdateSource.getAudioSourceFile()); + } + + case ContextUpdateSource::Type::stateInformation: + jassert (contextUpdateSource.getStateInformation().getSize() <= std::numeric_limits::max()); + + return Context::createFromStateInformation (documentController->getDocumentController(), + contextUpdateSource.getStateInformation().getData(), + (int) contextUpdateSource.getStateInformation().getSize()); + + case ContextUpdateSource::Type::reset: + resetContext = true; + return {}; + } + + jassertfalse; + return {}; + }(); + + if (newContext != nullptr) + { + { + ScopedPluginDeactivator deactivator (instance); + + context = std::move (newContext); + audioSourceLength.store (context->fileAudioSource.getFormatReader().lengthInSamples); + + auto& region = context->playbackRegion.getPlaybackRegion(); + playbackRenderer.add (region); + editorRenderer.add (region); + } + + sendChangeMessage(); + } + + if (resetContext) + { + { + ScopedPluginDeactivator deactivator (instance); + + context.reset(); + audioSourceLength.store (0); + } + + sendChangeMessage(); + } + } + + struct Context + { + Context (ARA::Host::DocumentController& dc, const File& audioFileIn) + : audioFile (audioFileIn), + musicalContext (dc), + regionSequence (dc, musicalContext, "track 1"), + fileAudioSource (dc, audioFile), + audioModification (dc, fileAudioSource), + playbackRegion (dc, regionSequence, audioModification, fileAudioSource) + { + } + + static std::unique_ptr createFromStateInformation (ARA::Host::DocumentController& dc, const void* d, int s) + { + if (auto xml = getXmlFromBinary (d, s)) + { + if (xml->hasTagName (xmlRootTag)) + { + File file { xml->getStringAttribute (xmlAudioFileAttrib) }; + + if (file.existsAsFile()) + return std::make_unique (dc, std::move (file)); + } + } + + return {}; + } + + void getStateInformation (juce::MemoryBlock& b) + { + XmlElement root { xmlRootTag }; + root.setAttribute (xmlAudioFileAttrib, audioFile.getFullPathName()); + copyXmlToBinary (root, b); + } + + const static Identifier xmlRootTag; + const static Identifier xmlAudioFileAttrib; + + File audioFile; + + MusicalContext musicalContext; + RegionSequence regionSequence; + FileAudioSource fileAudioSource; + AudioModification audioModification; + PlaybackRegion playbackRegion; + }; + + SimplePlayHead playHead; + ARAPluginInstanceWrapper& instance; + + std::unique_ptr documentController; + ARAHostModel::PlaybackRendererInterface playbackRenderer; + ARAHostModel::EditorRendererInterface editorRenderer; + + std::unique_ptr context; + + mutable std::mutex contextUpdateSourceMutex; + ContextUpdateSource contextUpdateSource; + + std::atomic isPlaying { false }; + std::atomic goToStartSignal { false }; + std::atomic audioSourceLength { 0 }; + }; + + explicit ARAPluginInstanceWrapper (std::unique_ptr innerIn) + : inner (std::move (innerIn)), araHost (*this) + { + jassert (inner != nullptr); + + for (auto isInput : { true, false }) + matchBuses (isInput); + + setBusesLayout (inner->getBusesLayout()); + } + + //============================================================================== + AudioProcessorEditor* createARAHostEditor() { return araHost.createEditor(); } + + //============================================================================== + const String getName() const override + { + std::lock_guard lock (innerMutex); + return inner->getName(); + } + + StringArray getAlternateDisplayNames() const override + { + std::lock_guard lock (innerMutex); + return inner->getAlternateDisplayNames(); + } + + double getTailLengthSeconds() const override + { + std::lock_guard lock (innerMutex); + return inner->getTailLengthSeconds(); + } + + bool acceptsMidi() const override + { + std::lock_guard lock (innerMutex); + return inner->acceptsMidi(); + } + + bool producesMidi() const override + { + std::lock_guard lock (innerMutex); + return inner->producesMidi(); + } + + AudioProcessorEditor* createEditor() override + { + std::lock_guard lock (innerMutex); + return inner->createEditorIfNeeded(); + } + + bool hasEditor() const override + { + std::lock_guard lock (innerMutex); + return inner->hasEditor(); + } + + int getNumPrograms() override + { + std::lock_guard lock (innerMutex); + return inner->getNumPrograms(); + } + + int getCurrentProgram() override + { + std::lock_guard lock (innerMutex); + return inner->getCurrentProgram(); + } + + void setCurrentProgram (int i) override + { + std::lock_guard lock (innerMutex); + inner->setCurrentProgram (i); + } + + const String getProgramName (int i) override + { + std::lock_guard lock (innerMutex); + return inner->getProgramName (i); + } + + void changeProgramName (int i, const String& n) override + { + std::lock_guard lock (innerMutex); + inner->changeProgramName (i, n); + } + + void getStateInformation (juce::MemoryBlock& b) override + { + XmlElement state ("ARAPluginInstanceWrapperState"); + + { + MemoryBlock m; + araHost.getStateInformation (m); + state.createNewChildElement ("host")->addTextElement (m.toBase64Encoding()); + } + + { + std::lock_guard lock (innerMutex); + + MemoryBlock m; + inner->getStateInformation (m); + state.createNewChildElement ("plugin")->addTextElement (m.toBase64Encoding()); + } + + copyXmlToBinary (state, b); + } + + void setStateInformation (const void* d, int s) override + { + if (auto xml = getXmlFromBinary (d, s)) + { + if (xml->hasTagName ("ARAPluginInstanceWrapperState")) + { + if (auto* hostState = xml->getChildByName ("host")) + { + MemoryBlock m; + m.fromBase64Encoding (hostState->getAllSubText()); + jassert (m.getSize() <= std::numeric_limits::max()); + araHost.setStateInformation (m.getData(), (int) m.getSize()); + } + + if (auto* pluginState = xml->getChildByName ("plugin")) + { + std::lock_guard lock (innerMutex); + + MemoryBlock m; + m.fromBase64Encoding (pluginState->getAllSubText()); + jassert (m.getSize() <= std::numeric_limits::max()); + inner->setStateInformation (m.getData(), (int) m.getSize()); + } + } + } + } + + void getCurrentProgramStateInformation (juce::MemoryBlock& b) override + { + std::lock_guard lock (innerMutex); + inner->getCurrentProgramStateInformation (b); + } + + void setCurrentProgramStateInformation (const void* d, int s) override + { + std::lock_guard lock (innerMutex); + inner->setCurrentProgramStateInformation (d, s); + } + + void prepareToPlay (double sr, int bs) override + { + std::lock_guard lock (innerMutex); + inner->setRateAndBufferSizeDetails (sr, bs); + inner->prepareToPlay (sr, bs); + prepareToPlayParams = { sr, bs }; + } + + void releaseResources() override { inner->releaseResources(); } + + void memoryWarningReceived() override { inner->memoryWarningReceived(); } + + void processBlock (AudioBuffer& a, MidiBuffer& m) override + { + const SpinLock::ScopedTryLockType scope (innerProcessBlockFlag); + + if (! scope.isLocked()) + return; + + inner->processBlock (a, m); + araHost.afterProcessBlock (a.getNumSamples()); + } + + void processBlock (AudioBuffer& a, MidiBuffer& m) override + { + const SpinLock::ScopedTryLockType scope (innerProcessBlockFlag); + + if (! scope.isLocked()) + return; + + inner->processBlock (a, m); + araHost.afterProcessBlock (a.getNumSamples()); + } + + void processBlockBypassed (AudioBuffer& a, MidiBuffer& m) override + { + const SpinLock::ScopedTryLockType scope (innerProcessBlockFlag); + + if (! scope.isLocked()) + return; + + inner->processBlockBypassed (a, m); + araHost.afterProcessBlock (a.getNumSamples()); + } + + void processBlockBypassed (AudioBuffer& a, MidiBuffer& m) override + { + const SpinLock::ScopedTryLockType scope (innerProcessBlockFlag); + + if (! scope.isLocked()) + return; + + inner->processBlockBypassed (a, m); + araHost.afterProcessBlock (a.getNumSamples()); + } + + bool supportsDoublePrecisionProcessing() const override + { + std::lock_guard lock (innerMutex); + return inner->supportsDoublePrecisionProcessing(); + } + + bool supportsMPE() const override + { + std::lock_guard lock (innerMutex); + return inner->supportsMPE(); + } + + bool isMidiEffect() const override + { + std::lock_guard lock (innerMutex); + return inner->isMidiEffect(); + } + + void reset() override + { + std::lock_guard lock (innerMutex); + inner->reset(); + } + + void setNonRealtime (bool b) noexcept override + { + std::lock_guard lock (innerMutex); + inner->setNonRealtime (b); + } + + void refreshParameterList() override + { + std::lock_guard lock (innerMutex); + inner->refreshParameterList(); + } + + void numChannelsChanged() override + { + std::lock_guard lock (innerMutex); + inner->numChannelsChanged(); + } + + void numBusesChanged() override + { + std::lock_guard lock (innerMutex); + inner->numBusesChanged(); + } + + void processorLayoutsChanged() override + { + std::lock_guard lock (innerMutex); + inner->processorLayoutsChanged(); + } + + void setPlayHead (AudioPlayHead* p) override { ignoreUnused (p); } + + void updateTrackProperties (const TrackProperties& p) override + { + std::lock_guard lock (innerMutex); + inner->updateTrackProperties (p); + } + + bool isBusesLayoutSupported (const BusesLayout& layout) const override + { + std::lock_guard lock (innerMutex); + return inner->checkBusesLayoutSupported (layout); + } + + bool canAddBus (bool) const override + { + std::lock_guard lock (innerMutex); + return true; + } + bool canRemoveBus (bool) const override + { + std::lock_guard lock (innerMutex); + return true; + } + + //============================================================================== + void fillInPluginDescription (PluginDescription& description) const override + { + return inner->fillInPluginDescription (description); + } + +private: + void matchBuses (bool isInput) + { + const auto inBuses = inner->getBusCount (isInput); + + while (getBusCount (isInput) < inBuses) + addBus (isInput); + + while (inBuses < getBusCount (isInput)) + removeBus (isInput); + } + + // Used for mutual exclusion between the audio and other threads + SpinLock innerProcessBlockFlag; + + // Used for mutual exclusion on non-audio threads + mutable std::mutex innerMutex; + + std::unique_ptr inner; + + ARATestHost araHost; + + struct PrepareToPlayParams + { + PrepareToPlayParams() : isValid (false) {} + + PrepareToPlayParams (double sampleRateIn, int samplesPerBlockIn) + : isValid (true), sampleRate (sampleRateIn), samplesPerBlock (samplesPerBlockIn) + { + } + + bool isValid; + double sampleRate; + int samplesPerBlock; + }; + + PrepareToPlayParams prepareToPlayParams; + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAPluginInstanceWrapper) +}; +#endif diff --git a/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.cpp b/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.cpp index db77d0cb..f7b99e25 100644 --- a/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.cpp +++ b/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.h b/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.h index d638f1f0..eca7618e 100644 --- a/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.h +++ b/extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp b/extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp index 996ad510..6edfc651 100644 --- a/extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp +++ b/extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -111,6 +111,7 @@ public: void setPlayHead (AudioPlayHead* p) override { inner->setPlayHead (p); } void updateTrackProperties (const TrackProperties& p) override { inner->updateTrackProperties (p); } bool isBusesLayoutSupported (const BusesLayout& layout) const override { return inner->checkBusesLayoutSupported (layout); } + bool applyBusLayouts (const BusesLayout& layouts) override { return inner->setBusesLayout (layouts) && AudioPluginInstance::applyBusLayouts (layouts); } bool canAddBus (bool) const override { return true; } bool canRemoveBus (bool) const override { return true; } diff --git a/extras/AudioPluginHost/Source/Plugins/InternalPlugins.h b/extras/AudioPluginHost/Source/Plugins/InternalPlugins.h index 54e189bb..0325239f 100644 --- a/extras/AudioPluginHost/Source/Plugins/InternalPlugins.h +++ b/extras/AudioPluginHost/Source/Plugins/InternalPlugins.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp b/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp index 0951c63d..9645492d 100644 --- a/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp +++ b/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -80,21 +80,23 @@ AudioProcessorGraph::Node::Ptr PluginGraph::getNodeForName (const String& name) return nullptr; } -void PluginGraph::addPlugin (const PluginDescription& desc, Point pos) +void PluginGraph::addPlugin (const PluginDescriptionAndPreference& desc, Point pos) { - std::shared_ptr dpiDisabler = makeDPIAwarenessDisablerForPlugin (desc); + std::shared_ptr dpiDisabler = makeDPIAwarenessDisablerForPlugin (desc.pluginDescription); - formatManager.createPluginInstanceAsync (desc, + formatManager.createPluginInstanceAsync (desc.pluginDescription, graph.getSampleRate(), graph.getBlockSize(), - [this, pos, dpiDisabler] (std::unique_ptr instance, const String& error) + [this, pos, dpiDisabler, useARA = desc.useARA] (std::unique_ptr instance, const String& error) { - addPluginCallback (std::move (instance), error, pos); + addPluginCallback (std::move (instance), error, pos, useARA); }); } void PluginGraph::addPluginCallback (std::unique_ptr instance, - const String& error, Point pos) + const String& error, + Point pos, + PluginDescriptionAndPreference::UseARA useARA) { if (instance == nullptr) { @@ -104,12 +106,21 @@ void PluginGraph::addPluginCallback (std::unique_ptr instan } else { + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + if (useARA == PluginDescriptionAndPreference::UseARA::yes + && instance->getPluginDescription().hasARAExtension) + { + instance = std::make_unique (std::move (instance)); + } + #endif + instance->enableAllBuses(); if (auto node = graph.addNode (std::move (instance))) { node->properties.set ("x", pos.x); node->properties.set ("y", pos.y); + node->properties.set ("useARA", useARA == PluginDescriptionAndPreference::UseARA::yes); changed(); } } @@ -200,10 +211,10 @@ void PluginGraph::newDocument() jassert (internalFormat.getAllTypes().size() > 3); - addPlugin (internalFormat.getAllTypes()[0], { 0.5, 0.1 }); - addPlugin (internalFormat.getAllTypes()[1], { 0.25, 0.1 }); - addPlugin (internalFormat.getAllTypes()[2], { 0.5, 0.9 }); - addPlugin (internalFormat.getAllTypes()[3], { 0.25, 0.9 }); + addPlugin (PluginDescriptionAndPreference { internalFormat.getAllTypes()[0] }, { 0.5, 0.1 }); + addPlugin (PluginDescriptionAndPreference { internalFormat.getAllTypes()[1] }, { 0.25, 0.1 }); + addPlugin (PluginDescriptionAndPreference { internalFormat.getAllTypes()[2] }, { 0.5, 0.9 }); + addPlugin (PluginDescriptionAndPreference { internalFormat.getAllTypes()[3] }, { 0.25, 0.9 }); MessageManager::callAsync ([this] { @@ -332,6 +343,7 @@ static XmlElement* createNodeXml (AudioProcessorGraph::Node* const node) noexcep e->setAttribute ("uid", (int) node->nodeID.uid); e->setAttribute ("x", node->properties ["x"].toString()); e->setAttribute ("y", node->properties ["y"].toString()); + e->setAttribute ("useARA", node->properties ["useARA"].toString()); for (int i = 0; i < (int) PluginWindow::Type::numTypes; ++i) { @@ -372,26 +384,42 @@ static XmlElement* createNodeXml (AudioProcessorGraph::Node* const node) noexcep void PluginGraph::createNodeFromXml (const XmlElement& xml) { - PluginDescription pd; + PluginDescriptionAndPreference pd; + const auto nodeUsesARA = xml.getBoolAttribute ("useARA"); for (auto* e : xml.getChildIterator()) { - if (pd.loadFromXml (*e)) + if (pd.pluginDescription.loadFromXml (*e)) + { + pd.useARA = nodeUsesARA ? PluginDescriptionAndPreference::UseARA::yes + : PluginDescriptionAndPreference::UseARA::no; break; + } } auto createInstanceWithFallback = [&]() -> std::unique_ptr { - auto createInstance = [this] (const PluginDescription& description) + auto createInstance = [this] (const PluginDescriptionAndPreference& description) -> std::unique_ptr { String errorMessage; - auto localDpiDisabler = makeDPIAwarenessDisablerForPlugin (description); + auto localDpiDisabler = makeDPIAwarenessDisablerForPlugin (description.pluginDescription); - return formatManager.createPluginInstance (description, - graph.getSampleRate(), - graph.getBlockSize(), - errorMessage); + auto instance = formatManager.createPluginInstance (description.pluginDescription, + graph.getSampleRate(), + graph.getBlockSize(), + errorMessage); + + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + if (instance + && description.useARA == PluginDescriptionAndPreference::UseARA::yes + && description.pluginDescription.hasARAExtension) + { + return std::make_unique (std::move (instance)); + } + #endif + + return instance; }; if (auto instance = createInstance (pd)) @@ -399,19 +427,19 @@ void PluginGraph::createNodeFromXml (const XmlElement& xml) const auto allFormats = formatManager.getFormats(); const auto matchingFormat = std::find_if (allFormats.begin(), allFormats.end(), - [&] (const AudioPluginFormat* f) { return f->getName() == pd.pluginFormatName; }); + [&] (const AudioPluginFormat* f) { return f->getName() == pd.pluginDescription.pluginFormatName; }); if (matchingFormat == allFormats.end()) return nullptr; const auto plugins = knownPlugins.getTypesForFormat (**matchingFormat); const auto matchingPlugin = std::find_if (plugins.begin(), plugins.end(), - [&] (const PluginDescription& desc) { return pd.uniqueId == desc.uniqueId; }); + [&] (const PluginDescription& desc) { return pd.pluginDescription.uniqueId == desc.uniqueId; }); if (matchingPlugin == plugins.end()) return nullptr; - return createInstance (*matchingPlugin); + return createInstance (PluginDescriptionAndPreference { *matchingPlugin }); }; if (auto instance = createInstanceWithFallback()) @@ -438,6 +466,7 @@ void PluginGraph::createNodeFromXml (const XmlElement& xml) node->properties.set ("x", xml.getDoubleAttribute ("x")); node->properties.set ("y", xml.getDoubleAttribute ("y")); + node->properties.set ("useARA", xml.getBoolAttribute ("useARA")); for (int i = 0; i < (int) PluginWindow::Type::numTypes; ++i) { diff --git a/extras/AudioPluginHost/Source/Plugins/PluginGraph.h b/extras/AudioPluginHost/Source/Plugins/PluginGraph.h index 5e89c408..7bc12f23 100644 --- a/extras/AudioPluginHost/Source/Plugins/PluginGraph.h +++ b/extras/AudioPluginHost/Source/Plugins/PluginGraph.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,6 +27,29 @@ #include "../UI/PluginWindow.h" +//============================================================================== +/** A type that encapsulates a PluginDescription and some preferences regarding + how plugins of that description should be instantiated. +*/ +struct PluginDescriptionAndPreference +{ + enum class UseARA { no, yes }; + + PluginDescriptionAndPreference() = default; + + explicit PluginDescriptionAndPreference (PluginDescription pd) + : pluginDescription (std::move (pd)), + useARA (pluginDescription.hasARAExtension ? PluginDescriptionAndPreference::UseARA::yes + : PluginDescriptionAndPreference::UseARA::no) + {} + + PluginDescriptionAndPreference (PluginDescription pd, UseARA ara) + : pluginDescription (std::move (pd)), useARA (ara) + {} + + PluginDescription pluginDescription; + UseARA useARA = UseARA::no; +}; //============================================================================== /** @@ -44,7 +67,7 @@ public: //============================================================================== using NodeID = AudioProcessorGraph::NodeID; - void addPlugin (const PluginDescription&, Point); + void addPlugin (const PluginDescriptionAndPreference&, Point); AudioProcessorGraph::Node::Ptr getNodeForName (const String& name) const; @@ -92,7 +115,10 @@ private: NodeID getNextUID() noexcept; void createNodeFromXml (const XmlElement&); - void addPluginCallback (std::unique_ptr, const String& error, Point); + void addPluginCallback (std::unique_ptr, + const String& error, + Point, + PluginDescriptionAndPreference::UseARA useARA); void changeListenerCallback (ChangeBroadcaster*) override; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginGraph) diff --git a/extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp b/extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp index 7060ac74..e68e0c09 100644 --- a/extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp +++ b/extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -398,6 +398,14 @@ struct GraphEditorPanel::PluginComponent : public Component, return {}; } + bool isNodeUsingARA() const + { + if (auto node = graph.graph.getNodeForId (pluginID)) + return node->properties["useARA"]; + + return false; + } + void showPopupMenu() { menu.reset (new PopupMenu); @@ -419,6 +427,12 @@ struct GraphEditorPanel::PluginComponent : public Component, menu->addItem ("Show all parameters", [this] { showWindow (PluginWindow::Type::generic); }); menu->addItem ("Show debug log", [this] { showWindow (PluginWindow::Type::debug); }); + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + if (auto* instance = dynamic_cast (getProcessor())) + if (instance->getPluginDescription().hasARAExtension && isNodeUsingARA()) + menu->addItem ("Show ARA host controls", [this] { showWindow (PluginWindow::Type::araHost); }); + #endif + if (autoScaleOptionAvailable) addPluginAutoScaleOptionsSubMenu (dynamic_cast (getProcessor()), *menu); @@ -784,7 +798,7 @@ void GraphEditorPanel::mouseDrag (const MouseEvent& e) stopTimer(); } -void GraphEditorPanel::createNewPlugin (const PluginDescription& desc, Point position) +void GraphEditorPanel::createNewPlugin (const PluginDescriptionAndPreference& desc, Point position) { graph.addPlugin (desc, position.toDouble() / Point ((double) getWidth(), (double) getHeight())); } @@ -1280,16 +1294,11 @@ void GraphDocumentComponent::resized() checkAvailableWidth(); } -void GraphDocumentComponent::createNewPlugin (const PluginDescription& desc, Point pos) +void GraphDocumentComponent::createNewPlugin (const PluginDescriptionAndPreference& desc, Point pos) { graphPanel->createNewPlugin (desc, pos); } -void GraphDocumentComponent::unfocusKeyboardComponent() -{ - keyboardComp->unfocusAllComponents(); -} - void GraphDocumentComponent::releaseGraph() { deviceManager.removeAudioCallback (&graphPlayer); @@ -1327,7 +1336,8 @@ void GraphDocumentComponent::itemDropped (const SourceDetails& details) // must be a valid index! jassert (isPositiveAndBelow (pluginTypeIndex, pluginList.getNumTypes())); - createNewPlugin (pluginList.getTypes()[pluginTypeIndex], details.localPosition); + createNewPlugin (PluginDescriptionAndPreference { pluginList.getTypes()[pluginTypeIndex] }, + details.localPosition); } void GraphDocumentComponent::showSidePanel (bool showSettingsPanel) diff --git a/extras/AudioPluginHost/Source/UI/GraphEditorPanel.h b/extras/AudioPluginHost/Source/UI/GraphEditorPanel.h index 0cc2a508..7223d0af 100644 --- a/extras/AudioPluginHost/Source/UI/GraphEditorPanel.h +++ b/extras/AudioPluginHost/Source/UI/GraphEditorPanel.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -38,10 +38,11 @@ class GraphEditorPanel : public Component, private Timer { public: + //============================================================================== GraphEditorPanel (PluginGraph& graph); ~GraphEditorPanel() override; - void createNewPlugin (const PluginDescription&, Point position); + void createNewPlugin (const PluginDescriptionAndPreference&, Point position); void paint (Graphics&) override; void resized() override; @@ -110,7 +111,7 @@ public: ~GraphDocumentComponent() override; //============================================================================== - void createNewPlugin (const PluginDescription&, Point position); + void createNewPlugin (const PluginDescriptionAndPreference&, Point position); void setDoublePrecision (bool doublePrecision); bool closeAnyOpenPluginWindows(); @@ -118,7 +119,6 @@ public: std::unique_ptr graph; void resized() override; - void unfocusKeyboardComponent(); void releaseGraph(); //============================================================================== diff --git a/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp b/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp index 0c7da61d..2f5338f1 100644 --- a/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp +++ b/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -29,6 +29,71 @@ constexpr const char* scanModeKey = "pluginScanMode"; +//============================================================================== +class Superprocess : private ChildProcessCoordinator +{ +public: + Superprocess() + { + launchWorkerProcess (File::getSpecialLocation (File::currentExecutableFile), processUID, 0, 0); + } + + enum class State + { + timeout, + gotResult, + connectionLost, + }; + + struct Response + { + State state; + std::unique_ptr xml; + }; + + Response getResponse() + { + std::unique_lock lock { mutex }; + + if (! condvar.wait_for (lock, std::chrono::milliseconds { 50 }, [&] { return gotResult || connectionLost; })) + return { State::timeout, nullptr }; + + const auto state = connectionLost ? State::connectionLost : State::gotResult; + connectionLost = false; + gotResult = false; + + return { state, std::move (pluginDescription) }; + } + + using ChildProcessCoordinator::sendMessageToWorker; + +private: + void handleMessageFromWorker (const MemoryBlock& mb) override + { + const std::lock_guard lock { mutex }; + pluginDescription = parseXML (mb.toString()); + gotResult = true; + condvar.notify_one(); + } + + void handleConnectionLost() override + { + const std::lock_guard lock { mutex }; + connectionLost = true; + condvar.notify_one(); + } + + std::mutex mutex; + std::condition_variable condvar; + + std::unique_ptr pluginDescription; + bool connectionLost = false; + bool gotResult = false; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Superprocess) +}; + +//============================================================================== class CustomPluginScanner : public KnownPluginList::CustomScanner, private ChangeListener { @@ -58,50 +123,54 @@ public: return true; } - if (superprocess == nullptr) - { - superprocess = std::make_unique (*this); + if (addPluginDescriptions (format.getName(), fileOrIdentifier, result)) + return true; - std::unique_lock lock (mutex); - connectionLost = false; - } + superprocess = nullptr; + return false; + } + + void scanFinished() override + { + superprocess = nullptr; + } + +private: + /* Scans for a plugin with format 'formatName' and ID 'fileOrIdentifier' using a subprocess, + and adds discovered plugin descriptions to 'result'. + + Returns true on success. + + Failure indicates that the subprocess is unrecoverable and should be terminated. + */ + bool addPluginDescriptions (const String& formatName, + const String& fileOrIdentifier, + OwnedArray& result) + { + if (superprocess == nullptr) + superprocess = std::make_unique(); MemoryBlock block; MemoryOutputStream stream { block, true }; - stream.writeString (format.getName()); + stream.writeString (formatName); stream.writeString (fileOrIdentifier); - if (superprocess->sendMessageToWorker (block)) - { - std::unique_lock lock (mutex); - gotResponse = false; - pluginDescription = nullptr; - - for (;;) - { - if (condvar.wait_for (lock, - std::chrono::milliseconds (50), - [this] { return gotResponse || shouldExit(); })) - { - break; - } - } + if (! superprocess->sendMessageToWorker (block)) + return false; + for (;;) + { if (shouldExit()) - { - superprocess = nullptr; return true; - } - if (connectionLost) - { - superprocess = nullptr; - return false; - } + const auto response = superprocess->getResponse(); - if (pluginDescription != nullptr) + if (response.state == Superprocess::State::timeout) + continue; + + if (response.xml != nullptr) { - for (const auto* item : pluginDescription->getChildIterator()) + for (const auto* item : response.xml->getChildIterator()) { auto desc = std::make_unique(); @@ -110,55 +179,10 @@ public: } } - return true; + return (response.state == Superprocess::State::gotResult); } - - superprocess = nullptr; - return false; - } - - void scanFinished() override - { - superprocess = nullptr; } -private: - class Superprocess : private ChildProcessCoordinator - { - public: - explicit Superprocess (CustomPluginScanner& o) - : owner (o) - { - launchWorkerProcess (File::getSpecialLocation (File::currentExecutableFile), processUID, 0, 0); - } - - using ChildProcessCoordinator::sendMessageToWorker; - - private: - void handleMessageFromWorker (const MemoryBlock& mb) override - { - auto xml = parseXML (mb.toString()); - - const std::lock_guard lock (owner.mutex); - owner.pluginDescription = std::move (xml); - owner.gotResponse = true; - owner.condvar.notify_one(); - } - - void handleConnectionLost() override - { - const std::lock_guard lock (owner.mutex); - owner.pluginDescription = nullptr; - owner.gotResponse = true; - owner.connectionLost = true; - owner.condvar.notify_one(); - } - - CustomPluginScanner& owner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Superprocess) - }; - void changeListenerCallback (ChangeBroadcaster*) override { if (auto* file = getAppProperties().getUserSettings()) @@ -166,11 +190,6 @@ private: } std::unique_ptr superprocess; - std::mutex mutex; - std::condition_variable condvar; - std::unique_ptr pluginDescription; - bool gotResponse = false; - bool connectionLost = false; std::atomic scanInProcess { true }; @@ -583,7 +602,7 @@ void MainHostWindow::menuItemSelected (int menuItemID, int /*topLevelMenuIndex*/ } else { - if (KnownPluginList::getIndexChosenByMenu (pluginDescriptions, menuItemID) >= 0) + if (getIndexChosenByMenu (menuItemID) >= 0) createPlugin (getChosenType (menuItemID), { proportionOfWidth (0.3f + Random::getSystemRandom().nextFloat() * 0.6f), proportionOfHeight (0.3f + Random::getSystemRandom().nextFloat() * 0.6f) }); } @@ -592,15 +611,67 @@ void MainHostWindow::menuItemSelected (int menuItemID, int /*topLevelMenuIndex*/ void MainHostWindow::menuBarActivated (bool isActivated) { if (isActivated && graphHolder != nullptr) - graphHolder->unfocusKeyboardComponent(); + Component::unfocusAllComponents(); } -void MainHostWindow::createPlugin (const PluginDescription& desc, Point pos) +void MainHostWindow::createPlugin (const PluginDescriptionAndPreference& desc, Point pos) { if (graphHolder != nullptr) graphHolder->createNewPlugin (desc, pos); } +static bool containsDuplicateNames (const Array& plugins, const String& name) +{ + int matches = 0; + + for (auto& p : plugins) + if (p.name == name && ++matches > 1) + return true; + + return false; +} + +static constexpr int menuIDBase = 0x324503f4; + +static void addToMenu (const KnownPluginList::PluginTree& tree, + PopupMenu& m, + const Array& allPlugins, + Array& addedPlugins) +{ + for (auto* sub : tree.subFolders) + { + PopupMenu subMenu; + addToMenu (*sub, subMenu, allPlugins, addedPlugins); + + m.addSubMenu (sub->folder, subMenu, true, nullptr, false, 0); + } + + auto addPlugin = [&] (const auto& descriptionAndPreference, const auto& pluginName) + { + addedPlugins.add (descriptionAndPreference); + const auto menuID = addedPlugins.size() - 1 + menuIDBase; + m.addItem (menuID, pluginName, true, false); + }; + + for (auto& plugin : tree.plugins) + { + auto name = plugin.name; + + if (containsDuplicateNames (tree.plugins, name)) + name << " (" << plugin.pluginFormatName << ')'; + + addPlugin (PluginDescriptionAndPreference { plugin, PluginDescriptionAndPreference::UseARA::no }, name); + + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + if (plugin.hasARAExtension) + { + name << " (ARA)"; + addPlugin (PluginDescriptionAndPreference { plugin }, name); + } + #endif + } +} + void MainHostWindow::addPluginsToMenu (PopupMenu& m) { if (graphHolder != nullptr) @@ -613,7 +684,7 @@ void MainHostWindow::addPluginsToMenu (PopupMenu& m) m.addSeparator(); - pluginDescriptions = knownPluginList.getTypes(); + auto pluginDescriptions = knownPluginList.getTypes(); // This avoids showing the internal types again later on in the list pluginDescriptions.removeIf ([] (PluginDescription& desc) @@ -621,15 +692,23 @@ void MainHostWindow::addPluginsToMenu (PopupMenu& m) return desc.pluginFormatName == InternalPluginFormat::getIdentifier(); }); - KnownPluginList::addToMenu (m, pluginDescriptions, pluginSortMethod); + auto tree = KnownPluginList::createTree (pluginDescriptions, pluginSortMethod); + pluginDescriptionsAndPreference = {}; + addToMenu (*tree, m, pluginDescriptions, pluginDescriptionsAndPreference); +} + +int MainHostWindow::getIndexChosenByMenu (int menuID) const +{ + const auto i = menuID - menuIDBase; + return isPositiveAndBelow (i, pluginDescriptionsAndPreference.size()) ? i : -1; } -PluginDescription MainHostWindow::getChosenType (const int menuID) const +PluginDescriptionAndPreference MainHostWindow::getChosenType (const int menuID) const { if (menuID >= 1 && menuID < (int) (1 + internalTypes.size())) - return internalTypes[(size_t) (menuID - 1)]; + return PluginDescriptionAndPreference { internalTypes[(size_t) (menuID - 1)] }; - return pluginDescriptions[KnownPluginList::getIndexChosenByMenu (pluginDescriptions, menuID)]; + return pluginDescriptionsAndPreference[getIndexChosenByMenu (menuID)]; } //============================================================================== @@ -912,7 +991,7 @@ void MainHostWindow::filesDropped (const StringArray& files, int x, int y) for (int i = 0; i < jmin (5, typesFound.size()); ++i) if (auto* desc = typesFound.getUnchecked(i)) - createPlugin (*desc, pos); + createPlugin (PluginDescriptionAndPreference { *desc }, pos); } } } diff --git a/extras/AudioPluginHost/Source/UI/MainHostWindow.h b/extras/AudioPluginHost/Source/UI/MainHostWindow.h index 7919946f..16e15987 100644 --- a/extras/AudioPluginHost/Source/UI/MainHostWindow.h +++ b/extras/AudioPluginHost/Source/UI/MainHostWindow.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -107,10 +107,10 @@ public: void tryToQuitApplication(); - void createPlugin (const PluginDescription&, Point pos); + void createPlugin (const PluginDescriptionAndPreference&, Point pos); void addPluginsToMenu (PopupMenu&); - PluginDescription getChosenType (int menuID) const; + PluginDescriptionAndPreference getChosenType (int menuID) const; std::unique_ptr graphHolder; @@ -124,6 +124,8 @@ private: void showAudioSettings(); + int getIndexChosenByMenu (int menuID) const; + //============================================================================== AudioDeviceManager deviceManager; AudioPluginFormatManager formatManager; @@ -131,7 +133,7 @@ private: std::vector internalTypes; KnownPluginList knownPluginList; KnownPluginList::SortMethod pluginSortMethod; - Array pluginDescriptions; + Array pluginDescriptionsAndPreference; class PluginListWindow; std::unique_ptr pluginListWindow; diff --git a/extras/AudioPluginHost/Source/UI/PluginWindow.h b/extras/AudioPluginHost/Source/UI/PluginWindow.h index 4eb95d6a..b53fb7be 100644 --- a/extras/AudioPluginHost/Source/UI/PluginWindow.h +++ b/extras/AudioPluginHost/Source/UI/PluginWindow.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,7 @@ #pragma once #include "../Plugins/IOConfigurationWindow.h" +#include "../Plugins/ARAPlugin.h" inline String getFormatSuffix (const AudioProcessor* plugin) { @@ -155,15 +156,16 @@ public: programs, audioIO, debug, + araHost, numTypes }; PluginWindow (AudioProcessorGraph::Node* n, Type t, OwnedArray& windowList) - : DocumentWindow (n->getProcessor()->getName() + getFormatSuffix (n->getProcessor()), - LookAndFeel::getDefaultLookAndFeel().findColour (ResizableWindow::backgroundColourId), - DocumentWindow::minimiseButton | DocumentWindow::closeButton), - activeWindowList (windowList), - node (n), type (t) + : DocumentWindow (n->getProcessor()->getName() + getFormatSuffix (n->getProcessor()), + LookAndFeel::getDefaultLookAndFeel().findColour (ResizableWindow::backgroundColourId), + DocumentWindow::minimiseButton | DocumentWindow::closeButton), + activeWindowList (windowList), + node (n), type (t) { setSize (400, 300); @@ -241,6 +243,16 @@ private: type = PluginWindow::Type::generic; } + if (type == PluginWindow::Type::araHost) + { + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + if (auto* araPluginInstanceWrapper = dynamic_cast (&processor)) + if (auto* ui = araPluginInstanceWrapper->createARAHostEditor()) + return ui; + #endif + return {}; + } + if (type == PluginWindow::Type::generic) return new GenericAudioProcessorEditor (processor); if (type == PluginWindow::Type::programs) return new ProgramAudioProcessorEditor (processor); if (type == PluginWindow::Type::audioIO) return new IOConfigurationWindow (processor); @@ -259,6 +271,7 @@ private: case Type::programs: return "Programs"; case Type::audioIO: return "IO"; case Type::debug: return "Debug"; + case Type::araHost: return "ARAHost"; case Type::numTypes: default: return {}; } diff --git a/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile b/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile index 3f8015de..cce0c076 100644 --- a/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile +++ b/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile @@ -11,6 +11,10 @@ endif # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ ifeq ($(CONFIG),Debug) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_CONSOLEAPP := BinaryBuilder JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,13 +60,13 @@ ifeq ($(CONFIG),Release) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_CONSOLEAPP := BinaryBuilder JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -Os $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -76,8 +80,8 @@ OBJECTS_CONSOLEAPP := \ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) $(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) : $(OBJECTS_CONSOLEAPP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors libcurl + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors libcurl @echo Linking "BinaryBuilder - ConsoleApp" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) diff --git a/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj b/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj index 83de5c3d..8472f922 100644 --- a/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj +++ b/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj @@ -140,7 +140,7 @@ 36B6F402BC83F21646259DEF = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; }; buildConfigurationList = E4C85B0464A93027D035AA1F; @@ -201,7 +201,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_STANDALONE_APPLICATION=1", @@ -212,10 +212,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -299,7 +299,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_STANDALONE_APPLICATION=1", @@ -310,10 +310,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( diff --git a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj index 2b14ea80..46030a21 100644 --- a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj +++ b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -77,7 +77,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\BinaryBuilder.exe @@ -105,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -118,7 +119,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\BinaryBuilder.exe @@ -152,9 +154,15 @@ true + + true + true + + true + true @@ -170,6 +178,9 @@ true + + true + true @@ -236,6 +247,9 @@ true + + true + true @@ -465,6 +479,7 @@ + @@ -473,6 +488,8 @@ + + diff --git a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters index 2587eff5..213893c2 100644 --- a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters +++ b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters @@ -91,9 +91,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -109,6 +115,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -175,6 +184,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -444,6 +456,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -468,6 +483,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/extras/BinaryBuilder/CMakeLists.txt b/extras/BinaryBuilder/CMakeLists.txt index 76303e6e..1f248ca7 100644 --- a/extras/BinaryBuilder/CMakeLists.txt +++ b/extras/BinaryBuilder/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/BinaryBuilder/Source/Main.cpp b/extras/BinaryBuilder/Source/Main.cpp index e84a49c9..1343aa77 100644 --- a/extras/BinaryBuilder/Source/Main.cpp +++ b/extras/BinaryBuilder/Source/Main.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/CMake/JUCECheckAtomic.cmake b/extras/Build/CMake/JUCECheckAtomic.cmake index e53f9527..4ffe75be 100644 --- a/extras/Build/CMake/JUCECheckAtomic.cmake +++ b/extras/Build/CMake/JUCECheckAtomic.cmake @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/CMake/JUCEConfig.cmake.in b/extras/Build/CMake/JUCEConfig.cmake.in index 782c7321..6a96e24e 100644 --- a/extras/Build/CMake/JUCEConfig.cmake.in +++ b/extras/Build/CMake/JUCEConfig.cmake.in @@ -20,6 +20,8 @@ @PACKAGE_INIT@ +include("${CMAKE_CURRENT_LIST_DIR}/LV2_HELPER.cmake") + if(NOT TARGET juce::juceaide) add_executable(juce::juceaide IMPORTED) set_target_properties(juce::juceaide PROPERTIES diff --git a/extras/Build/CMake/JUCEHelperTargets.cmake b/extras/Build/CMake/JUCEHelperTargets.cmake index f592f994..a3778640 100644 --- a/extras/Build/CMake/JUCEHelperTargets.cmake +++ b/extras/Build/CMake/JUCEHelperTargets.cmake @@ -1,3 +1,26 @@ +# ============================================================================== +# +# This file is part of the JUCE library. +# Copyright (c) 2022 - Raw Material Software Limited +# +# JUCE is an open source library subject to commercial or open-source +# licensing. +# +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. +# +# End User License Agreement: www.juce.com/juce-7-licence +# Privacy Policy: www.juce.com/juce-privacy-policy +# +# Or: You may also use this code under the terms of the GPL v3 (see +# www.gnu.org/licenses). +# +# JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER +# EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE +# DISCLAIMED. +# +# ============================================================================== + add_library(juce_recommended_warning_flags INTERFACE) add_library(juce::juce_recommended_warning_flags ALIAS juce_recommended_warning_flags) @@ -9,19 +32,21 @@ elseif((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR (CMAKE_CXX_COMPILER_ID STREQU -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wsign-conversion -Wbool-conversion -Wextra-semi -Wunreachable-code - -Wcast-align -Wshift-sign-overflow -Wno-missing-field-initializers + -Wcast-align -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wno-ignored-qualifiers -Wswitch-enum -Wpedantic -Wdeprecated $<$,$>: -Wzero-as-null-pointer-constant -Wunused-private-field -Woverloaded-virtual -Wreorder - -Winconsistent-missing-destructor-override>) + -Winconsistent-missing-destructor-override> + $<$,$>: + -Wunguarded-availability -Wunguarded-availability-new>) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") target_compile_options(juce_recommended_warning_flags INTERFACE -Wall -Wextra -Wpedantic -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wsign-compare -Wsign-conversion -Wunreachable-code -Wcast-align -Wno-implicit-fallthrough -Wno-maybe-uninitialized - -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum + -Wno-ignored-qualifiers -Wswitch-enum -Wredundant-decls -Wno-strict-overflow -Wshadow $<$: -Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant>) diff --git a/extras/Build/CMake/JUCEModuleSupport.cmake b/extras/Build/CMake/JUCEModuleSupport.cmake index 5f5f1de8..ac2a0fe3 100644 --- a/extras/Build/CMake/JUCEModuleSupport.cmake +++ b/extras/Build/CMake/JUCEModuleSupport.cmake @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -120,23 +120,23 @@ function(_juce_extract_metadata_block delim_str file_with_block out_dict) foreach(line IN LISTS module_header_contents) if(NOT append) - if(line MATCHES " *BEGIN_${delim_str} *") + if(line MATCHES "[\t ]*BEGIN_${delim_str}[\t ]*") set(append YES) endif() continue() endif() - if(append AND (line MATCHES " *END_${delim_str} *")) + if(append AND (line MATCHES "[\t ]*END_${delim_str}[\t ]*")) break() endif() - if(line MATCHES "^ *([a-zA-Z]+):") + if(line MATCHES "^[\t ]*([a-zA-Z]+):") set(last_written_key "${CMAKE_MATCH_1}") endif() - string(REGEX REPLACE "^ *${last_written_key}: *" "" line "${line}") - string(REGEX REPLACE "[ ,]+" ";" line "${line}") + string(REGEX REPLACE "^[\t ]*${last_written_key}:[\t ]*" "" line "${line}") + string(REGEX REPLACE "[\t ,]+" ";" line "${line}") set_property(TARGET ${target_name} APPEND PROPERTY "INTERFACE_JUCE_${last_written_key}" "${line}") @@ -234,7 +234,7 @@ endfunction() # ================================================================================================== function(_juce_get_all_plugin_kinds out) - set(${out} AU AUv3 AAX Standalone Unity VST VST3 PARENT_SCOPE) + set(${out} AU AUv3 AAX LV2 Standalone Unity VST VST3 PARENT_SCOPE) endfunction() function(_juce_get_platform_plugin_kinds out) @@ -249,7 +249,7 @@ function(_juce_get_platform_plugin_kinds out) endif() if(NOT CMAKE_SYSTEM_NAME STREQUAL "iOS" AND NOT CMAKE_SYSTEM_NAME STREQUAL "Android") - list(APPEND result AAX Unity VST VST3) + list(APPEND result AAX Unity VST VST3 LV2) endif() set(${out} ${result} PARENT_SCOPE) @@ -272,22 +272,29 @@ endfunction() # ================================================================================================== -# Takes a target, a link visibility, and a variable-length list of framework -# names. On macOS, finds the requested frameworks using `find_library` and -# links them. On iOS, links directly with `-framework Name`. +# Takes a target, a link visibility, if it should be a weak link, and a variable-length list of +# framework names. On macOS, for non-weak links, this finds the requested frameworks using +# `find_library`. function(_juce_link_frameworks target visibility) - foreach(framework IN LISTS ARGN) + set(options WEAK) + cmake_parse_arguments(JUCE_LINK_FRAMEWORKS "${options}" "" "" ${ARGN}) + foreach(framework IN LISTS JUCE_LINK_FRAMEWORKS_UNPARSED_ARGUMENTS) if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") - find_library("juce_found_${framework}" "${framework}" REQUIRED) - target_link_libraries("${target}" "${visibility}" "${juce_found_${framework}}") + if(JUCE_LINK_FRAMEWORKS_WEAK) + set(framework_flags "-weak_framework ${framework}") + else() + find_library("juce_found_${framework}" "${framework}" REQUIRED) + set(framework_flags "${juce_found_${framework}}") + endif() elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS") # CoreServices is only available on iOS 12+, we must link it weakly on earlier platforms - if((framework STREQUAL "CoreServices") AND (CMAKE_OSX_DEPLOYMENT_TARGET LESS 12.0)) + if(JUCE_LINK_FRAMEWORKS_WEAK OR ((framework STREQUAL "CoreServices") AND (CMAKE_OSX_DEPLOYMENT_TARGET LESS 12.0))) set(framework_flags "-weak_framework ${framework}") else() set(framework_flags "-framework ${framework}") endif() - + endif() + if(NOT framework_flags STREQUAL "") target_link_libraries("${target}" "${visibility}" "${framework_flags}") endif() endforeach() @@ -398,6 +405,11 @@ endfunction() # ================================================================================================== +function(_juce_remove_empty_list_elements arg) + list(FILTER ${arg} EXCLUDE REGEX "^$") + set(${arg} ${${arg}} PARENT_SCOPE) +endfunction() + function(juce_add_module module_path) set(one_value_args INSTALL_PATH ALIAS_NAMESPACE) cmake_parse_arguments(JUCE_ARG "" "${one_value_args}" "" ${ARGN}) @@ -484,8 +496,30 @@ function(juce_add_module module_path) target_link_libraries(juce_audio_processors INTERFACE juce_vst3_headers) + add_library(juce_lilv_headers INTERFACE) + set(lv2_base_path "${base_path}/juce_audio_processors/format_types/LV2_SDK") + target_include_directories(juce_lilv_headers INTERFACE + "${lv2_base_path}" + "${lv2_base_path}/lv2" + "${lv2_base_path}/serd" + "${lv2_base_path}/sord" + "${lv2_base_path}/sord/src" + "${lv2_base_path}/sratom" + "${lv2_base_path}/lilv" + "${lv2_base_path}/lilv/src") + target_link_libraries(juce_audio_processors INTERFACE juce_lilv_headers) + + add_library(juce_ara_headers INTERFACE) + + target_include_directories(juce_ara_headers INTERFACE + "$<$:$>") + + target_link_libraries(juce_audio_processors INTERFACE juce_ara_headers) + if(JUCE_ARG_ALIAS_NAMESPACE) add_library(${JUCE_ARG_ALIAS_NAMESPACE}::juce_vst3_headers ALIAS juce_vst3_headers) + add_library(${JUCE_ARG_ALIAS_NAMESPACE}::juce_lilv_headers ALIAS juce_lilv_headers) + add_library(${JUCE_ARG_ALIAS_NAMESPACE}::juce_ara_headers ALIAS juce_ara_headers) endif() endif() @@ -529,26 +563,34 @@ function(juce_add_module module_path) if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") _juce_get_metadata("${metadata_dict}" OSXFrameworks module_osxframeworks) + _juce_remove_empty_list_elements(module_osxframeworks) foreach(module_framework IN LISTS module_osxframeworks) - if(module_framework STREQUAL "") - continue() - endif() - _juce_link_frameworks("${module_name}" INTERFACE "${module_framework}") endforeach() + _juce_get_metadata("${metadata_dict}" WeakOSXFrameworks module_weakosxframeworks) + + _juce_remove_empty_list_elements(module_weakosxframeworks) + foreach(module_framework IN LISTS module_weakosxframeworks) + _juce_link_frameworks("${module_name}" INTERFACE WEAK "${module_framework}") + endforeach() + _juce_link_libs_from_metadata("${module_name}" "${metadata_dict}" OSXLibs) elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS") _juce_get_metadata("${metadata_dict}" iOSFrameworks module_iosframeworks) + _juce_remove_empty_list_elements(module_iosframeworks) foreach(module_framework IN LISTS module_iosframeworks) - if(module_framework STREQUAL "") - continue() - endif() - _juce_link_frameworks("${module_name}" INTERFACE "${module_framework}") endforeach() + _juce_get_metadata("${metadata_dict}" WeakiOSFrameworks module_weakiosframeworks) + + _juce_remove_empty_list_elements(module_weakiosframeworks) + foreach(module_framework IN LISTS module_weakiosframeworks) + _juce_link_frameworks("${module_name}" INTERFACE WEAK "${module_framework}") + endforeach() + _juce_link_libs_from_metadata("${module_name}" "${metadata_dict}" iOSLibs) elseif((CMAKE_SYSTEM_NAME STREQUAL "Linux") OR (CMAKE_SYSTEM_NAME MATCHES ".*BSD")) _juce_get_metadata("${metadata_dict}" linuxPackages module_linuxpackages) diff --git a/extras/Build/CMake/JUCEUtils.cmake b/extras/Build/CMake/JUCEUtils.cmake index 245fe233..9b2a9cda 100644 --- a/extras/Build/CMake/JUCEUtils.cmake +++ b/extras/Build/CMake/JUCEUtils.cmake @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -75,6 +75,10 @@ define_property(TARGET PROPERTY JUCE_UNITY_COPY_DIR INHERITED BRIEF_DOCS "Install location for Unity plugins" FULL_DOCS "This is where the plugin will be copied if plugin copying is enabled") +define_property(TARGET PROPERTY JUCE_LV2_COPY_DIR INHERITED + BRIEF_DOCS "Install location for LV2 plugins" + FULL_DOCS "This is where the plugin will be copied if plugin copying is enabled") + define_property(TARGET PROPERTY JUCE_COPY_PLUGIN_AFTER_BUILD INHERITED BRIEF_DOCS "Whether or not plugins should be copied after building" FULL_DOCS "Whether or not plugins should be copied after building") @@ -97,10 +101,12 @@ endif() function(_juce_set_default_properties) if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") - set_property(GLOBAL PROPERTY JUCE_VST_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/VST") - set_property(GLOBAL PROPERTY JUCE_VST3_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/VST3") - set_property(GLOBAL PROPERTY JUCE_AU_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/Components") - set_property(GLOBAL PROPERTY JUCE_AAX_COPY_DIR "/Library/Application Support/Avid/Audio/Plug-Ins") + set_property(GLOBAL PROPERTY JUCE_LV2_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/LV2") + set_property(GLOBAL PROPERTY JUCE_VST_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/VST") + set_property(GLOBAL PROPERTY JUCE_VST3_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/VST3") + set_property(GLOBAL PROPERTY JUCE_AU_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/Components") + set_property(GLOBAL PROPERTY JUCE_UNITY_COPY_DIR "$ENV{HOME}/Library/Audio/Plug-Ins/Unity") + set_property(GLOBAL PROPERTY JUCE_AAX_COPY_DIR "/Library/Application Support/Avid/Audio/Plug-Ins") elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows") if(CMAKE_SIZEOF_VOID_P EQUAL 8) set_property(GLOBAL PROPERTY JUCE_VST_COPY_DIR "$ENV{ProgramW6432}/Steinberg/Vstplugins") @@ -110,11 +116,15 @@ function(_juce_set_default_properties) set(prefix "$ENV{CommonProgramFiles\(x86\)}") endif() - set_property(GLOBAL PROPERTY JUCE_VST3_COPY_DIR "${prefix}/VST3") - set_property(GLOBAL PROPERTY JUCE_AAX_COPY_DIR "${prefix}/Avid/Audio/Plug-Ins") + set_property(GLOBAL PROPERTY JUCE_VST3_COPY_DIR "${prefix}/VST3") + set_property(GLOBAL PROPERTY JUCE_AAX_COPY_DIR "${prefix}/Avid/Audio/Plug-Ins") + set_property(GLOBAL PROPERTY JUCE_LV2_COPY_DIR "$ENV{APPDATA}/LV2") + set_property(GLOBAL PROPERTY JUCE_UNITY_COPY_DIR "$ENV{APPDATA}/Unity") elseif((CMAKE_SYSTEM_NAME STREQUAL "Linux") OR (CMAKE_SYSTEM_NAME MATCHES ".*BSD")) - set_property(GLOBAL PROPERTY JUCE_VST_COPY_DIR "$ENV{HOME}/.vst") - set_property(GLOBAL PROPERTY JUCE_VST3_COPY_DIR "$ENV{HOME}/.vst3") + set_property(GLOBAL PROPERTY JUCE_LV2_COPY_DIR "$ENV{HOME}/.lv2") + set_property(GLOBAL PROPERTY JUCE_VST_COPY_DIR "$ENV{HOME}/.vst") + set_property(GLOBAL PROPERTY JUCE_VST3_COPY_DIR "$ENV{HOME}/.vst3") + set_property(GLOBAL PROPERTY JUCE_UNITY_COPY_DIR "$ENV{HOME}/.unity") endif() endfunction() @@ -506,10 +516,13 @@ function(_juce_execute_juceaide) message(FATAL_ERROR "juceaide was imported, but it doesn't exist!") endif() - execute_process(COMMAND "${juceaide_location}" ${ARGN} RESULT_VARIABLE result_variable) + execute_process(COMMAND "${juceaide_location}" ${ARGN} + RESULT_VARIABLE result_variable + OUTPUT_VARIABLE output + ERROR_VARIABLE output) if(result_variable) - message(FATAL_ERROR "Running juceaide failed") + message(FATAL_ERROR "Running juceaide failed:\n${output}") endif() endfunction() @@ -992,6 +1005,29 @@ function(_juce_set_plugin_target_properties shared_code_target kind) "${script_file}" JUCE_UNITY_COPY_DIR) endif() + elseif(kind STREQUAL "LV2") + set_target_properties(${target_name} PROPERTIES BUNDLE FALSE) + + get_target_property(JUCE_LV2URI "${shared_code_target}" JUCE_LV2URI) + + if(NOT JUCE_LV2URI MATCHES "https?://.*") + message(WARNING + "LV2URI should be well-formed with an 'http' prefix. " + "Check the LV2URI argument to juce_add_plugin.") + endif() + + set(source_header "${JUCE_CMAKE_UTILS_DIR}/JuceLV2Defines.h.in") + get_target_property(juce_library_code "${shared_code_target}" JUCE_GENERATED_SOURCES_DIRECTORY) + configure_file("${source_header}" "${juce_library_code}/JuceLV2Defines.h") + + set(output_path "${products_folder}/${product_name}.lv2") + set_target_properties(${target_name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${output_path}") + + add_custom_command(TARGET ${target_name} POST_BUILD + COMMAND juce::juce_lv2_helper "$" + VERBATIM) + + _juce_set_copy_properties(${shared_code_target} ${target_name} "${output_path}" JUCE_LV2_COPY_DIR) endif() endfunction() @@ -1017,6 +1053,8 @@ function(_juce_get_plugin_kind_name kind out_var) set(${out_var} "AUv3 AppExtension" PARENT_SCOPE) elseif(kind STREQUAL "AAX") set(${out_var} "AAX" PARENT_SCOPE) + elseif(kind STREQUAL "LV2") + set(${out_var} "LV2" PARENT_SCOPE) elseif(kind STREQUAL "Standalone") set(${out_var} "Standalone Plugin" PARENT_SCOPE) elseif(kind STREQUAL "Unity") @@ -1077,7 +1115,10 @@ function(_juce_link_plugin_wrapper shared_code_target kind) add_dependencies(${shared_code_target}_All ${target_name}) - _juce_configure_bundle(${shared_code_target} ${target_name}) + if(NOT kind STREQUAL "LV2") + _juce_configure_bundle(${shared_code_target} ${target_name}) + endif() + _juce_set_plugin_target_properties(${shared_code_target} ${kind}) endfunction() @@ -1196,7 +1237,13 @@ function(_juce_configure_plugin_targets target) JucePlugin_AAXDisableBypass=$> JucePlugin_AAXDisableMultiMono=$> JucePlugin_VSTNumMidiInputs=$ - JucePlugin_VSTNumMidiOutputs=$) + JucePlugin_VSTNumMidiOutputs=$ + JucePlugin_Enable_ARA=$> + JucePlugin_ARAFactoryID=$ + JucePlugin_ARADocumentArchiveID=$ + JucePlugin_ARACompatibleArchiveIDs=$ + JucePlugin_ARAContentTypes=$ + JucePlugin_ARATransformationFlags=$) set_target_properties(${target} PROPERTIES POSITION_INDEPENDENT_CODE TRUE @@ -1471,6 +1518,90 @@ function(_juce_set_fallback_properties target) if(NOT aax_category_int STREQUAL "") set_target_properties(${target} PROPERTIES JUCE_AAX_CATEGORY ${aax_category_int}) endif() + + # Ensure this matches the Projucer implementation + get_target_property(company_website ${target} JUCE_COMPANY_WEBSITE) + get_target_property(plugin_name ${target} JUCE_PLUGIN_NAME) + string(MAKE_C_IDENTIFIER "${plugin_name}" plugin_name_sanitised) + _juce_set_property_if_not_set(${target} LV2URI "${company_website}/plugins/${plugin_name_sanitised}") + + # ARA configuration + # Analysis types + set(ara_analysis_type_strings + kARAContentTypeNotes + kARAContentTypeTempoEntries + kARAContentTypeBarSignatures + kARAContentTypeStaticTuning + kARAContentTypeKeySignatures + kARAContentTypeSheetChords) + + get_target_property(actual_ara_analysis_types ${target} JUCE_ARA_ANALYSIS_TYPES) + + set(ara_analysis_types_int "") + + foreach(category_string IN LISTS actual_ara_analysis_types) + list(FIND ara_analysis_type_strings ${category_string} ara_index) + + if(ara_index GREATER_EQUAL 0) + set(ara_analysis_types_bit "1 << ${ara_index}") + + if(ara_analysis_types_int STREQUAL "") + set(ara_analysis_types_int 0) + endif() + + math(EXPR ara_analysis_types_int "${ara_analysis_types_int} | (${ara_analysis_types_bit})") + endif() + endforeach() + + if(NOT ara_analysis_types_int STREQUAL "") + set_target_properties(${target} PROPERTIES JUCE_ARA_ANALYSIS_TYPES ${ara_analysis_types_int}) + endif() + + _juce_set_property_if_not_set(${target} ARA_ANALYSIS_TYPES 0) + + # Transformation flags + set(ara_transformation_flags_strings + kARAPlaybackTransformationNoChanges + kARAPlaybackTransformationTimestretch + kARAPlaybackTransformationTimestretchReflectingTempo + kARAPlaybackTransformationContentBasedFadeAtTail + kARAPlaybackTransformationContentBasedFadeAtHead) + + set(default_ara_transformation_flags kARAPlaybackTransformationNoChanges) + + _juce_set_property_if_not_set(${target} ARA_TRANSFORMATION_FLAGS ${default_ara_transformation_flags}) + + get_target_property(actual_ara_transformation_flags ${target} JUCE_ARA_TRANSFORMATION_FLAGS) + + set(ara_transformation_flags_int "") + + foreach(transformation_string IN LISTS actual_ara_transformation_flags) + list(FIND ara_transformation_flags_strings ${transformation_string} ara_transformation_index) + + if(ara_transformation_index GREATER_EQUAL 0) + if(ara_transformation_index EQUAL 0) + set(ara_transformation_bit 0) + else() + set(ara_transformation_bit "1 << (${ara_transformation_index} - 1)") + endif() + + if(ara_transformation_flags_int STREQUAL "") + set(ara_transformation_flags_int 0) + endif() + + math(EXPR ara_transformation_flags_int "${ara_transformation_flags_int} | (${ara_transformation_bit})") + endif() + endforeach() + + if(NOT ara_transformation_flags_int STREQUAL "") + set_target_properties(${target} PROPERTIES JUCE_ARA_TRANSFORMATION_FLAGS ${ara_transformation_flags_int}) + endif() + + _juce_set_property_if_not_set(${target} IS_ARA_EFFECT FALSE) + get_target_property(final_bundle_id ${target} JUCE_BUNDLE_ID) + _juce_set_property_if_not_set(${target} ARA_FACTORY_ID "\"${final_bundle_id}.arafactory.${final_version}\"") + _juce_set_property_if_not_set(${target} ARA_DOCUMENT_ARCHIVE_ID "\"${final_bundle_id}.aradocumentarchive.1\"") + _juce_set_property_if_not_set(${target} ARA_COMPATIBLE_ARCHIVE_IDS "\"\"") endfunction() # ================================================================================================== @@ -1537,6 +1668,10 @@ function(_juce_initialise_target target) SUPPRESS_AU_PLIST_RESOURCE_USAGE PLUGINHOST_AU # Set this true if you want to host AU plugins USE_LEGACY_COMPATIBILITY_PLUGIN_CODE + LV2URI + IS_ARA_EFFECT + ARA_FACTORY_ID + ARA_DOCUMENT_ARCHIVE_ID VST_COPY_DIR VST3_COPY_DIR @@ -1558,7 +1693,10 @@ function(_juce_initialise_target target) AAX_CATEGORY IPHONE_SCREEN_ORIENTATIONS # iOS only IPAD_SCREEN_ORIENTATIONS # iOS only - APP_GROUP_IDS) # iOS only + APP_GROUP_IDS # iOS only + ARA_COMPATIBLE_ARCHIVE_IDS + ARA_ANALYSIS_TYPES + ARA_TRANSFORMATION_FLAGS) cmake_parse_arguments(JUCE_ARG "" "${one_value_args}" "${multi_value_args}" ${ARGN}) @@ -1752,27 +1890,48 @@ function(juce_add_pip header) NEEDS_STORE_KIT TRUE) endif() + if("JUCE_PLUGINHOST_AU=1" IN_LIST pip_moduleflags) + list(APPEND extra_target_args PLUGINHOST_AU TRUE) + endif() + if(pip_kind STREQUAL "AudioProcessor") - set(source_main "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessor.cpp.in") + _juce_get_metadata("${metadata_dict}" documentControllerClass JUCE_PIP_DOCUMENTCONTROLLER_CLASS) + + if(JUCE_PIP_DOCUMENTCONTROLLER_CLASS) + if(NOT TARGET juce_ara_sdk) + message(WARNING + "${header} specifies a documentControllerClass, but the ARA SDK could not be located. " + "Use juce_set_ara_sdk_path to specify the ARA SDK location. " + "This PIP will not be configured.") + endif() - # We add AAX/VST2 targets too, if the user has set up those SDKs + set(source_main "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessorWithARA.cpp.in") - set(extra_formats) + juce_add_plugin(${JUCE_PIP_NAME} + FORMATS AU VST3 + IS_ARA_EFFECT TRUE) + else() + set(source_main "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessor.cpp.in") - if(TARGET juce_aax_sdk) - list(APPEND extra_formats AAX) - endif() + # We add AAX/VST2 targets too, if the user has set up those SDKs - if(TARGET juce_vst2_sdk) - list(APPEND extra_formats VST) - endif() + set(extra_formats) + + if(TARGET juce_aax_sdk) + list(APPEND extra_formats AAX) + endif() + + if(TARGET juce_vst2_sdk) + list(APPEND extra_formats VST) + endif() - # Standalone plugins might want to access the mic - list(APPEND extra_target_args MICROPHONE_PERMISSION_ENABLED TRUE) + # Standalone plugins might want to access the mic + list(APPEND extra_target_args MICROPHONE_PERMISSION_ENABLED TRUE) - juce_add_plugin(${JUCE_PIP_NAME} - FORMATS AU AUv3 VST3 Unity Standalone ${extra_formats} - ${extra_target_args}) + juce_add_plugin(${JUCE_PIP_NAME} + FORMATS AU AUv3 LV2 Standalone Unity VST3 ${extra_formats} + ${extra_target_args}) + endif() elseif(pip_kind STREQUAL "Component") set(source_main "${JUCE_CMAKE_UTILS_DIR}/PIPComponent.cpp.in") juce_add_gui_app(${JUCE_PIP_NAME} ${extra_target_args}) @@ -1924,6 +2083,22 @@ function(juce_set_vst3_sdk_path path) target_include_directories(juce_vst3_sdk INTERFACE "${path}") endfunction() +function(juce_set_ara_sdk_path path) + if(TARGET juce_ara_sdk) + message(FATAL_ERROR "juce_set_ara_sdk_path should only be called once") + endif() + + _juce_make_absolute(path) + + if(NOT EXISTS "${path}") + message(FATAL_ERROR "Could not find ARA SDK at the specified path: ${path}") + endif() + + add_library(juce_ara_sdk INTERFACE IMPORTED GLOBAL) + + target_include_directories(juce_ara_sdk INTERFACE "${path}") +endfunction() + # ================================================================================================== function(juce_disable_default_flags) diff --git a/extras/Build/CMake/JuceLV2Defines.h.in b/extras/Build/CMake/JuceLV2Defines.h.in new file mode 100644 index 00000000..3e3ea0e7 --- /dev/null +++ b/extras/Build/CMake/JuceLV2Defines.h.in @@ -0,0 +1,5 @@ +#pragma once + +#ifndef JucePlugin_LV2URI + #define JucePlugin_LV2URI "${JUCE_LV2URI}" +#endif diff --git a/extras/Build/CMake/PIPAudioProcessorWithARA.cpp.in b/extras/Build/CMake/PIPAudioProcessorWithARA.cpp.in new file mode 100644 index 00000000..522d049a --- /dev/null +++ b/extras/Build/CMake/PIPAudioProcessorWithARA.cpp.in @@ -0,0 +1,23 @@ +/* + ============================================================================== + + This file was auto-generated and contains the startup code for a PIP. + + ============================================================================== +*/ + +#include +#include "${JUCE_PIP_HEADER}" + +//============================================================================== +juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() +{ + return new ${JUCE_PIP_MAIN_CLASS}(); +} + +#if JucePlugin_Enable_ARA +const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory() +{ + return juce::ARADocumentControllerSpecialisation::createARAFactory<${JUCE_PIP_DOCUMENTCONTROLLER_CLASS}>(); +} +#endif diff --git a/extras/Build/CMake/checkBundleSigning.cmake b/extras/Build/CMake/checkBundleSigning.cmake index 457edd7b..20052f29 100644 --- a/extras/Build/CMake/checkBundleSigning.cmake +++ b/extras/Build/CMake/checkBundleSigning.cmake @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/CMake/copyDir.cmake b/extras/Build/CMake/copyDir.cmake index 73b87fba..fca14a86 100644 --- a/extras/Build/CMake/copyDir.cmake +++ b/extras/Build/CMake/copyDir.cmake @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/CMake/juce_runtime_arch_detection.cpp b/extras/Build/CMake/juce_runtime_arch_detection.cpp index 900f1356..90c9a66d 100644 --- a/extras/Build/CMake/juce_runtime_arch_detection.cpp +++ b/extras/Build/CMake/juce_runtime_arch_detection.cpp @@ -1,3 +1,28 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + #if defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(_M_ARM64) || defined(__aarch64__) || defined(__ARM64__) #if defined(_M_ARM64) || defined(__aarch64__) || defined(__ARM64__) diff --git a/extras/Build/CMakeLists.txt b/extras/Build/CMakeLists.txt index 122d12e2..3c2e26a1 100644 --- a/extras/Build/CMakeLists.txt +++ b/extras/Build/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/juce_build_tools.cpp b/extras/Build/juce_build_tools/juce_build_tools.cpp index 3dea8ef4..de9c09dc 100644 --- a/extras/Build/juce_build_tools/juce_build_tools.cpp +++ b/extras/Build/juce_build_tools/juce_build_tools.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/juce_build_tools.h b/extras/Build/juce_build_tools/juce_build_tools.h index d3e72f55..df19a98b 100644 --- a/extras/Build/juce_build_tools/juce_build_tools.h +++ b/extras/Build/juce_build_tools/juce_build_tools.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -34,7 +34,7 @@ ID: juce_build_tools vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE Build Tools description: Classes for generating intermediate files for JUCE projects. website: http://www.juce.com/juce diff --git a/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.cpp b/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.cpp index 04d68f12..b3c39380 100644 --- a/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.cpp +++ b/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -135,7 +135,9 @@ namespace build_tools cpp << "/* ==================================== " << resourceFileIdentifierString << " ===================================="; writeComment (cpp); - cpp << "namespace " << className << newLine + cpp << "#include " << newLine + << newLine + << "namespace " << className << newLine << "{" << newLine; while (i < files.size()) @@ -221,10 +223,8 @@ namespace build_tools << "const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8)" << newLine << "{" << newLine << " for (unsigned int i = 0; i < (sizeof (namedResourceList) / sizeof (namedResourceList[0])); ++i)" << newLine - << " {" << newLine - << " if (namedResourceList[i] == resourceNameUTF8)" << newLine + << " if (strcmp (namedResourceList[i], resourceNameUTF8) == 0)" << newLine << " return originalFilenames[i];" << newLine - << " }" << newLine << newLine << " return nullptr;" << newLine << "}" << newLine diff --git a/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.h b/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.h index 5c137626..f885b3cb 100644 --- a/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.h +++ b/extras/Build/juce_build_tools/utils/juce_BinaryResourceFile.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.cpp b/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.cpp index 3097c74d..f44839db 100644 --- a/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.cpp +++ b/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -72,12 +72,13 @@ namespace build_tools return "XPC!"; case Type::AAXPlugIn: - case Type::RTASPlugIn: return "TDMw"; case Type::ConsoleApp: case Type::StaticLibrary: case Type::DynamicLibrary: + case Type::LV2PlugIn: + case Type::LV2TurtleProgram: case Type::SharedCodeTarget: case Type::AggregateTarget: case Type::unspecified: @@ -102,12 +103,13 @@ namespace build_tools return "????"; case Type::AAXPlugIn: - case Type::RTASPlugIn: return "PTul"; case Type::ConsoleApp: case Type::StaticLibrary: case Type::DynamicLibrary: + case Type::LV2PlugIn: + case Type::LV2TurtleProgram: case Type::SharedCodeTarget: case Type::AggregateTarget: case Type::unspecified: diff --git a/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.h b/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.h index 74da0fdd..19e3af13 100644 --- a/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.h +++ b/extras/Build/juce_build_tools/utils/juce_BuildHelperFunctions.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/utils/juce_CppTokeniserFunctions.cpp b/extras/Build/juce_build_tools/utils/juce_CppTokeniserFunctions.cpp index 412936f5..3346648d 100644 --- a/extras/Build/juce_build_tools/utils/juce_CppTokeniserFunctions.cpp +++ b/extras/Build/juce_build_tools/utils/juce_CppTokeniserFunctions.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/utils/juce_Entitlements.cpp b/extras/Build/juce_build_tools/utils/juce_Entitlements.cpp index faac95a5..45f94461 100644 --- a/extras/Build/juce_build_tools/utils/juce_Entitlements.cpp +++ b/extras/Build/juce_build_tools/utils/juce_Entitlements.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/utils/juce_Entitlements.h b/extras/Build/juce_build_tools/utils/juce_Entitlements.h index a706fd35..b91a52a6 100644 --- a/extras/Build/juce_build_tools/utils/juce_Entitlements.h +++ b/extras/Build/juce_build_tools/utils/juce_Entitlements.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/utils/juce_Icons.cpp b/extras/Build/juce_build_tools/utils/juce_Icons.cpp index 1429cc0a..fe3d036f 100644 --- a/extras/Build/juce_build_tools/utils/juce_Icons.cpp +++ b/extras/Build/juce_build_tools/utils/juce_Icons.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/utils/juce_Icons.h b/extras/Build/juce_build_tools/utils/juce_Icons.h index d5590316..892d4293 100644 --- a/extras/Build/juce_build_tools/utils/juce_Icons.h +++ b/extras/Build/juce_build_tools/utils/juce_Icons.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/utils/juce_PlistOptions.cpp b/extras/Build/juce_build_tools/utils/juce_PlistOptions.cpp index df8f633a..6f263b16 100644 --- a/extras/Build/juce_build_tools/utils/juce_PlistOptions.cpp +++ b/extras/Build/juce_build_tools/utils/juce_PlistOptions.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -327,6 +327,13 @@ namespace build_tools addPlistDictionaryKey (*resourceUsageDict, "temporary-exception.files.all.read-write", true); } + if (isPluginARAEffect) + { + dict->createNewChildElement ("key")->addTextElement ("tags"); + auto* tagsArray = dict->createNewChildElement ("array"); + tagsArray->createNewChildElement ("string")->addTextElement ("ARA"); + } + return { plistKey, plistEntry }; } diff --git a/extras/Build/juce_build_tools/utils/juce_PlistOptions.h b/extras/Build/juce_build_tools/utils/juce_PlistOptions.h index b38172c8..9a30faf0 100644 --- a/extras/Build/juce_build_tools/utils/juce_PlistOptions.h +++ b/extras/Build/juce_build_tools/utils/juce_PlistOptions.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -93,6 +93,7 @@ namespace build_tools bool isAuSandboxSafe = false; bool isPluginSynth = false; bool suppressResourceUsage = false; + bool isPluginARAEffect = false; private: void write (MemoryOutputStream&) const; diff --git a/extras/Build/juce_build_tools/utils/juce_ProjectType.h b/extras/Build/juce_build_tools/utils/juce_ProjectType.h index dd027874..8d71a074 100644 --- a/extras/Build/juce_build_tools/utils/juce_ProjectType.h +++ b/extras/Build/juce_build_tools/utils/juce_ProjectType.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -57,6 +57,7 @@ namespace build_tools virtual bool isGUIApplication() const { return false; } virtual bool isCommandLineApp() const { return false; } virtual bool isAudioPlugin() const { return false; } + virtual bool isARAAudioPlugin() const { return false; } //============================================================================== struct Target @@ -71,15 +72,18 @@ namespace build_tools VSTPlugIn = 10, VST3PlugIn = 11, AAXPlugIn = 12, - RTASPlugIn = 13, + AudioUnitPlugIn = 14, AudioUnitv3PlugIn = 15, StandalonePlugIn = 16, UnityPlugIn = 17, + LV2PlugIn = 18, SharedCodeTarget = 20, // internal AggregateTarget = 21, + LV2TurtleProgram = 25, // internal + unspecified = 30 }; @@ -110,12 +114,12 @@ namespace build_tools case StandalonePlugIn: return "Standalone Plugin"; case AudioUnitv3PlugIn: return "AUv3 AppExtension"; case AAXPlugIn: return "AAX"; - case RTASPlugIn: return "RTAS"; case UnityPlugIn: return "Unity Plugin"; + case LV2PlugIn: return "LV2 Plugin"; case SharedCodeTarget: return "Shared Code"; case AggregateTarget: return "All"; - case unspecified: - default: break; + case LV2TurtleProgram: return "LV2 Manifest Helper"; + case unspecified: break; } return "undefined"; @@ -123,20 +127,21 @@ namespace build_tools static Type typeFromName (const String& name) { - if (name == "App") return Type::GUIApp; - if (name == "ConsoleApp") return Type::ConsoleApp; - if (name == "Static Library") return Type::StaticLibrary; - if (name == "Dynamic Library") return Type::DynamicLibrary; - if (name == "VST") return Type::VSTPlugIn; - if (name == "VST3") return Type::VST3PlugIn; - if (name == "AU") return Type::AudioUnitPlugIn; - if (name == "Standalone Plugin") return Type::StandalonePlugIn; - if (name == "AUv3 AppExtension") return Type::AudioUnitv3PlugIn; - if (name == "AAX") return Type::AAXPlugIn; - if (name == "RTAS") return Type::RTASPlugIn; - if (name == "Unity Plugin") return Type::UnityPlugIn; - if (name == "Shared Code") return Type::SharedCodeTarget; - if (name == "All") return Type::AggregateTarget; + if (name == "App") return Type::GUIApp; + if (name == "ConsoleApp") return Type::ConsoleApp; + if (name == "Static Library") return Type::StaticLibrary; + if (name == "Dynamic Library") return Type::DynamicLibrary; + if (name == "VST") return Type::VSTPlugIn; + if (name == "VST3") return Type::VST3PlugIn; + if (name == "AU") return Type::AudioUnitPlugIn; + if (name == "Standalone Plugin") return Type::StandalonePlugIn; + if (name == "AUv3 AppExtension") return Type::AudioUnitv3PlugIn; + if (name == "AAX") return Type::AAXPlugIn; + if (name == "Unity Plugin") return Type::UnityPlugIn; + if (name == "LV2 Plugin") return Type::LV2PlugIn; + if (name == "Shared Code") return Type::SharedCodeTarget; + if (name == "All") return Type::AggregateTarget; + if (name == "LV2 Manifest Helper") return Type::LV2TurtleProgram; jassertfalse; return Type::ConsoleApp; @@ -156,12 +161,13 @@ namespace build_tools case StandalonePlugIn: return executable; case AudioUnitv3PlugIn: return macOSAppex; case AAXPlugIn: return pluginBundle; - case RTASPlugIn: return pluginBundle; case UnityPlugIn: return pluginBundle; + case LV2PlugIn: return pluginBundle; case SharedCodeTarget: return staticLibrary; + case LV2TurtleProgram: return executable; case AggregateTarget: case unspecified: - default: break; + break; } return unknown; @@ -238,7 +244,43 @@ namespace build_tools case Target::VSTPlugIn: case Target::VST3PlugIn: case Target::AAXPlugIn: - case Target::RTASPlugIn: + case Target::AudioUnitPlugIn: + case Target::AudioUnitv3PlugIn: + case Target::StandalonePlugIn: + case Target::UnityPlugIn: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: + case Target::SharedCodeTarget: + case Target::AggregateTarget: + return true; + + case Target::GUIApp: + case Target::ConsoleApp: + case Target::StaticLibrary: + case Target::DynamicLibrary: + case Target::unspecified: + break; + } + + return false; + } + }; + + struct ProjectType_ARAAudioPlugin : public ProjectType + { + ProjectType_ARAAudioPlugin() : ProjectType (getTypeName(), "ARA Audio Plug-in") {} + + static const char* getTypeName() noexcept { return "araaudioplug"; } + bool isAudioPlugin() const override { return true; } + bool isARAAudioPlugin() const override { return true; } + + bool supportsTargetType (Target::Type targetType) const override + { + switch (targetType) + { + case Target::VSTPlugIn: + case Target::VST3PlugIn: + case Target::AAXPlugIn: case Target::AudioUnitPlugIn: case Target::AudioUnitv3PlugIn: case Target::StandalonePlugIn: @@ -252,7 +294,8 @@ namespace build_tools case Target::StaticLibrary: case Target::DynamicLibrary: case Target::unspecified: - default: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: break; } @@ -268,8 +311,9 @@ namespace build_tools static ProjectType_StaticLibrary staticLib; static ProjectType_DLL dll; static ProjectType_AudioPlugin plugin; + static ProjectType_ARAAudioPlugin araplugin; - return Array(&guiApp, &consoleApp, &staticLib, &dll, &plugin); + return Array(&guiApp, &consoleApp, &staticLib, &dll, &plugin, &araplugin); } } } diff --git a/extras/Build/juce_build_tools/utils/juce_RelativePath.h b/extras/Build/juce_build_tools/utils/juce_RelativePath.h index c7393d0c..eb61d496 100644 --- a/extras/Build/juce_build_tools/utils/juce_RelativePath.h +++ b/extras/Build/juce_build_tools/utils/juce_RelativePath.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.cpp b/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.cpp index 85ea18ea..24ecc921 100644 --- a/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.cpp +++ b/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.h b/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.h index 91ba8194..f1b86792 100644 --- a/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.h +++ b/extras/Build/juce_build_tools/utils/juce_ResourceFileHelpers.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/utils/juce_ResourceRc.cpp b/extras/Build/juce_build_tools/utils/juce_ResourceRc.cpp index 4e1572a8..a5d6bf8d 100644 --- a/extras/Build/juce_build_tools/utils/juce_ResourceRc.cpp +++ b/extras/Build/juce_build_tools/utils/juce_ResourceRc.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/utils/juce_ResourceRc.h b/extras/Build/juce_build_tools/utils/juce_ResourceRc.h index 1dfc381e..15389425 100644 --- a/extras/Build/juce_build_tools/utils/juce_ResourceRc.h +++ b/extras/Build/juce_build_tools/utils/juce_ResourceRc.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/utils/juce_VersionNumbers.cpp b/extras/Build/juce_build_tools/utils/juce_VersionNumbers.cpp index 3f2d523f..34321543 100644 --- a/extras/Build/juce_build_tools/utils/juce_VersionNumbers.cpp +++ b/extras/Build/juce_build_tools/utils/juce_VersionNumbers.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juce_build_tools/utils/juce_VersionNumbers.h b/extras/Build/juce_build_tools/utils/juce_VersionNumbers.h index 931b67f9..c5a3c1c1 100644 --- a/extras/Build/juce_build_tools/utils/juce_VersionNumbers.h +++ b/extras/Build/juce_build_tools/utils/juce_VersionNumbers.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juceaide/CMakeLists.txt b/extras/Build/juceaide/CMakeLists.txt index 1839c668..34f1a7f5 100644 --- a/extras/Build/juceaide/CMakeLists.txt +++ b/extras/Build/juceaide/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Build/juceaide/Main.cpp b/extras/Build/juceaide/Main.cpp index 4a9e61e6..e128608c 100644 --- a/extras/Build/juceaide/Main.cpp +++ b/extras/Build/juceaide/Main.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/CMakeLists.txt b/extras/CMakeLists.txt index bb08cea0..5d0b0cd3 100644 --- a/extras/CMakeLists.txt +++ b/extras/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt index 9bde976d..e3614b48 100644 --- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt +++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt @@ -23,9 +23,9 @@ include_directories( AFTER enable_language(ASM) if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60106]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEBUG=0]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEBUG=0]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60106]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70000]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) else() message( FATAL_ERROR "No matching build-configuration found." ) endif() @@ -51,6 +51,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" @@ -65,7 +66,6 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" - "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" @@ -102,6 +102,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" + "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h" "../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" @@ -144,9 +145,9 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp" "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" - "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" @@ -440,6 +441,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.h" "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" @@ -464,6 +467,116 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" @@ -561,16 +674,27 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.h" "../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" "../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" "../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp" "../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" "../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" @@ -599,6 +723,17 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h" "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" @@ -612,6 +747,9 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" "../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" @@ -622,6 +760,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" @@ -673,9 +813,12 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/containers/juce_HashMap.h" "../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" "../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" + "../../../../../modules/juce_core/containers/juce_ListenerList.cpp" "../../../../../modules/juce_core/containers/juce_ListenerList.h" "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" "../../../../../modules/juce_core/containers/juce_NamedValueSet.h" + "../../../../../modules/juce_core/containers/juce_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" "../../../../../modules/juce_core/containers/juce_OwnedArray.h" "../../../../../modules/juce_core/containers/juce_PropertySet.cpp" @@ -689,6 +832,9 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/containers/juce_SparseSet.h" "../../../../../modules/juce_core/containers/juce_Variant.cpp" "../../../../../modules/juce_core/containers/juce_Variant.h" + "../../../../../modules/juce_core/files/juce_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.h" "../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" "../../../../../modules/juce_core/files/juce_DirectoryIterator.h" "../../../../../modules/juce_core/files/juce_File.cpp" @@ -755,6 +901,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/misc/juce_Uuid.h" "../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" "../../../../../modules/juce_core/native/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" "../../../../../modules/juce_core/native/juce_android_Files.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" "../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" @@ -982,6 +1129,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_events/native/juce_android_Messaging.cpp" "../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" "../../../../../modules/juce_events/native/juce_linux_EventLoop.h" + "../../../../../modules/juce_events/native/juce_linux_EventLoopInternal.h" "../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" "../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" "../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" @@ -1364,6 +1512,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" "../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" @@ -1395,13 +1544,13 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" "../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" "../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" - "../../../../../modules/juce_gui_basics/native/juce_common_MimeTypes.cpp" "../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" "../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" "../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" "../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" "../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" "../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" "../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" "../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" "../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" @@ -1544,7 +1693,6 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" "../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" "../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" - "../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" "../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" @@ -1619,6 +1767,8 @@ add_library( ${BINARY_NAME} "../../../JuceLibraryCode/include_juce_audio_devices.cpp" "../../../JuceLibraryCode/include_juce_audio_formats.cpp" "../../../JuceLibraryCode/include_juce_audio_processors.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_ara.cpp" + "../../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp" "../../../JuceLibraryCode/include_juce_audio_utils.cpp" "../../../JuceLibraryCode/include_juce_core.cpp" "../../../JuceLibraryCode/include_juce_cryptography.cpp" @@ -1632,1586 +1782,1736 @@ add_library( ${BINARY_NAME} "../../../JuceLibraryCode/JuceHeader.h" ) -set_source_files_properties("../../../Source/Demos.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/MasterComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/ClientComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/SharedCanvas.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../Source/juce_icon.png" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPENote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_ADSR_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_basics/juce_audio_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_ios_Audio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Bela.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_devices/juce_audio_devices.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/assert.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/callback.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/compat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/export.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/format.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_formats/juce_audio_formats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterfunctionname.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_processors/juce_audio_processors.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_audio_utils/juce_audio_utils.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_AbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Array.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ArrayBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_DynamicObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ElementComparator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ListenerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_NamedValueSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_OwnedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_PropertySet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SortedSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_SparseSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/containers/juce_Variant.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_DirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_File.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_Javascript.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/javascript/juce_JSON.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_FileLogger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/logging/juce_Logger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_BigInteger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Expression.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_MathsFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_NormalisableRange.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Random.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_Range.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_AllocationHooks.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Atomic.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ByteOrder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeapBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Memory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_MemoryBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Reservoir.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_ScopedPointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_Singleton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/memory/juce_WeakReference.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Functional.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Result.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_RuntimePermissions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_Uuid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/java/README.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Misc.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_android_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_curl_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_intel_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_linux_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_CFHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Files.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Network.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Strings.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_mac_Threads.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_posix_SharedCode.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Files.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Network.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Registry.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/native/juce_win32_Threads.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_IPAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_MACAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_NamedPipe.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_Socket.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_URL.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/network/juce_WebInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_BufferedInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_FileInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_InputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_OutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_SubregionStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/streams/juce_URLInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerSupport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_CompilerWarnings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_PlatformDefs.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_StandardHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_SystemStats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/system/juce_TargetPlatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Base64.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharacterFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_Identifier.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_LocalisedStrings.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_NewLine.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_String.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPairArray.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_StringRef.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/text/juce_TextDiff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_CriticalSection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_DynamicLibrary.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_InterProcessLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Process.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ReadWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedReadLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_SpinLock.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_Thread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_ThreadPool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_TimeSliceThread.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/threads/juce_WaitableEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_PerformanceCounter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_RelativeTime.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/time/juce_Time.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTest.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/unit_tests/juce_UnitTestCategories.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/xml/juce_XmlElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/adler32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/compress.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/crc32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/deflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/infback.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffast.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inffixed.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inflate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/inftrees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/trees.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/uncompr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zconf.in.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zlib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/zlib/zutil.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/zip/juce_ZipFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_core/juce_core.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_BlowFish.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_BlowFish.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_Primes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_Primes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_RSAKey.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/encryption/juce_RSAKey.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_MD5.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_MD5.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_SHA256.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_SHA256.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_cryptography/juce_cryptography.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_CachedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_Value.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTree.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_ApplicationBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_CallbackMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Initialisation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_Message.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MessageManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/messages/juce_NotificationType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_android_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_EventLoop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_Messaging.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_MultiTimer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/timers/juce_Timer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_events/juce_events.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colour.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_ColourGradient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_Colours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_FillType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/colour/juce_PixelFormats.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_GlowEffect.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_AttributedString.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Font.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_TextLayout.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/fonts/juce_Typeface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_BorderSize.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Line.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Parallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Path.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Point.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/png.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_Image.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageCache.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/images/juce_ScaledImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_Justification.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_graphics/juce_graphics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/application/juce_Application.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_Button.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_Component.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ComponentTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Grid.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_SidePanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/layout/juce_Viewport.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_common_MimeTypes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Label.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Slider.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_MessageBoxOptions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_basics/juce_gui_basics.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_HWNDComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_gui_extra/juce_gui_extra.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Draggable3DOrientation.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Matrix3D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Quaternion.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/geometry/juce_Vector3D.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_android.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_ios.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_linux_X11.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_osx.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGL_win32.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/native/juce_OpenGLExtensions.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gl.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gles2.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_gles2.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_khrplatform.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLRenderer.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/opengl/juce_wgl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.mm" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_opengl/juce_opengl.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCAddress.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCAddress.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCArgument.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCArgument.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCBundle.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCBundle.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCMessage.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCMessage.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCReceiver.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCSender.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCSender.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTimeTag.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTimeTag.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTypes.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/osc/juce_OSCTypes.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/juce_osc.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../../../modules/juce_osc/juce_osc.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../JuceLibraryCode/BinaryData.h" PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties("../../../JuceLibraryCode/JuceHeader.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties( + "../../../Source/Demos.h" + "../../../Source/MasterComponent.h" + "../../../Source/ClientComponent.h" + "../../../Source/SharedCanvas.h" + "../../../Source/juce_icon.png" + "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h" + "../../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h" + "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp" + "../../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPacket.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPackets.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPUtils.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.cpp" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPView.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiBuffer.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiFile.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiFile.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiKeyboardState.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiMessageSequence.h" + "../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.cpp" + "../../../../../modules/juce_audio_basics/midi/juce_MidiRPN.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEInstrument.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEMessages.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPENote.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPENote.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiser.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEUtils.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEValue.h" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp" + "../../../../../modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h" + "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h" + "../../../../../modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h" + "../../../../../modules/juce_audio_basics/sources/juce_AudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp" + "../../../../../modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h" + "../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp" + "../../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h" + "../../../../../modules/juce_audio_basics/utilities/juce_ADSR.h" + "../../../../../modules/juce_audio_basics/utilities/juce_ADSR_test.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Decibels.h" + "../../../../../modules/juce_audio_basics/utilities/juce_GenericInterpolator.h" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_IIRFilter.h" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Interpolators.h" + "../../../../../modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_Reverb.h" + "../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp" + "../../../../../modules/juce_audio_basics/utilities/juce_SmoothedValue.h" + "../../../../../modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.cpp" + "../../../../../modules/juce_audio_basics/juce_audio_basics.mm" + "../../../../../modules/juce_audio_basics/juce_audio_basics.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" + "../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp" + "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" + "../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Definitions.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Oboe.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/ResultWithValue.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/StabilizedCallback.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Utilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/include/oboe/Version.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioExtensions.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AAudioLoader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioClock.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockAdapter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockReader.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/FixedBlockWriter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/MonotonicCounter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/OboeDebug.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceFloatCaller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI16Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI24Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/SourceI32Caller.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/StabilizedCallback.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Trace.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/common/Version.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/IntegerRatio.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/KaiserWindow.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/LinearResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/MultiChannelResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowgraphUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI32.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/EngineOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.h" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.cpp" + "../../../../../modules/juce_audio_devices/native/oboe/src/opensles/OutputMixerOpenSLES.h" + "../../../../../modules/juce_audio_devices/native/oboe/CMakeLists.txt" + "../../../../../modules/juce_audio_devices/native/oboe/README.md" + "../../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h" + "../../../../../modules/juce_audio_devices/native/juce_android_Midi.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_Oboe.cpp" + "../../../../../modules/juce_audio_devices/native/juce_android_OpenSL.cpp" + "../../../../../modules/juce_audio_devices/native/juce_ios_Audio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_ios_Audio.h" + "../../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp" + "../../../../../modules/juce_audio_devices/native/juce_linux_Bela.cpp" + "../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" + "../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" + "../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" + "../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" + "../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" + "../../../../../modules/juce_audio_devices/native/juce_win32_Midi.cpp" + "../../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp" + "../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp" + "../../../../../modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h" + "../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp" + "../../../../../modules/juce_audio_devices/sources/juce_AudioTransportSource.h" + "../../../../../modules/juce_audio_devices/juce_audio_devices.cpp" + "../../../../../modules/juce_audio_devices/juce_audio_devices.mm" + "../../../../../modules/juce_audio_devices/juce_audio_devices.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/crc.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/float.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/format.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/md5.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/memory.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c" + "../../../../../modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c" + "../../../../../modules/juce_audio_formats/codecs/flac/all.h" + "../../../../../modules/juce_audio_formats/codecs/flac/alloc.h" + "../../../../../modules/juce_audio_formats/codecs/flac/assert.h" + "../../../../../modules/juce_audio_formats/codecs/flac/callback.h" + "../../../../../modules/juce_audio_formats/codecs/flac/compat.h" + "../../../../../modules/juce_audio_formats/codecs/flac/endswap.h" + "../../../../../modules/juce_audio_formats/codecs/flac/export.h" + "../../../../../modules/juce_audio_formats/codecs/flac/Flac Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/flac/format.h" + "../../../../../modules/juce_audio_formats/codecs/flac/metadata.h" + "../../../../../modules/juce_audio_formats/codecs/flac/ordinals.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_decoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/stream_encoder.h" + "../../../../../modules/juce_audio_formats/codecs/flac/win_utf8_io.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/coupled/res_books_stereo.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/floor/floor_books.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/books/uncoupled/res_books_uncoupled.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/floor_all.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/psych_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/residue_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_8.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_11.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_16.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_22.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_32.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44p51.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_44u.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/modes/setup_X.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/analysis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/backends.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/bitrate.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/block.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codebook.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/codec_internal.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/envelope.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/floor1.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/highlevel.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/info.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lookup_data.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lpc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/lsp.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mapping0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/masking.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/mdct.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/misc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/os.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/psy.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/registry.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/res0.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/scales.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/sharedbook.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/smallft.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/synthesis.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisenc.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/vorbisfile.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/lib/window.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.7/README.md" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/bitwise.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/codec.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/config_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/crctable.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/framing.c" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/ogg.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/os_types.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h" + "../../../../../modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h" + "../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_WavAudioFormat.h" + "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp" + "../../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp" + "../../../../../modules/juce_audio_formats/format/juce_ARAAudioReaders.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormat.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.h" + "../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp" + "../../../../../modules/juce_audio_formats/format/juce_AudioSubsectionReader.h" + "../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp" + "../../../../../modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h" + "../../../../../modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h" + "../../../../../modules/juce_audio_formats/sampler/juce_Sampler.cpp" + "../../../../../modules/juce_audio_formats/sampler/juce_Sampler.h" + "../../../../../modules/juce_audio_formats/juce_audio_formats.cpp" + "../../../../../modules/juce_audio_formats/juce_audio_formats.mm" + "../../../../../modules/juce_audio_formats/juce_audio_formats.h" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormat.h" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp" + "../../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h" + "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h" + "../../../../../modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/base/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterfunctionname.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/README.md" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARACommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_ARAHosting.h" + "../../../../../modules/juce_audio_processors/format_types/juce_AU_Shared.h" + "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm" + "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2Resources.h" + "../../../../../modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTCommon.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp" + "../../../../../modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioPluginInstance.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessor.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h" + "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h" + "../../../../../modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h" + "../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.cpp" + "../../../../../modules/juce_audio_processors/processors/juce_PluginDescription.h" + "../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp" + "../../../../../modules/juce_audio_processors/scanning/juce_KnownPluginList.h" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp" + "../../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp" + "../../../../../modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterBool.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioParameterInt.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h" + "../../../../../modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h" + "../../../../../modules/juce_audio_processors/utilities/juce_FlagCache.h" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_ParameterAttachments.h" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_PluginHostType.h" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" + "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" + "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" + "../../../../../modules/juce_audio_processors/juce_audio_processors_ara.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp" + "../../../../../modules/juce_audio_processors/juce_audio_processors.h" + "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h" + "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp" + "../../../../../modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioAppComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h" + "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" + "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" + "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" + "../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" + "../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" + "../../../../../modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm" + "../../../../../modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm" + "../../../../../modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm" + "../../../../../modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp" + "../../../../../modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp" + "../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp" + "../../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h" + "../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.cpp" + "../../../../../modules/juce_audio_utils/players/juce_SoundPlayer.h" + "../../../../../modules/juce_audio_utils/juce_audio_utils.cpp" + "../../../../../modules/juce_audio_utils/juce_audio_utils.mm" + "../../../../../modules/juce_audio_utils/juce_audio_utils.h" + "../../../../../modules/juce_core/containers/juce_AbstractFifo.cpp" + "../../../../../modules/juce_core/containers/juce_AbstractFifo.h" + "../../../../../modules/juce_core/containers/juce_Array.h" + "../../../../../modules/juce_core/containers/juce_ArrayAllocationBase.h" + "../../../../../modules/juce_core/containers/juce_ArrayBase.cpp" + "../../../../../modules/juce_core/containers/juce_ArrayBase.h" + "../../../../../modules/juce_core/containers/juce_DynamicObject.cpp" + "../../../../../modules/juce_core/containers/juce_DynamicObject.h" + "../../../../../modules/juce_core/containers/juce_ElementComparator.h" + "../../../../../modules/juce_core/containers/juce_HashMap.h" + "../../../../../modules/juce_core/containers/juce_HashMap_test.cpp" + "../../../../../modules/juce_core/containers/juce_LinkedListPointer.h" + "../../../../../modules/juce_core/containers/juce_ListenerList.cpp" + "../../../../../modules/juce_core/containers/juce_ListenerList.h" + "../../../../../modules/juce_core/containers/juce_NamedValueSet.cpp" + "../../../../../modules/juce_core/containers/juce_NamedValueSet.h" + "../../../../../modules/juce_core/containers/juce_Optional.h" + "../../../../../modules/juce_core/containers/juce_Optional_test.cpp" + "../../../../../modules/juce_core/containers/juce_OwnedArray.cpp" + "../../../../../modules/juce_core/containers/juce_OwnedArray.h" + "../../../../../modules/juce_core/containers/juce_PropertySet.cpp" + "../../../../../modules/juce_core/containers/juce_PropertySet.h" + "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.cpp" + "../../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h" + "../../../../../modules/juce_core/containers/juce_ScopedValueSetter.h" + "../../../../../modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h" + "../../../../../modules/juce_core/containers/juce_SortedSet.h" + "../../../../../modules/juce_core/containers/juce_SparseSet.cpp" + "../../../../../modules/juce_core/containers/juce_SparseSet.h" + "../../../../../modules/juce_core/containers/juce_Variant.cpp" + "../../../../../modules/juce_core/containers/juce_Variant.h" + "../../../../../modules/juce_core/files/juce_AndroidDocument.h" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.cpp" + "../../../../../modules/juce_core/files/juce_common_MimeTypes.h" + "../../../../../modules/juce_core/files/juce_DirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_DirectoryIterator.h" + "../../../../../modules/juce_core/files/juce_File.cpp" + "../../../../../modules/juce_core/files/juce_File.h" + "../../../../../modules/juce_core/files/juce_FileFilter.cpp" + "../../../../../modules/juce_core/files/juce_FileFilter.h" + "../../../../../modules/juce_core/files/juce_FileInputStream.cpp" + "../../../../../modules/juce_core/files/juce_FileInputStream.h" + "../../../../../modules/juce_core/files/juce_FileOutputStream.cpp" + "../../../../../modules/juce_core/files/juce_FileOutputStream.h" + "../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" + "../../../../../modules/juce_core/files/juce_FileSearchPath.h" + "../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" + "../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" + "../../../../../modules/juce_core/files/juce_TemporaryFile.h" + "../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" + "../../../../../modules/juce_core/files/juce_WildcardFileFilter.h" + "../../../../../modules/juce_core/javascript/juce_Javascript.cpp" + "../../../../../modules/juce_core/javascript/juce_Javascript.h" + "../../../../../modules/juce_core/javascript/juce_JSON.cpp" + "../../../../../modules/juce_core/javascript/juce_JSON.h" + "../../../../../modules/juce_core/logging/juce_FileLogger.cpp" + "../../../../../modules/juce_core/logging/juce_FileLogger.h" + "../../../../../modules/juce_core/logging/juce_Logger.cpp" + "../../../../../modules/juce_core/logging/juce_Logger.h" + "../../../../../modules/juce_core/maths/juce_BigInteger.cpp" + "../../../../../modules/juce_core/maths/juce_BigInteger.h" + "../../../../../modules/juce_core/maths/juce_Expression.cpp" + "../../../../../modules/juce_core/maths/juce_Expression.h" + "../../../../../modules/juce_core/maths/juce_MathsFunctions.h" + "../../../../../modules/juce_core/maths/juce_NormalisableRange.h" + "../../../../../modules/juce_core/maths/juce_Random.cpp" + "../../../../../modules/juce_core/maths/juce_Random.h" + "../../../../../modules/juce_core/maths/juce_Range.h" + "../../../../../modules/juce_core/maths/juce_StatisticsAccumulator.h" + "../../../../../modules/juce_core/memory/juce_AllocationHooks.cpp" + "../../../../../modules/juce_core/memory/juce_AllocationHooks.h" + "../../../../../modules/juce_core/memory/juce_Atomic.h" + "../../../../../modules/juce_core/memory/juce_ByteOrder.h" + "../../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h" + "../../../../../modules/juce_core/memory/juce_HeapBlock.h" + "../../../../../modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h" + "../../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h" + "../../../../../modules/juce_core/memory/juce_Memory.h" + "../../../../../modules/juce_core/memory/juce_MemoryBlock.cpp" + "../../../../../modules/juce_core/memory/juce_MemoryBlock.h" + "../../../../../modules/juce_core/memory/juce_OptionalScopedPointer.h" + "../../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h" + "../../../../../modules/juce_core/memory/juce_Reservoir.h" + "../../../../../modules/juce_core/memory/juce_ScopedPointer.h" + "../../../../../modules/juce_core/memory/juce_SharedResourcePointer.h" + "../../../../../modules/juce_core/memory/juce_Singleton.h" + "../../../../../modules/juce_core/memory/juce_WeakReference.h" + "../../../../../modules/juce_core/misc/juce_ConsoleApplication.cpp" + "../../../../../modules/juce_core/misc/juce_ConsoleApplication.h" + "../../../../../modules/juce_core/misc/juce_Functional.h" + "../../../../../modules/juce_core/misc/juce_Result.cpp" + "../../../../../modules/juce_core/misc/juce_Result.h" + "../../../../../modules/juce_core/misc/juce_RuntimePermissions.cpp" + "../../../../../modules/juce_core/misc/juce_RuntimePermissions.h" + "../../../../../modules/juce_core/misc/juce_Uuid.cpp" + "../../../../../modules/juce_core/misc/juce_Uuid.h" + "../../../../../modules/juce_core/misc/juce_WindowsRegistry.h" + "../../../../../modules/juce_core/native/java/README.txt" + "../../../../../modules/juce_core/native/juce_android_AndroidDocument.cpp" + "../../../../../modules/juce_core/native/juce_android_Files.cpp" + "../../../../../modules/juce_core/native/juce_android_JNIHelpers.cpp" + "../../../../../modules/juce_core/native/juce_android_JNIHelpers.h" + "../../../../../modules/juce_core/native/juce_android_Misc.cpp" + "../../../../../modules/juce_core/native/juce_android_Network.cpp" + "../../../../../modules/juce_core/native/juce_android_RuntimePermissions.cpp" + "../../../../../modules/juce_core/native/juce_android_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_android_Threads.cpp" + "../../../../../modules/juce_core/native/juce_BasicNativeHeaders.h" + "../../../../../modules/juce_core/native/juce_curl_Network.cpp" + "../../../../../modules/juce_core/native/juce_intel_SharedCode.h" + "../../../../../modules/juce_core/native/juce_linux_CommonFile.cpp" + "../../../../../modules/juce_core/native/juce_linux_Files.cpp" + "../../../../../modules/juce_core/native/juce_linux_Network.cpp" + "../../../../../modules/juce_core/native/juce_linux_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_linux_Threads.cpp" + "../../../../../modules/juce_core/native/juce_mac_CFHelpers.h" + "../../../../../modules/juce_core/native/juce_mac_Files.mm" + "../../../../../modules/juce_core/native/juce_mac_Network.mm" + "../../../../../modules/juce_core/native/juce_mac_ObjCHelpers.h" + "../../../../../modules/juce_core/native/juce_mac_Strings.mm" + "../../../../../modules/juce_core/native/juce_mac_SystemStats.mm" + "../../../../../modules/juce_core/native/juce_mac_Threads.mm" + "../../../../../modules/juce_core/native/juce_posix_IPAddress.h" + "../../../../../modules/juce_core/native/juce_posix_NamedPipe.cpp" + "../../../../../modules/juce_core/native/juce_posix_SharedCode.h" + "../../../../../modules/juce_core/native/juce_wasm_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h" + "../../../../../modules/juce_core/native/juce_win32_Files.cpp" + "../../../../../modules/juce_core/native/juce_win32_Network.cpp" + "../../../../../modules/juce_core/native/juce_win32_Registry.cpp" + "../../../../../modules/juce_core/native/juce_win32_SystemStats.cpp" + "../../../../../modules/juce_core/native/juce_win32_Threads.cpp" + "../../../../../modules/juce_core/network/juce_IPAddress.cpp" + "../../../../../modules/juce_core/network/juce_IPAddress.h" + "../../../../../modules/juce_core/network/juce_MACAddress.cpp" + "../../../../../modules/juce_core/network/juce_MACAddress.h" + "../../../../../modules/juce_core/network/juce_NamedPipe.cpp" + "../../../../../modules/juce_core/network/juce_NamedPipe.h" + "../../../../../modules/juce_core/network/juce_Socket.cpp" + "../../../../../modules/juce_core/network/juce_Socket.h" + "../../../../../modules/juce_core/network/juce_URL.cpp" + "../../../../../modules/juce_core/network/juce_URL.h" + "../../../../../modules/juce_core/network/juce_WebInputStream.cpp" + "../../../../../modules/juce_core/network/juce_WebInputStream.h" + "../../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp" + "../../../../../modules/juce_core/streams/juce_BufferedInputStream.h" + "../../../../../modules/juce_core/streams/juce_FileInputSource.cpp" + "../../../../../modules/juce_core/streams/juce_FileInputSource.h" + "../../../../../modules/juce_core/streams/juce_InputSource.h" + "../../../../../modules/juce_core/streams/juce_InputStream.cpp" + "../../../../../modules/juce_core/streams/juce_InputStream.h" + "../../../../../modules/juce_core/streams/juce_MemoryInputStream.cpp" + "../../../../../modules/juce_core/streams/juce_MemoryInputStream.h" + "../../../../../modules/juce_core/streams/juce_MemoryOutputStream.cpp" + "../../../../../modules/juce_core/streams/juce_MemoryOutputStream.h" + "../../../../../modules/juce_core/streams/juce_OutputStream.cpp" + "../../../../../modules/juce_core/streams/juce_OutputStream.h" + "../../../../../modules/juce_core/streams/juce_SubregionStream.cpp" + "../../../../../modules/juce_core/streams/juce_SubregionStream.h" + "../../../../../modules/juce_core/streams/juce_URLInputSource.cpp" + "../../../../../modules/juce_core/streams/juce_URLInputSource.h" + "../../../../../modules/juce_core/system/juce_CompilerSupport.h" + "../../../../../modules/juce_core/system/juce_CompilerWarnings.h" + "../../../../../modules/juce_core/system/juce_PlatformDefs.h" + "../../../../../modules/juce_core/system/juce_StandardHeader.h" + "../../../../../modules/juce_core/system/juce_SystemStats.cpp" + "../../../../../modules/juce_core/system/juce_SystemStats.h" + "../../../../../modules/juce_core/system/juce_TargetPlatform.h" + "../../../../../modules/juce_core/text/juce_Base64.cpp" + "../../../../../modules/juce_core/text/juce_Base64.h" + "../../../../../modules/juce_core/text/juce_CharacterFunctions.cpp" + "../../../../../modules/juce_core/text/juce_CharacterFunctions.h" + "../../../../../modules/juce_core/text/juce_CharPointer_ASCII.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF8.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF16.h" + "../../../../../modules/juce_core/text/juce_CharPointer_UTF32.h" + "../../../../../modules/juce_core/text/juce_Identifier.cpp" + "../../../../../modules/juce_core/text/juce_Identifier.h" + "../../../../../modules/juce_core/text/juce_LocalisedStrings.cpp" + "../../../../../modules/juce_core/text/juce_LocalisedStrings.h" + "../../../../../modules/juce_core/text/juce_NewLine.h" + "../../../../../modules/juce_core/text/juce_String.cpp" + "../../../../../modules/juce_core/text/juce_String.h" + "../../../../../modules/juce_core/text/juce_StringArray.cpp" + "../../../../../modules/juce_core/text/juce_StringArray.h" + "../../../../../modules/juce_core/text/juce_StringPairArray.cpp" + "../../../../../modules/juce_core/text/juce_StringPairArray.h" + "../../../../../modules/juce_core/text/juce_StringPool.cpp" + "../../../../../modules/juce_core/text/juce_StringPool.h" + "../../../../../modules/juce_core/text/juce_StringRef.h" + "../../../../../modules/juce_core/text/juce_TextDiff.cpp" + "../../../../../modules/juce_core/text/juce_TextDiff.h" + "../../../../../modules/juce_core/threads/juce_ChildProcess.cpp" + "../../../../../modules/juce_core/threads/juce_ChildProcess.h" + "../../../../../modules/juce_core/threads/juce_CriticalSection.h" + "../../../../../modules/juce_core/threads/juce_DynamicLibrary.h" + "../../../../../modules/juce_core/threads/juce_HighResolutionTimer.cpp" + "../../../../../modules/juce_core/threads/juce_HighResolutionTimer.h" + "../../../../../modules/juce_core/threads/juce_InterProcessLock.h" + "../../../../../modules/juce_core/threads/juce_Process.h" + "../../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp" + "../../../../../modules/juce_core/threads/juce_ReadWriteLock.h" + "../../../../../modules/juce_core/threads/juce_ScopedLock.h" + "../../../../../modules/juce_core/threads/juce_ScopedReadLock.h" + "../../../../../modules/juce_core/threads/juce_ScopedWriteLock.h" + "../../../../../modules/juce_core/threads/juce_SpinLock.h" + "../../../../../modules/juce_core/threads/juce_Thread.cpp" + "../../../../../modules/juce_core/threads/juce_Thread.h" + "../../../../../modules/juce_core/threads/juce_ThreadLocalValue.h" + "../../../../../modules/juce_core/threads/juce_ThreadPool.cpp" + "../../../../../modules/juce_core/threads/juce_ThreadPool.h" + "../../../../../modules/juce_core/threads/juce_TimeSliceThread.cpp" + "../../../../../modules/juce_core/threads/juce_TimeSliceThread.h" + "../../../../../modules/juce_core/threads/juce_WaitableEvent.cpp" + "../../../../../modules/juce_core/threads/juce_WaitableEvent.h" + "../../../../../modules/juce_core/time/juce_PerformanceCounter.cpp" + "../../../../../modules/juce_core/time/juce_PerformanceCounter.h" + "../../../../../modules/juce_core/time/juce_RelativeTime.cpp" + "../../../../../modules/juce_core/time/juce_RelativeTime.h" + "../../../../../modules/juce_core/time/juce_Time.cpp" + "../../../../../modules/juce_core/time/juce_Time.h" + "../../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp" + "../../../../../modules/juce_core/unit_tests/juce_UnitTest.h" + "../../../../../modules/juce_core/unit_tests/juce_UnitTestCategories.h" + "../../../../../modules/juce_core/xml/juce_XmlDocument.cpp" + "../../../../../modules/juce_core/xml/juce_XmlDocument.h" + "../../../../../modules/juce_core/xml/juce_XmlElement.cpp" + "../../../../../modules/juce_core/xml/juce_XmlElement.h" + "../../../../../modules/juce_core/zip/zlib/adler32.c" + "../../../../../modules/juce_core/zip/zlib/compress.c" + "../../../../../modules/juce_core/zip/zlib/crc32.c" + "../../../../../modules/juce_core/zip/zlib/crc32.h" + "../../../../../modules/juce_core/zip/zlib/deflate.c" + "../../../../../modules/juce_core/zip/zlib/deflate.h" + "../../../../../modules/juce_core/zip/zlib/infback.c" + "../../../../../modules/juce_core/zip/zlib/inffast.c" + "../../../../../modules/juce_core/zip/zlib/inffast.h" + "../../../../../modules/juce_core/zip/zlib/inffixed.h" + "../../../../../modules/juce_core/zip/zlib/inflate.c" + "../../../../../modules/juce_core/zip/zlib/inflate.h" + "../../../../../modules/juce_core/zip/zlib/inftrees.c" + "../../../../../modules/juce_core/zip/zlib/inftrees.h" + "../../../../../modules/juce_core/zip/zlib/trees.c" + "../../../../../modules/juce_core/zip/zlib/trees.h" + "../../../../../modules/juce_core/zip/zlib/uncompr.c" + "../../../../../modules/juce_core/zip/zlib/zconf.h" + "../../../../../modules/juce_core/zip/zlib/zconf.in.h" + "../../../../../modules/juce_core/zip/zlib/zlib.h" + "../../../../../modules/juce_core/zip/zlib/zutil.c" + "../../../../../modules/juce_core/zip/zlib/zutil.h" + "../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp" + "../../../../../modules/juce_core/zip/juce_GZIPCompressorOutputStream.h" + "../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp" + "../../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h" + "../../../../../modules/juce_core/zip/juce_ZipFile.cpp" + "../../../../../modules/juce_core/zip/juce_ZipFile.h" + "../../../../../modules/juce_core/juce_core.cpp" + "../../../../../modules/juce_core/juce_core.mm" + "../../../../../modules/juce_core/juce_core.h" + "../../../../../modules/juce_cryptography/encryption/juce_BlowFish.cpp" + "../../../../../modules/juce_cryptography/encryption/juce_BlowFish.h" + "../../../../../modules/juce_cryptography/encryption/juce_Primes.cpp" + "../../../../../modules/juce_cryptography/encryption/juce_Primes.h" + "../../../../../modules/juce_cryptography/encryption/juce_RSAKey.cpp" + "../../../../../modules/juce_cryptography/encryption/juce_RSAKey.h" + "../../../../../modules/juce_cryptography/hashing/juce_MD5.cpp" + "../../../../../modules/juce_cryptography/hashing/juce_MD5.h" + "../../../../../modules/juce_cryptography/hashing/juce_SHA256.cpp" + "../../../../../modules/juce_cryptography/hashing/juce_SHA256.h" + "../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.cpp" + "../../../../../modules/juce_cryptography/hashing/juce_Whirlpool.h" + "../../../../../modules/juce_cryptography/juce_cryptography.cpp" + "../../../../../modules/juce_cryptography/juce_cryptography.mm" + "../../../../../modules/juce_cryptography/juce_cryptography.h" + "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp" + "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" + "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" + "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" + "../../../../../modules/juce_data_structures/values/juce_CachedValue.cpp" + "../../../../../modules/juce_data_structures/values/juce_CachedValue.h" + "../../../../../modules/juce_data_structures/values/juce_Value.cpp" + "../../../../../modules/juce_data_structures/values/juce_Value.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTree.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTree.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h" + "../../../../../modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp" + "../../../../../modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h" + "../../../../../modules/juce_data_structures/juce_data_structures.cpp" + "../../../../../modules/juce_data_structures/juce_data_structures.mm" + "../../../../../modules/juce_data_structures/juce_data_structures.h" + "../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" + "../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" + "../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" + "../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp" + "../../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.h" + "../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp" + "../../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h" + "../../../../../modules/juce_events/broadcasters/juce_ChangeListener.h" + "../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp" + "../../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.h" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp" + "../../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.h" + "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp" + "../../../../../modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h" + "../../../../../modules/juce_events/messages/juce_ApplicationBase.cpp" + "../../../../../modules/juce_events/messages/juce_ApplicationBase.h" + "../../../../../modules/juce_events/messages/juce_CallbackMessage.h" + "../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.cpp" + "../../../../../modules/juce_events/messages/juce_DeletedAtShutdown.h" + "../../../../../modules/juce_events/messages/juce_Initialisation.h" + "../../../../../modules/juce_events/messages/juce_Message.h" + "../../../../../modules/juce_events/messages/juce_MessageListener.cpp" + "../../../../../modules/juce_events/messages/juce_MessageListener.h" + "../../../../../modules/juce_events/messages/juce_MessageManager.cpp" + "../../../../../modules/juce_events/messages/juce_MessageManager.h" + "../../../../../modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h" + "../../../../../modules/juce_events/messages/juce_NotificationType.h" + "../../../../../modules/juce_events/native/juce_android_Messaging.cpp" + "../../../../../modules/juce_events/native/juce_ios_MessageManager.mm" + "../../../../../modules/juce_events/native/juce_linux_EventLoop.h" + "../../../../../modules/juce_events/native/juce_linux_EventLoopInternal.h" + "../../../../../modules/juce_events/native/juce_linux_Messaging.cpp" + "../../../../../modules/juce_events/native/juce_mac_MessageManager.mm" + "../../../../../modules/juce_events/native/juce_osx_MessageQueue.h" + "../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp" + "../../../../../modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h" + "../../../../../modules/juce_events/native/juce_win32_HiddenMessageWindow.h" + "../../../../../modules/juce_events/native/juce_win32_Messaging.cpp" + "../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.cpp" + "../../../../../modules/juce_events/native/juce_win32_WinRTWrapper.h" + "../../../../../modules/juce_events/timers/juce_MultiTimer.cpp" + "../../../../../modules/juce_events/timers/juce_MultiTimer.h" + "../../../../../modules/juce_events/timers/juce_Timer.cpp" + "../../../../../modules/juce_events/timers/juce_Timer.h" + "../../../../../modules/juce_events/juce_events.cpp" + "../../../../../modules/juce_events/juce_events.mm" + "../../../../../modules/juce_events/juce_events.h" + "../../../../../modules/juce_graphics/colour/juce_Colour.cpp" + "../../../../../modules/juce_graphics/colour/juce_Colour.h" + "../../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp" + "../../../../../modules/juce_graphics/colour/juce_ColourGradient.h" + "../../../../../modules/juce_graphics/colour/juce_Colours.cpp" + "../../../../../modules/juce_graphics/colour/juce_Colours.h" + "../../../../../modules/juce_graphics/colour/juce_FillType.cpp" + "../../../../../modules/juce_graphics/colour/juce_FillType.h" + "../../../../../modules/juce_graphics/colour/juce_PixelFormats.h" + "../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.cpp" + "../../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" + "../../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h" + "../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp" + "../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h" + "../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp" + "../../../../../modules/juce_graphics/effects/juce_GlowEffect.h" + "../../../../../modules/juce_graphics/effects/juce_ImageEffectFilter.h" + "../../../../../modules/juce_graphics/fonts/juce_AttributedString.cpp" + "../../../../../modules/juce_graphics/fonts/juce_AttributedString.h" + "../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp" + "../../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h" + "../../../../../modules/juce_graphics/fonts/juce_Font.cpp" + "../../../../../modules/juce_graphics/fonts/juce_Font.h" + "../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp" + "../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h" + "../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp" + "../../../../../modules/juce_graphics/fonts/juce_TextLayout.h" + "../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp" + "../../../../../modules/juce_graphics/fonts/juce_Typeface.h" + "../../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp" + "../../../../../modules/juce_graphics/geometry/juce_AffineTransform.h" + "../../../../../modules/juce_graphics/geometry/juce_BorderSize.h" + "../../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp" + "../../../../../modules/juce_graphics/geometry/juce_EdgeTable.h" + "../../../../../modules/juce_graphics/geometry/juce_Line.h" + "../../../../../modules/juce_graphics/geometry/juce_Parallelogram.h" + "../../../../../modules/juce_graphics/geometry/juce_Path.cpp" + "../../../../../modules/juce_graphics/geometry/juce_Path.h" + "../../../../../modules/juce_graphics/geometry/juce_PathIterator.cpp" + "../../../../../modules/juce_graphics/geometry/juce_PathIterator.h" + "../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp" + "../../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h" + "../../../../../modules/juce_graphics/geometry/juce_Point.h" + "../../../../../modules/juce_graphics/geometry/juce_Rectangle.h" + "../../../../../modules/juce_graphics/geometry/juce_Rectangle_test.cpp" + "../../../../../modules/juce_graphics/geometry/juce_RectangleList.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/cderror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jccolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcdctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jchuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcinit.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcomapi.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jconfig.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcparam.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcprepct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jcsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jctrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapimin.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdapistd.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdatasrc.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcoefct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdcolor.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdct.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jddctmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdhuff.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdinput.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmainct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmarker.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmaster.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdmerge.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdphuff.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdpostct.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdsample.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jdtrans.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jerror.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jfdctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctflt.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctfst.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctint.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jidctred.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jinclude.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemmgr.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemnobs.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmemsys.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jmorecfg.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpegint.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jpeglib.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant1.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jquant2.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jutils.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/jversion.h" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.c" + "../../../../../modules/juce_graphics/image_formats/jpglib/transupp.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/libpng_readme.txt" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/png.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngconf.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngdebug.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngerror.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngget.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pnginfo.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngmem.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngpriv.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngread.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngrutil.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngset.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngstruct.h" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngtrans.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwio.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwrite.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwtran.c" + "../../../../../modules/juce_graphics/image_formats/pnglib/pngwutil.c" + "../../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp" + "../../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp" + "../../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp" + "../../../../../modules/juce_graphics/images/juce_Image.cpp" + "../../../../../modules/juce_graphics/images/juce_Image.h" + "../../../../../modules/juce_graphics/images/juce_ImageCache.cpp" + "../../../../../modules/juce_graphics/images/juce_ImageCache.h" + "../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp" + "../../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.h" + "../../../../../modules/juce_graphics/images/juce_ImageFileFormat.cpp" + "../../../../../modules/juce_graphics/images/juce_ImageFileFormat.h" + "../../../../../modules/juce_graphics/images/juce_ScaledImage.h" + "../../../../../modules/juce_graphics/native/juce_android_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_android_GraphicsContext.cpp" + "../../../../../modules/juce_graphics/native/juce_android_IconHelpers.cpp" + "../../../../../modules/juce_graphics/native/juce_freetype_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_linux_IconHelpers.cpp" + "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h" + "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm" + "../../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h" + "../../../../../modules/juce_graphics/native/juce_mac_Fonts.mm" + "../../../../../modules/juce_graphics/native/juce_mac_IconHelpers.cpp" + "../../../../../modules/juce_graphics/native/juce_RenderingHelpers.h" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_Fonts.cpp" + "../../../../../modules/juce_graphics/native/juce_win32_IconHelpers.cpp" + "../../../../../modules/juce_graphics/placement/juce_Justification.h" + "../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp" + "../../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h" + "../../../../../modules/juce_graphics/juce_graphics.cpp" + "../../../../../modules/juce_graphics/juce_graphics.mm" + "../../../../../modules/juce_graphics/juce_graphics.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h" + "../../../../../modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h" + "../../../../../modules/juce_gui_basics/accessibility/juce_AccessibilityState.h" + "../../../../../modules/juce_gui_basics/application/juce_Application.cpp" + "../../../../../modules/juce_gui_basics/application/juce_Application.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ArrowButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_Button.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_Button.h" + "../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_DrawableButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_TextButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_TextButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h" + "../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp" + "../../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h" + "../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp" + "../../../../../modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h" + "../../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h" + "../../../../../modules/juce_gui_basics/components/juce_Component.cpp" + "../../../../../modules/juce_gui_basics/components/juce_Component.h" + "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.cpp" + "../../../../../modules/juce_gui_basics/components/juce_ComponentListener.h" + "../../../../../modules/juce_gui_basics/components/juce_ComponentTraverser.h" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/components/juce_FocusTraverser.h" + "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.cpp" + "../../../../../modules/juce_gui_basics/components/juce_ModalComponentManager.h" + "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.cpp" + "../../../../../modules/juce_gui_basics/desktop/juce_Desktop.h" + "../../../../../modules/juce_gui_basics/desktop/juce_Displays.cpp" + "../../../../../modules/juce_gui_basics/desktop/juce_Displays.h" + "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_Drawable.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableRectangle.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp" + "../../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h" + "../../../../../modules/juce_gui_basics/drawables/juce_SVGParser.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ContentSharer.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooser.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp" + "../../../../../modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp" + "../../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_SystemClipboard.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h" + "../../../../../modules/juce_gui_basics/keyboard/juce_TextInputTarget.h" + "../../../../../modules/juce_gui_basics/layout/juce_AnimatedPosition.h" + "../../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.h" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h" + "../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h" + "../../../../../modules/juce_gui_basics/layout/juce_FlexBox.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_FlexBox.h" + "../../../../../modules/juce_gui_basics/layout/juce_FlexItem.h" + "../../../../../modules/juce_gui_basics/layout/juce_Grid.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_Grid.h" + "../../../../../modules/juce_gui_basics/layout/juce_GridItem.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_GridItem.h" + "../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_ScrollBar.h" + "../../../../../modules/juce_gui_basics/layout/juce_SidePanel.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_SidePanel.h" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedButtonBar.h" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h" + "../../../../../modules/juce_gui_basics/layout/juce_Viewport.cpp" + "../../../../../modules/juce_gui_basics/layout/juce_Viewport.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp" + "../../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h" + "../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h" + "../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp" + "../../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h" + "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" + "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" + "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" + "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" + "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" + "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.h" + "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h" + "../../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h" + "../../../../../modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h" + "../../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.h" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.cpp" + "../../../../../modules/juce_gui_basics/mouse/juce_MouseListener.h" + "../../../../../modules/juce_gui_basics/mouse/juce_PointerState.h" + "../../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h" + "../../../../../modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h" + "../../../../../modules/juce_gui_basics/mouse/juce_TooltipClient.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" + "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h" + "../../../../../modules/juce_gui_basics/native/juce_android_ContentSharer.cpp" + "../../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp" + "../../../../../modules/juce_gui_basics/native/juce_ios_FileChooser.mm" + "../../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm" + "../../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm" + "../../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp" + "../../../../../modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h" + "../../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_MainMenu.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_MouseCursor.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm" + "../../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm" + "../../../../../modules/juce_gui_basics/native/juce_MultiTouchMapper.h" + "../../../../../modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h" + "../../../../../modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp" + "../../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp" + "../../../../../modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h" + "../../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_MarkerList.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePoint.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.h" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp" + "../../../../../modules/juce_gui_basics/positioning/juce_RelativeRectangle.h" + "../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_PropertyPanel.h" + "../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h" + "../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp" + "../../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_Label.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_Label.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ListBox.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h" + "../../../../../modules/juce_gui_basics/widgets/juce_Slider.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_Slider.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TableListBox.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h" + "../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h" + "../../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp" + "../../../../../modules/juce_gui_basics/widgets/juce_TreeView.h" + "../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_AlertWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_CallOutBox.h" + "../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h" + "../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_DialogWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_MessageBoxOptions.h" + "../../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h" + "../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_TooltipWindow.h" + "../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp" + "../../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h" + "../../../../../modules/juce_gui_basics/juce_gui_basics.cpp" + "../../../../../modules/juce_gui_basics/juce_gui_basics.mm" + "../../../../../modules/juce_gui_basics/juce_gui_basics.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h" + "../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp" + "../../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h" + "../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp" + "../../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h" + "../../../../../modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_HWNDComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_NSViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_UIViewComponent.h" + "../../../../../modules/juce_gui_extra/embedding/juce_XEmbedComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h" + "../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h" + "../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h" + "../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_PreferencesPanel.h" + "../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_PushNotifications.h" + "../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h" + "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" + "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" + "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" + "../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" + "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" + "../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" + "../../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm" + "../../../../../modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp" + "../../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.cpp" + "../../../../../modules/juce_gui_extra/juce_gui_extra.mm" + "../../../../../modules/juce_gui_extra/juce_gui_extra.h" + "../../../../../modules/juce_opengl/geometry/juce_Draggable3DOrientation.h" + "../../../../../modules/juce_opengl/geometry/juce_Matrix3D.h" + "../../../../../modules/juce_opengl/geometry/juce_Quaternion.h" + "../../../../../modules/juce_opengl/geometry/juce_Vector3D.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_android.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_ios.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_linux_X11.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_osx.h" + "../../../../../modules/juce_opengl/native/juce_OpenGL_win32.h" + "../../../../../modules/juce_opengl/native/juce_OpenGLExtensions.h" + "../../../../../modules/juce_opengl/opengl/juce_gl.cpp" + "../../../../../modules/juce_opengl/opengl/juce_gl.h" + "../../../../../modules/juce_opengl/opengl/juce_gles2.cpp" + "../../../../../modules/juce_opengl/opengl/juce_gles2.h" + "../../../../../modules/juce_opengl/opengl/juce_khrplatform.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLContext.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLHelpers.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLImage.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLRenderer.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.cpp" + "../../../../../modules/juce_opengl/opengl/juce_OpenGLTexture.h" + "../../../../../modules/juce_opengl/opengl/juce_wgl.h" + "../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp" + "../../../../../modules/juce_opengl/utils/juce_OpenGLAppComponent.h" + "../../../../../modules/juce_opengl/juce_opengl.cpp" + "../../../../../modules/juce_opengl/juce_opengl.mm" + "../../../../../modules/juce_opengl/juce_opengl.h" + "../../../../../modules/juce_osc/osc/juce_OSCAddress.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCAddress.h" + "../../../../../modules/juce_osc/osc/juce_OSCArgument.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCArgument.h" + "../../../../../modules/juce_osc/osc/juce_OSCBundle.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCBundle.h" + "../../../../../modules/juce_osc/osc/juce_OSCMessage.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCMessage.h" + "../../../../../modules/juce_osc/osc/juce_OSCReceiver.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCReceiver.h" + "../../../../../modules/juce_osc/osc/juce_OSCSender.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCSender.h" + "../../../../../modules/juce_osc/osc/juce_OSCTimeTag.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCTimeTag.h" + "../../../../../modules/juce_osc/osc/juce_OSCTypes.cpp" + "../../../../../modules/juce_osc/osc/juce_OSCTypes.h" + "../../../../../modules/juce_osc/juce_osc.cpp" + "../../../../../modules/juce_osc/juce_osc.h" + "../../../JuceLibraryCode/BinaryData.h" + "../../../JuceLibraryCode/JuceHeader.h" + PROPERTIES HEADER_FILE_ONLY TRUE) target_compile_options( ${BINARY_NAME} PRIVATE "-fsigned-char" ) diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml b/extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml index 03a1cd09..daf044c3 100644 --- a/extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml +++ b/extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml @@ -4,7 +4,7 @@ package="com.juce.networkgraphicsdemo"> - + diff --git a/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile b/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile index 96872426..734020c5 100644 --- a/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile +++ b/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile @@ -11,6 +11,10 @@ endif # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ ifeq ($(CONFIG),Debug) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,13 +60,13 @@ ifeq ($(CONFIG),Release) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -74,6 +78,8 @@ OBJECTS_APP := \ $(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o \ $(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o \ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o \ $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o \ $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \ $(JUCE_OBJDIR)/include_juce_cryptography_8cb807a8.o \ @@ -90,8 +96,8 @@ OBJECTS_APP := \ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors alsa freetype2 libcurl + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors alsa freetype2 libcurl @echo Linking "NetworkGraphicsDemo - App" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) @@ -128,6 +134,16 @@ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o: ../../JuceLibraryCode/i @echo "Compiling include_juce_audio_processors.cpp" $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" +$(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o: ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_ara.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o: ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_lv2_libs.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o: ../../JuceLibraryCode/include_juce_audio_utils.cpp -$(V_AT)mkdir -p $(JUCE_OBJDIR) @echo "Compiling include_juce_audio_utils.cpp" diff --git a/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj b/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj index d9d37e82..2b8d6ef5 100644 --- a/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj +++ b/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 006DF460F8DF66EFFA80D968 /* Icon.icns */ = {isa = PBXBuildFile; fileRef = 70F1CAF3C4C561DD81E6AFC1; }; 0977FEC02DAF29438583198A /* include_juce_core.mm */ = {isa = PBXBuildFile; fileRef = 01E0EEF68A11C1CAF180E173; }; + 0E39AB2B15DCE39E1055A646 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = AB2DE62887E2F58D821F3217; }; 0FA2A3321630EBE83E439D99 /* include_juce_cryptography.mm */ = {isa = PBXBuildFile; fileRef = AFF729977947528F3E4AAA96; }; 2E28F61A64DEF942FE7B94C4 /* include_juce_audio_processors.mm */ = {isa = PBXBuildFile; fileRef = AED58461CE961C62A0E0A552; }; 3717B9F9A0F7C9CB95F1BE7F /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = 7BE6330821794919A88ED8ED; }; @@ -22,13 +23,13 @@ 80B9F7ED2009922C693B7DD4 /* DiscRecording.framework */ = {isa = PBXBuildFile; fileRef = CB82A14817C3E2ABBBBC3864; }; 80EE2C27B466BAFD83881D3F /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 2E13A899F4E3C99054A3656F; }; 8ECB0767EE340DD83869E37D /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = EC794872987FEA2E129C589A; }; + 95C7D26CC68839FC6BF90AC3 /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = 52EF9BE720EFF47106DB0351; }; 987CBD5330E76B404F0D966C /* Main.cpp */ = {isa = PBXBuildFile; fileRef = 77C0AC21C1028911123844FC; }; 9EFD2AA2FFF3C125FDAA4279 /* include_juce_data_structures.mm */ = {isa = PBXBuildFile; fileRef = 7525879E73E8AF32FFA0CDDE; }; 9F618C008A503063D10076C4 /* BinaryData.cpp */ = {isa = PBXBuildFile; fileRef = 74711D7544168CCAC4969A07; }; A1F34D09F4E4338775917ED1 /* include_juce_audio_formats.mm */ = {isa = PBXBuildFile; fileRef = C6E2284D86D93F1D9D5C7666; }; B323E5E5FBD5663B21A8E623 /* OpenGL.framework */ = {isa = PBXBuildFile; fileRef = 996E743A20FC78671766BF59; }; BB9A9692D99DD0DDB1047B60 /* include_juce_audio_basics.mm */ = {isa = PBXBuildFile; fileRef = 6D1F9E505D20C09647124F0A; }; - BED88ADEA4DC91AA8C810FA8 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = 398A945EFD9ED923162982B1; }; C4D6C466C41173D6970553D2 /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = 9E8129263CD42C6029FC2CAD; }; C5E7BAD864E02CF37F7BD707 /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 33AA348465F512DBA8778DAF; }; C6348C6B1D0312580E97EA19 /* include_juce_osc.cpp */ = {isa = PBXBuildFile; fileRef = 3BF06B70407FFDBE9534F942; }; @@ -49,11 +50,11 @@ 25DEDA8C9F94A6C8DFC8E53E /* SharedCanvas.h */ /* SharedCanvas.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SharedCanvas.h; path = ../../Source/SharedCanvas.h; sourceTree = SOURCE_ROOT; }; 2E13A899F4E3C99054A3656F /* Accelerate.framework */ /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; 33AA348465F512DBA8778DAF /* include_juce_events.mm */ /* include_juce_events.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_events.mm; path = ../../JuceLibraryCode/include_juce_events.mm; sourceTree = SOURCE_ROOT; }; - 398A945EFD9ED923162982B1 /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; 3BF06B70407FFDBE9534F942 /* include_juce_osc.cpp */ /* include_juce_osc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_osc.cpp; path = ../../JuceLibraryCode/include_juce_osc.cpp; sourceTree = SOURCE_ROOT; }; 448838BE6E937D450A3C84CE /* CoreMIDI.framework */ /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; 4D1DB6D77B6F3DE7A569780B /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; 4FF648D72D6F1A78956CDA1B /* Demos.h */ /* Demos.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Demos.h; path = ../../Source/Demos.h; sourceTree = SOURCE_ROOT; }; + 52EF9BE720EFF47106DB0351 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; 55CB060922ABCBC105FE38D2 /* juce_osc */ /* juce_osc */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_osc; path = ../../../../modules/juce_osc; sourceTree = SOURCE_ROOT; }; 660F1970CF687A7AE8371C6D /* include_juce_opengl.mm */ /* include_juce_opengl.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_opengl.mm; path = ../../JuceLibraryCode/include_juce_opengl.mm; sourceTree = SOURCE_ROOT; }; 6799B056504F9F017998B9E2 /* CoreAudio.framework */ /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; @@ -77,6 +78,7 @@ 9E8129263CD42C6029FC2CAD /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; A505E1DABB2ED630EFBA96DB /* juce_audio_processors */ /* juce_audio_processors */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_processors; path = ../../../../modules/juce_audio_processors; sourceTree = SOURCE_ROOT; }; A7FF2B353C8568B5A7A80117 /* include_juce_graphics.mm */ /* include_juce_graphics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_graphics.mm; path = ../../JuceLibraryCode/include_juce_graphics.mm; sourceTree = SOURCE_ROOT; }; + AB2DE62887E2F58D821F3217 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; AED58461CE961C62A0E0A552 /* include_juce_audio_processors.mm */ /* include_juce_audio_processors.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_processors.mm; path = ../../JuceLibraryCode/include_juce_audio_processors.mm; sourceTree = SOURCE_ROOT; }; AF330F41D1A4865108690E3C /* include_juce_audio_devices.mm */ /* include_juce_audio_devices.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_devices.mm; path = ../../JuceLibraryCode/include_juce_audio_devices.mm; sourceTree = SOURCE_ROOT; }; AFF729977947528F3E4AAA96 /* include_juce_cryptography.mm */ /* include_juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_cryptography.mm; path = ../../JuceLibraryCode/include_juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; @@ -105,7 +107,6 @@ files = ( 80EE2C27B466BAFD83881D3F, C4D6C466C41173D6970553D2, - BED88ADEA4DC91AA8C810FA8, 3C30D7C28C86F4054257DCD5, 67DF295E93E54432043126DF, 770AB74B1D3A0108F764DD47, @@ -149,7 +150,6 @@ children = ( 2E13A899F4E3C99054A3656F, 9E8129263CD42C6029FC2CAD, - 398A945EFD9ED923162982B1, C78806A6727F44EACFDED4A5, 6799B056504F9F017998B9E2, 4D1DB6D77B6F3DE7A569780B, @@ -190,6 +190,8 @@ AF330F41D1A4865108690E3C, C6E2284D86D93F1D9D5C7666, AED58461CE961C62A0E0A552, + 52EF9BE720EFF47106DB0351, + AB2DE62887E2F58D821F3217, FCEBB157FB526741DB6791D1, 01E0EEF68A11C1CAF180E173, AFF729977947528F3E4AAA96, @@ -265,7 +267,7 @@ A5398ADB6F5B128C00EB935C = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { @@ -331,6 +333,8 @@ 6C2200C52B65E1BE80544E50, A1F34D09F4E4338775917ED1, 2E28F61A64DEF942FE7B94C4, + 95C7D26CC68839FC6BF90AC3, + 0E39AB2B15DCE39E1055A646, EA487FA4116517A8DFEE85B0, 0977FEC02DAF29438583198A, 0FA2A3321630EBE83E439D99, @@ -365,7 +369,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -389,10 +393,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -406,6 +410,7 @@ LLVM_LTO = YES; MACOSX_DEPLOYMENT_TARGET = 10.9; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo; PRODUCT_NAME = "JUCE Network Graphics Demo"; USE_HEADERMAP = NO; @@ -529,7 +534,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -553,10 +558,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -569,6 +574,7 @@ INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.9; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo; PRODUCT_NAME = "JUCE Network Graphics Demo"; USE_HEADERMAP = NO; diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj index 168fd925..9f4aeb5a 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -77,7 +77,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\JUCE Network Graphics Demo.exe @@ -105,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -118,7 +119,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\JUCE Network Graphics Demo.exe @@ -152,13 +154,13 @@ true - + true - + true - + true @@ -269,7 +271,7 @@ true - + true @@ -638,6 +640,9 @@ true + + true + true @@ -671,6 +676,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -740,15 +862,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -782,6 +922,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -800,6 +958,9 @@ true + + true + true @@ -812,6 +973,12 @@ true + + true + + + true + true @@ -878,9 +1045,15 @@ true + + true + true + + true + true @@ -896,6 +1069,9 @@ true + + true + true @@ -962,6 +1138,9 @@ true + + true + true @@ -1850,6 +2029,9 @@ true + + true + true @@ -1877,9 +2059,6 @@ true - - true - true @@ -2169,7 +2348,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2226,6 +2409,7 @@ + @@ -2414,6 +2598,7 @@ + @@ -2426,6 +2611,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2491,9 +2746,14 @@ + + + + + @@ -2514,6 +2774,11 @@ + + + + + @@ -2521,6 +2786,8 @@ + + @@ -2552,6 +2819,7 @@ + @@ -2560,6 +2828,8 @@ + + @@ -2721,6 +2991,7 @@ + @@ -2919,6 +3190,7 @@ + @@ -2989,7 +3261,6 @@ - @@ -3036,6 +3307,7 @@ + diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters index 4f1b6e47..4e18658e 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters @@ -140,6 +140,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -194,6 +320,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -484,13 +613,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -604,8 +733,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -979,6 +1108,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1015,6 +1147,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1084,6 +1333,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1093,9 +1348,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1129,6 +1396,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1147,6 +1432,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1162,6 +1450,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1243,9 +1537,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1261,6 +1561,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1327,6 +1630,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2257,6 +2563,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2293,9 +2602,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2641,6 +2947,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -2799,6 +3111,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3363,6 +3678,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3399,6 +3717,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3594,6 +4122,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3603,6 +4137,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3663,6 +4206,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3684,6 +4242,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -3777,6 +4341,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -3801,6 +4368,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4284,6 +4857,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -4878,6 +5454,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5088,9 +5667,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -5225,6 +5801,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff --git a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj index 4edd3481..b921a133 100644 --- a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj +++ b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 006DF460F8DF66EFFA80D968 /* Icon.icns */ = {isa = PBXBuildFile; fileRef = 70F1CAF3C4C561DD81E6AFC1; }; 0977FEC02DAF29438583198A /* include_juce_core.mm */ = {isa = PBXBuildFile; fileRef = 01E0EEF68A11C1CAF180E173; }; + 0E39AB2B15DCE39E1055A646 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = AB2DE62887E2F58D821F3217; }; 0FA2A3321630EBE83E439D99 /* include_juce_cryptography.mm */ = {isa = PBXBuildFile; fileRef = AFF729977947528F3E4AAA96; }; 1282A62308CD1AC3F88A5D03 /* Images.xcassets */ = {isa = PBXBuildFile; fileRef = 5273768FBB55D0DD57A5E70C; }; 1F7A8BD2B43B3D191132301D /* CoreImage.framework */ = {isa = PBXBuildFile; fileRef = E51ABCA80B75F33848F28184; }; @@ -23,6 +24,7 @@ 770AB74B1D3A0108F764DD47 /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = 4D1DB6D77B6F3DE7A569780B; }; 80EE2C27B466BAFD83881D3F /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 2E13A899F4E3C99054A3656F; }; 8ECB0767EE340DD83869E37D /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = EC794872987FEA2E129C589A; }; + 95C7D26CC68839FC6BF90AC3 /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = 52EF9BE720EFF47106DB0351; }; 987CBD5330E76B404F0D966C /* Main.cpp */ = {isa = PBXBuildFile; fileRef = 77C0AC21C1028911123844FC; }; 9EFD2AA2FFF3C125FDAA4279 /* include_juce_data_structures.mm */ = {isa = PBXBuildFile; fileRef = 7525879E73E8AF32FFA0CDDE; }; 9F618C008A503063D10076C4 /* BinaryData.cpp */ = {isa = PBXBuildFile; fileRef = 74711D7544168CCAC4969A07; }; @@ -59,6 +61,7 @@ 4D1DB6D77B6F3DE7A569780B /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; 4FF648D72D6F1A78956CDA1B /* Demos.h */ /* Demos.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Demos.h; path = ../../Source/Demos.h; sourceTree = SOURCE_ROOT; }; 5273768FBB55D0DD57A5E70C /* Images.xcassets */ /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = NetworkGraphicsDemo/Images.xcassets; sourceTree = SOURCE_ROOT; }; + 52EF9BE720EFF47106DB0351 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; 55CB060922ABCBC105FE38D2 /* juce_osc */ /* juce_osc */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_osc; path = ../../../../modules/juce_osc; sourceTree = SOURCE_ROOT; }; 660F1970CF687A7AE8371C6D /* include_juce_opengl.mm */ /* include_juce_opengl.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_opengl.mm; path = ../../JuceLibraryCode/include_juce_opengl.mm; sourceTree = SOURCE_ROOT; }; 6799B056504F9F017998B9E2 /* CoreAudio.framework */ /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; @@ -82,6 +85,7 @@ 9E8129263CD42C6029FC2CAD /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; A505E1DABB2ED630EFBA96DB /* juce_audio_processors */ /* juce_audio_processors */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_processors; path = ../../../../modules/juce_audio_processors; sourceTree = SOURCE_ROOT; }; A7FF2B353C8568B5A7A80117 /* include_juce_graphics.mm */ /* include_juce_graphics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_graphics.mm; path = ../../JuceLibraryCode/include_juce_graphics.mm; sourceTree = SOURCE_ROOT; }; + AB2DE62887E2F58D821F3217 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; AED58461CE961C62A0E0A552 /* include_juce_audio_processors.mm */ /* include_juce_audio_processors.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_processors.mm; path = ../../JuceLibraryCode/include_juce_audio_processors.mm; sourceTree = SOURCE_ROOT; }; AF330F41D1A4865108690E3C /* include_juce_audio_devices.mm */ /* include_juce_audio_devices.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_devices.mm; path = ../../JuceLibraryCode/include_juce_audio_devices.mm; sourceTree = SOURCE_ROOT; }; AFF729977947528F3E4AAA96 /* include_juce_cryptography.mm */ /* include_juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_cryptography.mm; path = ../../JuceLibraryCode/include_juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; @@ -201,6 +205,8 @@ AF330F41D1A4865108690E3C, C6E2284D86D93F1D9D5C7666, AED58461CE961C62A0E0A552, + 52EF9BE720EFF47106DB0351, + AB2DE62887E2F58D821F3217, FCEBB157FB526741DB6791D1, 01E0EEF68A11C1CAF180E173, AFF729977947528F3E4AAA96, @@ -276,7 +282,7 @@ A5398ADB6F5B128C00EB935C = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { @@ -343,6 +349,8 @@ 6C2200C52B65E1BE80544E50, A1F34D09F4E4338775917ED1, 2E28F61A64DEF942FE7B94C4, + 95C7D26CC68839FC6BF90AC3, + 0E39AB2B15DCE39E1055A646, EA487FA4116517A8DFEE85B0, 0977FEC02DAF29438583198A, 0FA2A3321630EBE83E439D99, @@ -378,7 +386,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -402,10 +410,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -418,6 +426,7 @@ INSTALL_PATH = "$(HOME)/Applications"; LLVM_LTO = YES; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo; PRODUCT_NAME = "JUCE Network Graphics Demo"; USE_HEADERMAP = NO; @@ -545,7 +554,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -569,10 +578,10 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -584,6 +593,7 @@ INFOPLIST_PREPROCESS = NO; INSTALL_PATH = "$(HOME)/Applications"; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo; PRODUCT_NAME = "JUCE Network Graphics Demo"; USE_HEADERMAP = NO; diff --git a/extras/NetworkGraphicsDemo/CMakeLists.txt b/extras/NetworkGraphicsDemo/CMakeLists.txt index d968b304..730859b1 100644 --- a/extras/NetworkGraphicsDemo/CMakeLists.txt +++ b/extras/NetworkGraphicsDemo/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/NetworkGraphicsDemo/JuceLibraryCode/BinaryData.cpp b/extras/NetworkGraphicsDemo/JuceLibraryCode/BinaryData.cpp index 2a11284a..fd3aa7c9 100644 --- a/extras/NetworkGraphicsDemo/JuceLibraryCode/BinaryData.cpp +++ b/extras/NetworkGraphicsDemo/JuceLibraryCode/BinaryData.cpp @@ -4,6 +4,8 @@ */ +#include + namespace BinaryData { @@ -690,10 +692,8 @@ const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8); const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8) { for (unsigned int i = 0; i < (sizeof (namedResourceList) / sizeof (namedResourceList[0])); ++i) - { - if (namedResourceList[i] == resourceNameUTF8) + if (strcmp (namedResourceList[i], resourceNameUTF8) == 0) return originalFilenames[i]; - } return nullptr; } diff --git a/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_ara.cpp b/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_ara.cpp new file mode 100644 index 00000000..e0c34d43 --- /dev/null +++ b/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_ara.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp b/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp new file mode 100644 index 00000000..64b4d5f4 --- /dev/null +++ b/extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/extras/NetworkGraphicsDemo/Source/ClientComponent.h b/extras/NetworkGraphicsDemo/Source/ClientComponent.h index 9d09ab08..657514f6 100644 --- a/extras/NetworkGraphicsDemo/Source/ClientComponent.h +++ b/extras/NetworkGraphicsDemo/Source/ClientComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/NetworkGraphicsDemo/Source/Demos.h b/extras/NetworkGraphicsDemo/Source/Demos.h index 1c759b5e..3f683266 100644 --- a/extras/NetworkGraphicsDemo/Source/Demos.h +++ b/extras/NetworkGraphicsDemo/Source/Demos.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -375,7 +375,7 @@ struct FlockWithText : public FlockDemo "Visual Studio, Android Studio, GCC and other compilers"); messages.add ("JUCE can be used to build desktop or mobile apps, and also\n" - "audio plug-ins in the VST2, VST3, AudioUnit, AAX and RTAS formats"); + "audio plug-ins in the VST2, VST3, AudioUnit and AAX formats"); } String getName() const override { return "Flock with text"; } diff --git a/extras/NetworkGraphicsDemo/Source/Main.cpp b/extras/NetworkGraphicsDemo/Source/Main.cpp index ff6e705f..2ce75409 100644 --- a/extras/NetworkGraphicsDemo/Source/Main.cpp +++ b/extras/NetworkGraphicsDemo/Source/Main.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/NetworkGraphicsDemo/Source/MasterComponent.h b/extras/NetworkGraphicsDemo/Source/MasterComponent.h index 12cad9ed..d7df6813 100644 --- a/extras/NetworkGraphicsDemo/Source/MasterComponent.h +++ b/extras/NetworkGraphicsDemo/Source/MasterComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/NetworkGraphicsDemo/Source/SharedCanvas.h b/extras/NetworkGraphicsDemo/Source/SharedCanvas.h index 450755eb..fe3d4b39 100644 --- a/extras/NetworkGraphicsDemo/Source/SharedCanvas.h +++ b/extras/NetworkGraphicsDemo/Source/SharedCanvas.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Builds/LinuxMakefile/Makefile b/extras/Projucer/Builds/LinuxMakefile/Makefile index e2e84b71..5bf06a28 100644 --- a/extras/Projucer/Builds/LinuxMakefile/Makefile +++ b/extras/Projucer/Builds/LinuxMakefile/Makefile @@ -11,6 +11,10 @@ endif # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ ifeq ($(CONFIG),Debug) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.6" "-DJUCE_APP_VERSION_HEX=0x60106" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.0" "-DJUCE_APP_VERSION_HEX=0x70000" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := Projucer JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs freetype2) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,13 +60,13 @@ ifeq ($(CONFIG),Release) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.6" "-DJUCE_APP_VERSION_HEX=0x60106" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.0" "-DJUCE_APP_VERSION_HEX=0x70000" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := Projucer JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs freetype2) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs freetype2) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -132,8 +136,8 @@ OBJECTS_APP := \ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors freetype2 + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors freetype2 @echo Linking "Projucer - App" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) diff --git a/extras/Projucer/Builds/MacOSX/Info-App.plist b/extras/Projucer/Builds/MacOSX/Info-App.plist index c1bafadd..b13eaed4 100644 --- a/extras/Projucer/Builds/MacOSX/Info-App.plist +++ b/extras/Projucer/Builds/MacOSX/Info-App.plist @@ -22,9 +22,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 6.1.6 + 7.0.0 CFBundleVersion - 6.1.6 + 7.0.0 NSHumanReadableCopyright Raw Material Software Limited NSHighResolutionCapable diff --git a/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj b/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj index 0f3d07cc..1b535ce5 100644 --- a/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj +++ b/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj @@ -17,7 +17,6 @@ 11D42F7EC6E6539D79A7F4B1 /* QuartzCore.framework */ = {isa = PBXBuildFile; fileRef = E5D6C36496F5BC84D7213BE8; }; 1321E6C1C6170B6C898AD09D /* Icon.icns */ = {isa = PBXBuildFile; fileRef = 951128CA33CCDEF570436B1C; }; 1B988E139004D8E2850EB656 /* jucer_PaintRoutine.cpp */ = {isa = PBXBuildFile; fileRef = C187718F7B9EBA88584B43F3; }; - 1E76E36772355E2A43CF4961 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = D00F311BFC3C2625C457CB9B; }; 209FCCC2155A1FCB7E11E20D /* jucer_JucerDocument.cpp */ = {isa = PBXBuildFile; fileRef = 269A454F1FF081DA67FFD578; }; 234B6BA2952CBC7C61EF70EF /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 5867DC4E39DF8539B54C0D59; }; 241F29FCBB7A17BB44A0B10C /* Cocoa.framework */ = {isa = PBXBuildFile; fileRef = D1F9B0E9F5D54FE48BEB46EA; }; @@ -112,6 +111,7 @@ 133F1E428260C5ADDF496DF9 /* jucer_ComponentLayout.cpp */ /* jucer_ComponentLayout.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_ComponentLayout.cpp; path = ../../Source/ComponentEditor/jucer_ComponentLayout.cpp; sourceTree = SOURCE_ROOT; }; 16751E04B0F3737BDF52CEB4 /* jucer_HeaderComponent.h */ /* jucer_HeaderComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_HeaderComponent.h; path = ../../Source/Project/UI/jucer_HeaderComponent.h; sourceTree = SOURCE_ROOT; }; 169DD91232C070C4D6470B31 /* jucer_IconButton.h */ /* jucer_IconButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_IconButton.h; path = ../../Source/Utility/UI/jucer_IconButton.h; sourceTree = SOURCE_ROOT; }; + 18C82CBCEE30425A2481755D /* PIPAudioProcessorWithARA.cpp.in */ /* PIPAudioProcessorWithARA.cpp.in */ = {isa = PBXFileReference; lastKnownFileType = file.in; name = PIPAudioProcessorWithARA.cpp.in; path = ../../../Build/CMake/PIPAudioProcessorWithARA.cpp.in; sourceTree = SOURCE_ROOT; }; 191330B20DAC08B890656EA0 /* jucer_PIPGenerator.cpp */ /* jucer_PIPGenerator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_PIPGenerator.cpp; path = ../../Source/Utility/PIPs/jucer_PIPGenerator.cpp; sourceTree = SOURCE_ROOT; }; 1B0F18E1D96F727C062B05FA /* jucer_ProjectContentComponent.cpp */ /* jucer_ProjectContentComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_ProjectContentComponent.cpp; path = ../../Source/Project/UI/jucer_ProjectContentComponent.cpp; sourceTree = SOURCE_ROOT; }; 1B5BCD4899A9E295786EB642 /* jucer_OpenDocumentManager.h */ /* jucer_OpenDocumentManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_OpenDocumentManager.h; path = ../../Source/CodeEditor/jucer_OpenDocumentManager.h; sourceTree = SOURCE_ROOT; }; @@ -134,6 +134,7 @@ 269A454F1FF081DA67FFD578 /* jucer_JucerDocument.cpp */ /* jucer_JucerDocument.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_JucerDocument.cpp; path = ../../Source/ComponentEditor/jucer_JucerDocument.cpp; sourceTree = SOURCE_ROOT; }; 2BD9B4556479A8A41740BCAE /* jucer_ComponentTemplate.h */ /* jucer_ComponentTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ComponentTemplate.h; path = ../../Source/BinaryData/Templates/jucer_ComponentTemplate.h; sourceTree = SOURCE_ROOT; }; 2CD34A70B4032C0426F7AA10 /* jucer_MainWindow.h */ /* jucer_MainWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_MainWindow.h; path = ../../Source/Application/jucer_MainWindow.h; sourceTree = SOURCE_ROOT; }; + 2E9CF857DCF1EFEA997B4D5B /* jucer_AudioPluginARAPlaybackRendererTemplate.h */ /* jucer_AudioPluginARAPlaybackRendererTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_AudioPluginARAPlaybackRendererTemplate.h; path = ../../Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.h; sourceTree = SOURCE_ROOT; }; 2EEB1C074162F363C6599282 /* jucer_CommandLine.h */ /* jucer_CommandLine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_CommandLine.h; path = ../../Source/Application/jucer_CommandLine.h; sourceTree = SOURCE_ROOT; }; 2F0A7CA808B2FCCC9ED68992 /* jucer_LicenseQueryThread.h */ /* jucer_LicenseQueryThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_LicenseQueryThread.h; path = ../../Source/Application/UserAccount/jucer_LicenseQueryThread.h; sourceTree = SOURCE_ROOT; }; 2F373F97E30AC1A0BFC1FC61 /* jucer_FilePropertyComponent.h */ /* jucer_FilePropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_FilePropertyComponent.h; path = ../../Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h; sourceTree = SOURCE_ROOT; }; @@ -180,7 +181,6 @@ 5432B7B9B2CF2EAEC8B66D5C /* jucer_UtilityFunctions.h */ /* jucer_UtilityFunctions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_UtilityFunctions.h; path = ../../Source/ComponentEditor/jucer_UtilityFunctions.h; sourceTree = SOURCE_ROOT; }; 5524B5C9FC6AEAA670B92AA9 /* jucer_ComponentLayoutEditor.h */ /* jucer_ComponentLayoutEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ComponentLayoutEditor.h; path = ../../Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h; sourceTree = SOURCE_ROOT; }; 56177921580A4855917E0205 /* jucer_AudioPluginEditorTemplate.h */ /* jucer_AudioPluginEditorTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_AudioPluginEditorTemplate.h; path = ../../Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.h; sourceTree = SOURCE_ROOT; }; - 56749E4C72A8F51ACA8F2330 /* export_clion.svg */ /* export_clion.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = export_clion.svg; path = ../../Source/BinaryData/Icons/export_clion.svg; sourceTree = SOURCE_ROOT; }; 576A92E1E0D8F453EC0FEB34 /* gradlew.bat */ /* gradlew.bat */ = {isa = PBXFileReference; lastKnownFileType = file.bat; name = gradlew.bat; path = ../../Source/BinaryData/gradle/gradlew.bat; sourceTree = SOURCE_ROOT; }; 5783563E39E48ADFC68EB84A /* jucer_ComponentTextProperty.h */ /* jucer_ComponentTextProperty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ComponentTextProperty.h; path = ../../Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h; sourceTree = SOURCE_ROOT; }; 582F659B801F656C2B7C51B1 /* jucer_Modules.h */ /* jucer_Modules.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_Modules.h; path = ../../Source/Project/Modules/jucer_Modules.h; sourceTree = SOURCE_ROOT; }; @@ -238,6 +238,7 @@ 8D9A9A373E4621F7CBFCCCEF /* jucer_ContentCompTemplate.cpp */ /* jucer_ContentCompTemplate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_ContentCompTemplate.cpp; path = ../../Source/BinaryData/Templates/jucer_ContentCompTemplate.cpp; sourceTree = SOURCE_ROOT; }; 8DBB36126CD144A8364F1F19 /* jucer_ProjectExporter.h */ /* jucer_ProjectExporter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectExporter.h; path = ../../Source/ProjectSaving/jucer_ProjectExporter.h; sourceTree = SOURCE_ROOT; }; 8DFE6D8AFB8057790041300B /* jucer_ToggleButtonHandler.h */ /* jucer_ToggleButtonHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ToggleButtonHandler.h; path = ../../Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h; sourceTree = SOURCE_ROOT; }; + 8E129499EA2FB8A4944F8701 /* jucer_AudioPluginARADocumentControllerTemplate.h */ /* jucer_AudioPluginARADocumentControllerTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_AudioPluginARADocumentControllerTemplate.h; path = ../../Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.h; sourceTree = SOURCE_ROOT; }; 8F30A53C7FE4BC65171FB3E2 /* jucer_JucerDocument.h */ /* jucer_JucerDocument.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_JucerDocument.h; path = ../../Source/ComponentEditor/jucer_JucerDocument.h; sourceTree = SOURCE_ROOT; }; 8F4D281E98808204E2846A7D /* export_xcode.svg */ /* export_xcode.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = export_xcode.svg; path = ../../Source/BinaryData/Icons/export_xcode.svg; sourceTree = SOURCE_ROOT; }; 8F67F3C0492EAFEBDBBC12DB /* jucer_NewCppFileTemplate.cpp */ /* jucer_NewCppFileTemplate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_NewCppFileTemplate.cpp; path = ../../Source/BinaryData/Templates/jucer_NewCppFileTemplate.cpp; sourceTree = SOURCE_ROOT; }; @@ -246,10 +247,12 @@ 8FEF6F5EA676B824C021EB6F /* wizard_AnimatedApp.svg */ /* wizard_AnimatedApp.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = wizard_AnimatedApp.svg; path = ../../Source/BinaryData/Icons/wizard_AnimatedApp.svg; sourceTree = SOURCE_ROOT; }; 8FF26BF72A522FBEAAFDDF54 /* wizard_AudioApp.svg */ /* wizard_AudioApp.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = wizard_AudioApp.svg; path = ../../Source/BinaryData/Icons/wizard_AudioApp.svg; sourceTree = SOURCE_ROOT; }; 9069981E414A631B036CC9AC /* jucer_MainWindow.cpp */ /* jucer_MainWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_MainWindow.cpp; path = ../../Source/Application/jucer_MainWindow.cpp; sourceTree = SOURCE_ROOT; }; + 921D263A2EAFD96C8D389693 /* JuceLV2Defines.h.in */ /* JuceLV2Defines.h.in */ = {isa = PBXFileReference; lastKnownFileType = file.in; name = JuceLV2Defines.h.in; path = ../../../Build/CMake/JuceLV2Defines.h.in; sourceTree = SOURCE_ROOT; }; 92926A4D3CC4BB2A9D35EB0B /* jucer_UTF8WindowComponent.h */ /* jucer_UTF8WindowComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_UTF8WindowComponent.h; path = ../../Source/Application/Windows/jucer_UTF8WindowComponent.h; sourceTree = SOURCE_ROOT; }; 92A66A8BD87F98EB6B4FB6D0 /* jucer_ProjectContentComponent.h */ /* jucer_ProjectContentComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectContentComponent.h; path = ../../Source/Project/UI/jucer_ProjectContentComponent.h; sourceTree = SOURCE_ROOT; }; 94146B40B41BF0AACF4359DD /* jucer_LicenseState.h */ /* jucer_LicenseState.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_LicenseState.h; path = ../../Source/Application/UserAccount/jucer_LicenseState.h; sourceTree = SOURCE_ROOT; }; 951128CA33CCDEF570436B1C /* Icon.icns */ /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = SOURCE_ROOT; }; + 96A1EC6B50DBD2C526C60338 /* jucer_AudioPluginARADocumentControllerTemplate.cpp */ /* jucer_AudioPluginARADocumentControllerTemplate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_AudioPluginARADocumentControllerTemplate.cpp; path = ../../Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.cpp; sourceTree = SOURCE_ROOT; }; 983CFBA01CA8811F30FA7F4C /* jucer_MiscUtilities.h */ /* jucer_MiscUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_MiscUtilities.h; path = ../../Source/Utility/Helpers/jucer_MiscUtilities.h; sourceTree = SOURCE_ROOT; }; 988F5C1E40DED02D8B064253 /* jucer_PaintElementGroup.cpp */ /* jucer_PaintElementGroup.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_PaintElementGroup.cpp; path = ../../Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp; sourceTree = SOURCE_ROOT; }; 9914F905BFCFBE5F76619670 /* jucer_ColouredElement.h */ /* jucer_ColouredElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ColouredElement.h; path = ../../Source/ComponentEditor/PaintElements/jucer_ColouredElement.h; sourceTree = SOURCE_ROOT; }; @@ -313,14 +316,12 @@ CCD62DB0A19A985A4B9D7F32 /* jucer_ProjectExport_Android.h */ /* jucer_ProjectExport_Android.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectExport_Android.h; path = ../../Source/ProjectSaving/jucer_ProjectExport_Android.h; sourceTree = SOURCE_ROOT; }; CD267A28C16C4E79EB749005 /* gpl_logo.svg */ /* gpl_logo.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = gpl_logo.svg; path = ../../Source/BinaryData/Icons/gpl_logo.svg; sourceTree = SOURCE_ROOT; }; CF6C8BD0DA3D8CD4E99EBADA /* WebKit.framework */ /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; - D00F311BFC3C2625C457CB9B /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; D045BD5943BD38F2720FF5F0 /* jucer_FontPropertyComponent.h */ /* jucer_FontPropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_FontPropertyComponent.h; path = ../../Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h; sourceTree = SOURCE_ROOT; }; D05BD91B6105827B010E1C20 /* juce_gui_extra */ /* juce_gui_extra */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_gui_extra; path = ../../../../modules/juce_gui_extra; sourceTree = SOURCE_ROOT; }; D1739728A79A2062418B8EF0 /* wizard_StaticLibrary.svg */ /* wizard_StaticLibrary.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = wizard_StaticLibrary.svg; path = ../../Source/BinaryData/Icons/wizard_StaticLibrary.svg; sourceTree = SOURCE_ROOT; }; D1F9B0E9F5D54FE48BEB46EA /* Cocoa.framework */ /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; D4EB334E5186D1584EC63CA4 /* jucer_AudioComponentSimpleTemplate.h */ /* jucer_AudioComponentSimpleTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_AudioComponentSimpleTemplate.h; path = ../../Source/BinaryData/Templates/jucer_AudioComponentSimpleTemplate.h; sourceTree = SOURCE_ROOT; }; D5795F8CAC5876714DAB355F /* jucer_AnimatedComponentTemplate.h */ /* jucer_AnimatedComponentTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_AnimatedComponentTemplate.h; path = ../../Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.h; sourceTree = SOURCE_ROOT; }; - D5EF5961B1F0E3FAED32E30A /* jucer_ProjectExport_CLion.h */ /* jucer_ProjectExport_CLion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectExport_CLion.h; path = ../../Source/ProjectSaving/jucer_ProjectExport_CLion.h; sourceTree = SOURCE_ROOT; }; D6390A40B3279E0E626C78D3 /* jucer_ColouredElement.cpp */ /* jucer_ColouredElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_ColouredElement.cpp; path = ../../Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp; sourceTree = SOURCE_ROOT; }; D766BB9D8C32B5560F0493F3 /* include_juce_cryptography.mm */ /* include_juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_cryptography.mm; path = ../../JuceLibraryCode/include_juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; D91E7F8FEF9290195D56782C /* jucer_EditorColourSchemeWindowComponent.h */ /* jucer_EditorColourSchemeWindowComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_EditorColourSchemeWindowComponent.h; path = ../../Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h; sourceTree = SOURCE_ROOT; }; @@ -360,6 +361,7 @@ F30DF63DBEFA4BEEF7C369FC /* jucer_LicenseController.h */ /* jucer_LicenseController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_LicenseController.h; path = ../../Source/Application/UserAccount/jucer_LicenseController.h; sourceTree = SOURCE_ROOT; }; F313EE01ECE306DB2CFE011D /* UnityPluginGUIScript.cs.in */ /* UnityPluginGUIScript.cs.in */ = {isa = PBXFileReference; lastKnownFileType = file.in; name = UnityPluginGUIScript.cs.in; path = ../../../Build/CMake/UnityPluginGUIScript.cs.in; sourceTree = SOURCE_ROOT; }; F3CC8F26ECCDA6DCD8A284D2 /* jucer_GradientPointComponent.h */ /* jucer_GradientPointComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_GradientPointComponent.h; path = ../../Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h; sourceTree = SOURCE_ROOT; }; + F3CCA5545AB7B4B603D0BFEB /* jucer_AudioPluginARAPlaybackRendererTemplate.cpp */ /* jucer_AudioPluginARAPlaybackRendererTemplate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_AudioPluginARAPlaybackRendererTemplate.cpp; path = ../../Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.cpp; sourceTree = SOURCE_ROOT; }; F4FD9BD16ED2700F45A68C4F /* jucer_ComponentBooleanProperty.h */ /* jucer_ComponentBooleanProperty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ComponentBooleanProperty.h; path = ../../Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h; sourceTree = SOURCE_ROOT; }; F58B23995765C9FDBE28F871 /* jucer_Modules.cpp */ /* jucer_Modules.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_Modules.cpp; path = ../../Source/Project/Modules/jucer_Modules.cpp; sourceTree = SOURCE_ROOT; }; F5DD97B45B8EA60C1ED0DD80 /* jucer_StoredSettings.cpp */ /* jucer_StoredSettings.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = jucer_StoredSettings.cpp; path = ../../Source/Settings/jucer_StoredSettings.cpp; sourceTree = SOURCE_ROOT; }; @@ -389,7 +391,6 @@ A578EAD4BB55680E8097BE0F, C1B9334AE849F93FB3C56B34, A14C2C2725DA3CA7995D2815, - 1E76E36772355E2A43CF4961, 241F29FCBB7A17BB44A0B10C, 9359F9401D59B4517F75C39C, 091A57B4B9CE623E75E9A756, @@ -441,7 +442,6 @@ 80D62B907248523E6943298B, 5A75806B34E4EA6598A6024A, 210CD22F25F2C22F9CEEB025, - D00F311BFC3C2625C457CB9B, D1F9B0E9F5D54FE48BEB46EA, 728FE25157E9874D50BBECB2, E983E6DDE3318B872EBE347F, @@ -607,7 +607,6 @@ isa = PBXGroup; children = ( CCD62DB0A19A985A4B9D7F32, - D5EF5961B1F0E3FAED32E30A, FA790C59A304579F660F112F, 59520B8137E6A2E483074399, FF68231DE2B395461009116C, @@ -664,6 +663,10 @@ D4EB334E5186D1584EC63CA4, 203FA6AD7EDDF1F9C338CC2A, 5BF0374EB908F0476BD8ED42, + 96A1EC6B50DBD2C526C60338, + 8E129499EA2FB8A4944F8701, + F3CCA5545AB7B4B603D0BFEB, + 2E9CF857DCF1EFEA997B4D5B, 6574A50A8997799705B23465, 56177921580A4855917E0205, 079802C6AEE7646010766FE8, @@ -807,7 +810,6 @@ children = ( 514F2FAFDBF535AC03FA2E6C, 807049CA2D5B6DE18EA078F2, - 56749E4C72A8F51ACA8F2330, 42F4AA3EF0883D506987CA99, 69B478C992FA0B8C885946A6, EAC1731150A7F79D59BAA0B6, @@ -846,8 +848,10 @@ DC3A4B0AD79334BA8A7E0661 /* BinaryData */ = { isa = PBXGroup; children = ( + 921D263A2EAFD96C8D389693, 50F89D3827B83B48855B3564, A0ECDAF137029C445910D3ED, + 18C82CBCEE30425A2481755D, 463C8CF42FAA00014198B71B, F84D031B2A6BB1EE6A316C71, 233C7FC5157176DB33FE2F27, @@ -987,7 +991,7 @@ 74EA481348A24104E6ACE009 = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 0039FE1A254FE518518BF8B8 = { @@ -1129,7 +1133,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_build_tools=1", "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_MODULE_AVAILABLE_juce_cryptography=1", @@ -1147,16 +1151,16 @@ "JUCE_WEB_BROWSER=0", "JUCE_STANDALONE_APPLICATION=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=6.1.6", - "JUCE_APP_VERSION_HEX=0x60106", + "JUCE_APP_VERSION=7.0.0", + "JUCE_APP_VERSION_HEX=0x70000", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -1170,8 +1174,9 @@ INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../Build $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.theprojucer; PRODUCT_NAME = "Projucer"; USE_HEADERMAP = NO; @@ -1198,7 +1203,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_build_tools=1", "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_MODULE_AVAILABLE_juce_cryptography=1", @@ -1216,16 +1221,16 @@ "JUCE_WEB_BROWSER=0", "JUCE_STANDALONE_APPLICATION=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=6.1.6", - "JUCE_APP_VERSION_HEX=0x60106", + "JUCE_APP_VERSION=7.0.0", + "JUCE_APP_VERSION_HEX=0x70000", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( @@ -1239,8 +1244,9 @@ INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../Build $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.theprojucer; PRODUCT_NAME = "Projucer"; USE_HEADERMAP = NO; diff --git a/extras/Projucer/Builds/VisualStudio2015/Projucer.sln b/extras/Projucer/Builds/VisualStudio2015/Projucer.sln deleted file mode 100644 index ad322078..00000000 --- a/extras/Projucer/Builds/VisualStudio2015/Projucer.sln +++ /dev/null @@ -1,21 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 14 - -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Projucer - App", "Projucer_App.vcxproj", "{E4CFCE31-1AF5-C360-751D-9682E333BE4D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E4CFCE31-1AF5-C360-751D-9682E333BE4D}.Debug|x64.ActiveCfg = Debug|x64 - {E4CFCE31-1AF5-C360-751D-9682E333BE4D}.Debug|x64.Build.0 = Debug|x64 - {E4CFCE31-1AF5-C360-751D-9682E333BE4D}.Release|x64.ActiveCfg = Release|x64 - {E4CFCE31-1AF5-C360-751D-9682E333BE4D}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj deleted file mode 100644 index e8f9dccb..00000000 --- a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj +++ /dev/null @@ -1,2179 +0,0 @@ - - - - - - Debug - x64 - - - Release - x64 - - - - {E4CFCE31-1AF5-C360-751D-9682E333BE4D} - - - - Application - false - false - v140 - 8.1 - - - Application - false - false - v140 - 8.1 - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - .exe - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - Projucer - true - $(SolutionDir)$(Platform)\$(Configuration)\App\ - $(Platform)\$(Configuration)\App\ - Projucer - true - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Disabled - ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - true - NotUsing - $(IntDir)\ - $(IntDir)\ - $(IntDir)\Projucer.pdb - Level4 - true - true - /bigobj %(AdditionalOptions) - stdcpp14 - - - _DEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\Projucer.exe - true - libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries) - true - $(IntDir)\Projucer.pdb - Windows - true - - - true - $(IntDir)\Projucer.bsc - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - - - - Full - ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) - MultiThreaded - true - NotUsing - $(IntDir)\ - $(IntDir)\ - $(IntDir)\Projucer.pdb - Level4 - true - true - /bigobj %(AdditionalOptions) - stdcpp14 - - - NDEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\Projucer.exe - true - %(IgnoreSpecificDefaultLibraries) - false - $(IntDir)\Projucer.pdb - Windows - true - true - true - - - true - $(IntDir)\Projucer.bsc - - - - - - - - true - - - - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - - - - - - - - /bigobj %(AdditionalOptions) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters deleted file mode 100644 index 15a5ecd4..00000000 --- a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters +++ /dev/null @@ -1,3878 +0,0 @@ - - - - - - {1E1D2D75-0ADA-6E9E-105F-2F87632B55AF} - - - {DA27985D-8427-CE70-CA06-EAF7009CCC60} - - - {DC7E18A5-E854-3D99-627F-AAA88246B712} - - - {4F8BCD36-CE20-D951-FB82-2CCEDD0C5898} - - - {661FA330-2192-FAA3-E7B2-FAF8EBB783C6} - - - {3A77FAA0-7E92-6D59-9C5F-BAAA2BF82833} - - - {D8DD148A-AB2B-B485-520B-8924DA606099} - - - {FE290DF2-C600-4159-D484-7F48DB498EBE} - - - {DE3E40F0-B495-2AC0-52AF-AA073FFE8E4C} - - - {A61A4546-CC78-CCFD-CC99-D5CD03650B08} - - - {485EE240-BE7D-E5FD-07C2-760B7401D5F3} - - - {35957741-E3A5-47F8-86DC-FDE691866C74} - - - {16DF510D-120E-D924-C478-E1E82643ED83} - - - {3207865A-047C-278E-870A-BC204B74ECB3} - - - {5F21E507-E5E8-0A74-F1AE-874BB67C26CC} - - - {F5C79836-30DE-9DC7-9392-DAAB3F04C18E} - - - {A0A94AE6-B447-151A-D0DA-FAE9B5410EBF} - - - {D2E33EF7-EDDC-06BA-9343-EF957E30A158} - - - {BBF7BD20-FB7D-59E5-D1DD-3E6F1455CA02} - - - {C4676327-23FA-ED8F-1881-BC5E53840936} - - - {FAD9788E-4FE6-172B-0E32-913C0C8FC2FB} - - - {A353D068-8C43-A573-8460-59B6BA167F83} - - - {A4B9C07E-05B1-BCE9-E075-7E573FFD23B0} - - - {ACCBC32A-58D5-1EC6-FC4D-B3B32CB6588E} - - - {A90A32B8-1A07-8900-6E90-EC981F56EC9D} - - - {F77CA057-8DE4-E076-7EB6-D2646794864B} - - - {7DBEF27C-2AFE-DA02-1DBF-E80FAAC99EA7} - - - {D9FAFF6D-6737-F775-056A-D0B29BE13820} - - - {065C11E4-EB37-5B72-0A01-F549675EB866} - - - {42F7BE9D-3C8A-AE26-289B-8F355C068036} - - - {7868764A-6572-381A-906C-9C26792A4C29} - - - {03678508-A517-48BB-FB4A-485628C34E08} - - - {07D27C1D-3227-F527-356C-17DA11551A99} - - - {6146D580-99D2-A6C8-5908-30DC355BB6BA} - - - {C67003E8-BEA8-2188-F4B3-A122F4B4FA3F} - - - {09B91E68-1FF4-C7ED-9055-D4D96E66A0BA} - - - {30B3DA63-C1E4-F2EA-CEF0-8035D8CBFF64} - - - {4F24EEED-AA33-AC6C-9A39-72E71CF83EF0} - - - {0F70B1A9-BB50-23F5-2AE7-F95E51A00389} - - - {D4C8DC40-2CD2-04B6-05D0-1E7A88841390} - - - {58BED6AF-DB89-7560-B2B8-D937C1C0825A} - - - {B958F86B-6926-8D9B-2FC6-8BFD4BDC72C9} - - - {DB624F7D-D513-25AC-C13C-B9062EB3BEEE} - - - {89AA9B6C-4029-A34F-C1B0-3B5D8691F4D4} - - - {1A7F541C-B032-9C66-C320-A13B2A8A9866} - - - {4BAB7C18-51AB-0D9D-83CD-9C37F28D2E38} - - - {5523922E-8B0C-A52B-477C-752C09F8197F} - - - {857B6D8B-0ECB-FE9E-D1EB-D5E45E72F057} - - - {BAA582FA-40B7-320E-EE7A-4C3892C7BE72} - - - {89B3E447-34BE-C691-638E-09796C6B647E} - - - {9BE78436-DBF4-658C-579B-ED19FFD0EB5D} - - - {21E7FA61-9E0A-4BA1-04B7-AF47AFA9CB8B} - - - {632B4C79-AF7D-BFB5-D006-5AE67F607130} - - - {B10E20C2-4583-2B79-60B7-FE4D4B044313} - - - {CFB54F15-8A8A-0505-9B7F-ECA41CEE38E8} - - - {911F0159-A7A8-4A43-3FD4-154F62F4A44B} - - - {9D5816C2-E2B2-2E3F-B095-AC8BD1100D29} - - - {3FDCD000-763F-8477-9AF8-70ABA2E91E5E} - - - {0947506F-66FA-EF8D-8A4E-4D48BCDBB226} - - - {E4B6AED3-F54C-3FF2-069F-640BACAE0E08} - - - {D5EADBCC-6A1C-C940-0206-26E49110AF08} - - - {D27DC92D-5BEB-9294-DCD1-81D54E245AD5} - - - {BCD73D20-42B1-6CDB-DE66-B06236A60F47} - - - {20DC13F6-2369-8841-9F0B-D13FA14EEE74} - - - {A302A8DB-120F-9EBB-A3D5-2C29963AA56B} - - - {45489C2A-6E0E-CCDC-6638-0DACEEB63CCA} - - - {F1B90726-DB55-0293-BFAF-C65C7DF5489C} - - - {2C55FD42-0ACD-B0B8-7EAE-EB17F09BAEEC} - - - {B68CD2B2-701F-9AB7-4638-2485D6E06BCF} - - - {B0B7C78E-729E-0FFA-D611-82AE8BC7FE2C} - - - {0A4F7E12-220C-14EF-0026-9C0629FA9C17} - - - {37F49E10-4E62-6D5C-FF70-722D0CA3D97E} - - - {160D9882-0F68-278D-C5F9-8960FD7421D2} - - - {4CED05DA-E0A2-E548-F753-1F2EF299A8E3} - - - {46AE69B8-AD58-4381-6CDE-25C8D75B01D2} - - - {E56CB4FC-32E8-8740-A3BB-B323CD937A99} - - - {4ECDCA0C-BB38-0729-A6B6-2FB0B4D0863B} - - - {294E4CD5-B06F-97D1-04A3-51871CEA507C} - - - {77228F15-BD91-06FF-2C7E-0377D25C2C94} - - - {5CB531E6-BF9A-2C50-056C-EE5A525D28D3} - - - {E4EA47E5-B41C-2A19-1783-7E9104096ECD} - - - {B331BC33-9770-3DB5-73F2-BC2469ECCF7F} - - - {46A17AC9-0BFF-B5CE-26D6-B9D1992C88AC} - - - {D90A8DF7-FBAB-D363-13C0-6707BB22B72B} - - - {8AE77C40-6839-EC37-4515-BD3CC269BCE4} - - - {0EAD99DB-011F-09E5-45A2-365F646EB004} - - - {F57590C6-3B90-1BE1-1006-488BA33E8BD9} - - - {7C319D73-0D93-5842-0874-398D2D3038D5} - - - {2CB4DB0C-DD3B-6195-D822-76EC7A5C88D2} - - - {FE3CB19C-EF43-5CF5-DAF0-09D4E43D0AB9} - - - {C0E5DD5D-F8F1-DD25-67D7-291946AB3828} - - - {FE7E6CD5-C7A0-DB20-4E7E-D6E7F08C4578} - - - {895C2D33-E08D-B1BA-BB36-FC4CA65090C8} - - - {D64A57DB-A956-5519-1929-1D929B56E1B0} - - - {5A99CC24-AC45-7ED6-C11A-B8B86E76D884} - - - {7A131EEC-25A7-22F6-2839-A2194DDF3007} - - - {EA9DB76C-CEF7-6BFC-2070-28B7DF8E8063} - - - {3C206A40-6F1B-E683-ACF1-DEC3703D0140} - - - {DF95D4BF-E18C-125A-5EBB-8993A06E232C} - - - {118946F2-AC24-0F09-62D5-753DF87A60CD} - - - {07329F9B-7D3D-CEB3-C771-714842076140} - - - {08BBBECB-B0D1-7611-37EC-F57E1D0CE2A2} - - - {268E8F2A-980C-BF2F-B161-AACABC9D91F3} - - - {A4D76113-9EDC-DA60-D89B-5BACF7F1C426} - - - {FE955B6B-68AC-AA07-70D8-2413F6DB65C8} - - - {7ED5A90E-41AF-A1EF-659B-37CEEAB9BA61} - - - - - Projucer\Application\StartPage - - - Projucer\Application\StartPage - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Documents - - - Projucer\ComponentEditor\Documents - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\Project\Modules - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\Settings - - - Projucer\Settings - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\PIPs - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\image_formats - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Modules\juce_gui_extra - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - JUCE Library Code - - - - - Projucer\Application\StartPage - - - Projucer\Application\StartPage - - - Projucer\Application\StartPage - - - Projucer\Application\StartPage - - - Projucer\Application\StartPage - - - Projucer\Application\UserAccount - - - Projucer\Application\UserAccount - - - Projucer\Application\UserAccount - - - Projucer\Application\UserAccount - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application\Windows - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\Application - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\BinaryData\Templates - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\CodeEditor - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Components - - - Projucer\ComponentEditor\Documents - - - Projucer\ComponentEditor\Documents - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\PaintElements - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\Properties - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor\UI - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\ComponentEditor - - - Projucer\Project\Modules - - - Projucer\Project\Modules - - - Projucer\Project\Modules - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI\Sidebar - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project\UI - - - Projucer\Project - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\ProjectSaving - - - Projucer\Settings - - - Projucer\Settings - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\Helpers - - - Projucer\Utility\PIPs - - - Projucer\Utility\UI\PropertyComponents - - - Projucer\Utility\UI\PropertyComponents - - - Projucer\Utility\UI\PropertyComponents - - - Projucer\Utility\UI\PropertyComponents - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - Projucer\Utility\UI - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools\utils - - - JUCE Modules\juce_build_tools - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\containers - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\files - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\javascript - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\logging - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\maths - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\memory - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\misc - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\native - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\network - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\streams - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\system - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\text - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\threads - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\time - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\unit_tests - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\xml - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip\zlib - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core\zip - - - JUCE Modules\juce_core - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\encryption - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography\hashing - - - JUCE Modules\juce_cryptography - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\app_properties - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\undomanager - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures\values - - - JUCE Modules\juce_data_structures - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\broadcasters - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\interprocess - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\messages - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\native - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events\timers - - - JUCE Modules\juce_events - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\colour - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\contexts - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\effects - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\fonts - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\geometry - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\images - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\native - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics\placement - - - JUCE Modules\juce_graphics - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\enums - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility\interfaces - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\accessibility - - - JUCE Modules\juce_gui_basics\application - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\buttons - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\commands - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\components - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\desktop - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\drawables - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\filebrowser - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\keyboard - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\layout - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\lookandfeel - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\menus - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\misc - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\mouse - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\accessibility - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native\x11 - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\native - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\positioning - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\properties - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\widgets - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics\windows - - - JUCE Modules\juce_gui_basics - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\code_editor - - - JUCE Modules\juce_gui_extra\documents - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\embedding - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\misc - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra\native - - - JUCE Modules\juce_gui_extra - - - JUCE Library Code - - - JUCE Library Code - - - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData - - - Projucer\BinaryData\gradle - - - Projucer\BinaryData\gradle - - - Projucer\BinaryData\gradle - - - Projucer\BinaryData\gradle - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData\Icons - - - Projucer\BinaryData - - - Projucer\BinaryData - - - JUCE Modules\juce_core\native\java - - - JUCE Modules\juce_graphics\image_formats\jpglib - - - JUCE Modules\juce_graphics\image_formats\pnglib - - - JUCE Library Code - - - - - JUCE Library Code - - - diff --git a/extras/Projucer/Builds/VisualStudio2015/icon.ico b/extras/Projucer/Builds/VisualStudio2015/icon.ico deleted file mode 100644 index 66ef92d6e83fdccf78add7c4d91e5a01dc909b12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46009 zcmdSA2{=~U_XjQ#X%MB95E>Lxaih#hQJD!DOGqJ-S%@+ZnUgu0Wk}}C^E}VVS8rE!yWe}izwh(^KmYSQ+dk*KXYch{Yp=cb+G}k%I6H85;v6`D1M3qwk9OkV z+`z%XIdNj^ISRgyhwm<2`1X7X2j?ys`~Y6a_gTg`IGa~-aOmMP{1m>~dJiicUfAwG zUDrw-&-0YHcyX6FwQ`p@FK-p6R^%P>+wa=*){m3wS>_2z=8$zJe!Vggg% zjrRcL9r7FU4f5^wevoIL66YM<<`@w1wGot~Mu6PcIdG_F5>sgUroi~}CWs$G0o~?U zfPA~X52Q~$*w(qf0tnZC1ovA~fyeC9_x1*p3&5my1qfy@0*B@$pa=Uv+8`JZo`lLh zH$F{tVA>+>k&-?;1`b2|M|vkg#^gGtEz%w-k^Lyhiznp8o(YkQcV8ZuTw4G(y(K{8 zTYI;GN+1JyP#&8DubWoCw|`Qx44P**0Mdr5)X4*pb9!G42+SY>c@65IX0igf4ORi! zrcWSeaS0SGtb=<+OCYdo4df22gJ9U+FnIwa^!7m>oEwqx$?I?g@6vW-ihueZkXk7U zx+n6$CfK^lVLSa#3qUdi^}U4DO#`lC$N68|?*r-8Qebd66>Or{z$WaZvSkhUlq>_e z4|9Lf-l;Wr_zTFWz6%<9+`&-CN6?n04~jgQ!C-we=qMcmDx%}S^4T=V$z28!H7h_P zb{@obZ{hzgzs^ih_KpJ-xShe2=A=g;%c~T`nq`6zpLrn3_Z3r~t51Q!e)MthHT;Qh^1AOj9fttLD@9mL(5>h9>j~}7~Sp8{AH^TH$7cB>h!)h^Yk@h7K zbwE#b64Qs9{WQ>P`cr?9_E`Nzbg;EC1}x7GfFO;8@9jTYWPz6YH4u|D0d!&8pY<2p z2Z94Tf6}UJL3UC#rerlX{O$Zf+GDSOJAY@1ad7hRaB!@4Y!z%jzpJs|A#IShh@CkB z3ok5){Xs4(#PIx=7f-I&Ufxm{NkkSFCG5F7lIw`1aJ<#;wf=j!O|3~^ab`^>EP2?1E@s} zfbPW!OhN9EcXseM3!%4pgi|)ic z;2N3%jQ!J?g52MS_N;1U9rF$HEz$^PgbgD|cmp?U3fKqL#ngZ|pjNtr;L5?1k7kq%G3NHyk5K-+zZ;i|;Mk_i6$`@6r@_KiUMu8sfp- z#w5_OG!4S$R(?yLd0>lvbl*BqD_aJk-D|LqX@K;F#emTGD-2uXy(M$x`=J#Su$C=%x-J~%HFB(GC=&0Ir#2XK0@<+ zhSMI5y@byaRd2xt^bF7&t6*be4eH-K#%~gZx{sxet>ebqK?R)ah~AOG(y@jH{!qR@ z(?#@9uWA{@^{<0jgn4)&G!R-C45dyI-|RVX>dpkilldSx>j((RItr>fZNcg~3JkB# z1FxYPAlaDs9fxXb8m1rq;aMOCb#ZkAfV%}t-|4GBpCr6@4I`6v_*?DpI`D`5`xGyO zsl`nUtu6Y_p0GyN5|A?12r_HrzWYmv--O^OZ?^=CE298~UInp`?}x4F7#z(DlVA{b zJ_6@s``iXb_LlW4plS-?5P-IEG?}s0-~KG30a$`EPHkNUx`{vfbld$qorDE| z(8AC!b{Y7#eq!eQ`)u03q>sgc)Nw`ZV0NK%J88^)=L8xkg#XCvcDmSmm8f|Ptu6Xa zbN`lpVktkETk89TJ__o;FC2II|A65a`u{-w!I?)uL8BI!K-GawxDHK1pLBJ8>^p|l z)lHE8X$g#vZGc5M1}Sh1wBn&}y3Mb~-v1*1(m(YNp@EfkKsqtTUvD3Z0Bh(4urfai z`b#~bFU*DUMMt4OIXAHYM%yRA*AX<3y7m=F^M3_)W;39!3eI7ugcZ=gH%a+X7o2i` z)W7ZXZymi1TKWS)=Wq;IS(^bH>&sxgEd?|ssDncHbKm`F#D`yp>r=XG5eQU^hxce; zZ7}nLFOB%cd6~-q4fV1P&OeLvMPU4S0rXFA{4oE1wm*naX9p`l%V!->>~--wO|1Wq z)E${-U}1U*yj9%t<6CmNK}GS(5A?D7g2(a@N5(Q{zk>Arv;Fzm{;n_2!ad6Qzod)B zurS^VD&iWy`|+`68PH||peFs}egcaDsoiZ+2>D;^FR}(~Uw>8?CVr4LmL|4th*JjW zwG9xWnfRSPvKN`?od)3nf9{92(?;$eNQ`6X|GfSn^nYG|dy8Ct%l~v=5kTaP(A-{% zLTkX#0QxV-0HKdy``!ABVA$?|3_!oOG5+B%7-}P=;QZSJ5zkV7ppD=_|Ul3LG)x7iF0CTlyv8wP1R313Xcf0Cxq(zz6?%&>!%O)iS&)oKxiQ}5!y(c;sPuxuzZhGz}V^k`nq0aPmJjGwK5kzo>CWcxbDTm zx`wCJc^HLfqTmd^g1T~g0w-}B7JP{^Bavsgyw&P_2)KlA0i9;ABOdJ z{k~J-1p)?2zzFnpSH8ucpsSC`At13HI=Jtrf^mT3-wJY%yhGwpw?}3{8{`qWkhVx4 zfv_*6&+mL}(Smc{N%m(v|K^#y%vBxA1BLBZpzIBJ3S-Xg3uBNr8pa)Q=MP|#tPg9sxUD_BxZu-e)KwXU@mA03_Z0?#@dWw&T1Iy72__6?*;b5w|7IhRc@#NZiP0HD zD0h+HU`Oyv!x;2D%)Qk@`}lWr7>P&5FRWmAwQ1POZ(?z8uMr-QaX@ql!SH=fW3V|r z`m4EsSyzkyT$_;G)(ngjAhGG~y7IgG)X5%zMDj)dB8H6BCH|pVOpF!L`|Yvp?bx^9 zJHq)e4d*nHzr~CJW*i{KzgVY{ydw4+;Ryd!ix1ZQ zJQZ)g`+SHGi1o!}Yy2^5BErB7%=KXfwZpV+rqa(kzLRy=^Zh8?Df5u`*^74Uj zZm&Ze{+(<8NOutY!Z0?UG`N*t8ingLf(_we3#*GRG6sTW?)x!*Ied@!Q!d?E-+cmv z2P9q|G}3^H4`Xxv+i`EdH|omA@Z18|vUA(kVq{(DhjVcPCQ>w@y~oP-cQrCMl>HfUq8;}Cbb%yK_pwG;I>{~hMUJV4e&E9U!+O*B|qf$Jo!k=)MU z${Yw7sRxn`f5zLlV@K|h97NsxIGBe6{t((pME;1)G=%X;M0c`A*Z(#bf!G~Wn3u|d z-yv%NvPNvb5Nrs>Z+g^srPzrY?wxqyGsZVVe8GX`X-qskD*rr;nG#`Q=iMU-U}<#% z^0EQO*A{`-U=4WCk_K}r3BSzk*S)3CK5k-sPORUC_?~DeMxDwZWsk^N3eHgtm_vBq zvj)bovWAK_xv&9RzM?@gT;r;s4k7Vh1l!#|{nbs*5(ggMQa7`2{D4Od5ny3;62upC zeUJAdabG0nn_Mmgn)>`;jC%m%@ASfWB$9V9hB|}D9Xl4tefQD~CLf5b$2u@4I}OL9 z9?skC`tlIwAbi@_KnaY`&#l4uC**Gsu4!2vYrq@kLv$18fpqBB`46Oi3uEXDFrT9d zF=Fv@mN=X8mb=7YpIv&sfU%iM5SByp1Ac7mIxvG2L>DlFst!A_yf%&D1IghcI%C^g z1|+`eR`O&QX4sK@8nV_RS1H7a$XgTYe*g_k4EzXf5dZnvBWsU@`x$4#}bfWo?#Va;^#HqvkL=)4vR3 z-!MnF4A+6bx)97TL<{5g0F2FV$@=edGTZSh!u&-k%pW5dzvC};Eyu(OkaZ1~Lg@Fk z4SoPYnTP&T{=f1<1j4duz?WJj&^q`Y%r6Z>*jw`cEBweDXofl+0QFrP<}swc>Bn}Q zzq^+Uo5Sc9g7G{45|=(qeB&GbYIt6usm~vCw&_=_Tj!O2_dY1|AUub37c9g1^Sf&X z+7#2&g@1(`%a6=^6wKeO0R-cB{6&sa|111Re)CJMGR&|1c~;?PK9-?f34?waqUSPU zf1b_4V*I=MZ}1Oe`T1}3Cp`BI$gNigT_bTA8~ZcnpP!NGjO2Qfp>OsoYZ2Vrc1G;) z@c&+aew@F(|7iXafyg{&PzTSS&A^=HI(iYaHlSdPq&>qJO!wsf3>(Zq%y#B8AR>4H z6HAB78JLIjxdYl1cjyoO&hB7&`rZ8f*?vx<>OlmQ>5qC&1n2ZY5T1J)q*Y3T-mfW` zd_0nKT!s7Y$*vsG5T^nP-)!aL8a_V2;9psQ`@yM2umLA-<+ePS?9DOY1C& z4z70J#^g=GGI$s>2kt^$$KuA;s?dIRz})rE_LH~#$MtI!y#g9~y`g*=V9x$1_*irm zV%V4;94CWvbfUkTs zC<(8FInxc08o%^C|AXZLspa5!=qOKukKqeo8Ro0ur(hiV4{;5vz!K(11L2y7oKN^G z|KWH38-jNeu0tzx!(gl>5tBD7@?iW0FE)R;RntTM;CTFmIjzMDUjf z@PfsuZm>85&z6{He$R)!g?w}r_kk5SUwxt8BRTQy^8fk%?)5QXqBR9_(wD&cmizx( z{~6f>AaU^T`*}k@{=rB$$ThU=Ur$V*I;W=EfLEO<2U>|6%_KWA{Jj41U?aL%TTE z`UwRY!SgPr+S6cR2@Mbo+v8UVMg;3$UB8PTF3t4A^;P*Vc|gvhO!eeK-B|~@{uLN| zkJXpIstbavFyoW~&jn%eZm$vSmip6RWC;DQi`kaPOmu_O10+!5^mP5c%+CS0Y?GTZYO*!Vf3OYP~# zaP4J>XMiq%%HW$|s&~s*%XwS=TfN!N3v$MPyn6~P!u8bC0R_)PY^?=~(58CW&ti1u zm-so7LxFi9EWUqI|1N(q_s#eD+MEF9$C{zqZ!MA^bd&!PeuS6S+#ZZgMAqY^m__j3 zZyprqu7GJcSCJga|22Psz#wI_sm3l}vkp8uxC=+ag`1CtX#*1y}B{9Q4OGtR=j`ql!E`Z^C1ZE`@! z<3tef@FRGq5{vnN5JX>)d*of{lO#|G&oiyT`~`9$ZIM2ZTp-dXb{_@n4d_=6{ac;+ z9eFSIU}>QvikpO{uIj-Vp}om!%z8Z zL}u9hwOT_M{6B^a5CwA%zviziG5Krc8*Ki1o4m2IpG0Won&7-Trsy z2exAOF#qrud5QlP=YMMV|JU;yKl6p`ACNr|vX4XdqL}^k@6OM_SS2Rj3S-7d8>H>e z{r%f#%poQ0K_#R{4ih1D9z0-#)K>8P5KR%I* zB7~PY;X`{IoD(=g*ZHK3111Aa0u-dZS8_*lWS-1)kDUta`7}d9N-8KwDBpGn{}1{o zx)T*~S8LL%YKL1X$<&YQ1|BU{L%$rvwRW_w5D{!M5)>@ECRmnZV4AR)ZDe67b!L~K zk#uHER;=fy1@{TVZqu0-v*iG@>5S0;2Iot(V$zzS0{3J?ahRB@KRqZW+NhtOpM0zO zdUhS}SW3*nYc3?wV$Js|J#MK|1ZQ5oOV(+>i&HdqEz9lVr(Q`1r#|~rW}KzBGvlca zxOWFVj#X}FpfRF$xX$?~tA0Y%EMHSc$H&K~$D*E*>2s9*S20ds@lX7=S$JVzJV(^4 zs(gk&1#n~^ey27PIH9)wYD4W<>9+tsG^&wd8!xij$X2GgR);OFx#@O8>zQ1}W7@@+zsM=b_9GMGZ-H zvQK!IkQ#VAmMHj0L`!eI7nLP-s9%t}$i9sm#VI3DkH?*B!a`z@7R4ZHVoV`m&CE7^ zPFpce$F>2NDNc;!#>ZFp)undqWr-O zzfw!aPR&jbUN8F~+S)XRe($O?ciRWXT}AfxR;KKZIs|vmalZ03{$N&*Pe8oRe%&

fcCcZbyxOgl6D5cev2s!_KysIM`=H)G4&EF8Wai8b)8@YNb;gpJP zis!1+8C)Nx6I!|+oH%Rp$^u_A_&r5MapT^Qg}D|TzZ8S>>@{sQQ?-O~euW8c7J(REiV%p8S?1X>|wZfgUMRqVhqkFew>Y-@nY}Y zooi9#@gxs334JE$>54UdXQJNwFhvbm$1ij0EOJaUbL+PZ5`29@P}p7SUhx%&OXQvZ zMJA>gCZn1KvSyj{7jA5daGl4qjtLvorGMjPcj2^cuUXKhOsgwiZ7QR(ua+jsQI|j1 zxo?p1+Oo2#KGKXZohm$4Pc>oVQ)^DtoFQ_}&Vty&>yTrIh4^))=bk-o{P@#Pm#VoF zY<$R^&skTIQ>JT*3EaE)roqYQGJB9w;8b!vNtB)k(WUXK$~}i_mv$4G1%5Dd(yjuZ zd($49-QE+He?ya88b>pI)gio*7YH%xhZEul#a2We;Za68pL&1GEwe}aMDJ#oU+m?* zMv-%V;`pbdCrJjO>qq~f6_awdAGkuk>OC>WmSbEp-s;_x zHzw|S;cAH4l`kdCCex_Xbkj15zHU*GIsMbE^zC#vJba3oxl(d^E?S~e#i{d^A(ju; zMnqIEK3D9oIC4=TEdKCVl%M4_nm&h9ipE_7MGO918o}9?tWl4ocIZ}Cgy*+dS#-3G z?4ef+V)4jcv&-5LVPNxC39(#N=;dCjcE>SayK{bWeT@!Rz=g@NZsbZ&u1wMJdTT)P zxyxPM$3$*?<*g+ZIFvr-aB3z+OW)J}jv-~U`+;=N@%MbFS=N`Ne6#mY+PmZIV7T5U zbF1upM47Ts-TC~dM@SP3cE(-9LEqi6BWsqa)rF(`WLHp=Wmb1lH{tF`|F?~NG6Oi` zk)DE|0@Epq8+Qhkh>;TBcV3Zv={ml6?j1UUEm2U)AbG+#7@+;!x|#CI$rax&<8k{& zMOe&WCT-!ecm{j0jnPiNq7q4B8TlPzo}q9x{T*Z;)6d;Sj2E&}Nxj@p0}@+xAhqe1@4 z6XyASj}P5G{+LKZT!z)A#6wN$6$RnC6G>7J>1@zVMaw;Q()s;4F`3s%13wEGC8Z2< z8yd!IJY9}Wf2=A*SbgTGWRvXsJk#0DrR2y23-rUpopbsphu`=sDc$8gsb`~B-ka&# zQJ7mJ+TGL0PJ7Kg!Ev|R{99Q=suY3b-EIAJ4mNh9ZSGad7B=r=iUJ9C>xrpfop6kRoG2wbHdR3BY@@UKceV6FWo-gM2r)&z>1{v6Xd=^V9 z*+kLv^3;PtQ@abKA86Tw&Z?eQmuMf8IxKPwb&Xr>&@k`v#Fw6>z5e@qZa>jt2r5au zb0wxGaY@+u#Mjd|7shLuWj9y@-sZeKs52D)cruXW5XTBW=Z44V0LA&;x5J6Zk9P|R z=$>X_VAgoB>L+!W_2Nl4rC#yAW#$(LP2?MmQay56YqWD+9iD|~P{{A+%Fo0zsy`-g z$7Eo|W_}xAz(s(RjxFZk`m*J{mFJV!C2`Mq;XcyQxlDG1r{QhUT6o@AP-G!#mFK-i zBa%=2cg}J6OFrSQd24Ozj9Rn^DlCo9R!Hn#E|+&QCVSD@3twU2Zz-pyouV{!@yi8bZY^jxpn8??+GAP_E?V*KygV z`%ZCn+2aKb2z1ePUl3@Kj~_P3u(QNHt@V;5F3|;bG|tMUcIJ#2=}9SZK_OLqft2D` zw}{ThoTpK^%R4P}*5++vp$~tov0m-ek1wQ7e4y8{S` zcy;75SnHHduw}Y#4vNV%k?p0@V@&dsGCUmFtRx^@|2e>rkIPL^{?!JBVLfVuX1`Vk zf9<9SX}8{&w@z27+N@E#?T=rak-VF|zbm1If>PfYKP3AmiLns=O_JdJos8($7LJc^ zMF&aWoceOQg5sP$_oqW@Pg{2d^=>dIJ(YKf-EW&$cMm_?+l5I!N4_IWIdddHTFWp+=%(m^T+Bf#J4Ov!?H~7*G|Rp7_;e}v2~w) zbI!V_9h^=1LTt1#)}=^iBJ?JK|16VHS5jBUy{xC=CscIwJ?>Q=*zhTwc$n)w)bwt+ z>f}Z)xud>ma2xd+eI^BSB%tI#XsW1T>0podppguZNimsGCcnX;!X;WV-sA_4!B^KkAB?3b z*v-~WP3^I`&7QLMqKa}|@7gBmB@P{C{RfKTL96+NlP3Mb&b?P7j4V!y%Su*UQO@zw zHMzf5QYw6_E6icPQrA3-QpYj@>2$r2sLkzj>Q?rdbG3ncs5i=q$|K7ns>t<-LQIAw zvQ9Fx#Y6^6y3xqa>~VBDRS*!foR~Q6nayG`?O-4vx0;eQ)@AT$XO5pL-3>zT!_WG2 znM#!p2!hv)_9r_`9*>I3CIh$h7{bFg@p})E;XN1{akaP5EWQ$J%VyQje)LM=9d~~v zxx+q>21aS0t%~hjB0Nk*65$nC>R~%^c26sDM>c1vYO}EA0}#tWFhx~pdu=hm)W-tV zJ!8*9zPE#x!&qzGt*vS4g6)NhKKaoHJEgO4^KZJn*i-XKjt&z&uzB1srZ7r!YtyF7Zy0@Xw# zj_dd-Y=exdd+F(<)0da0Ui0_UOI_roxSj56p;?w2_xkk;XupBb%zuI+l3%F+?~@lC*M2VPcqzjzv69pw2`94ji*A% z`I5LnvEDvO)I`kkSC?Hmd`5>K`Wq4T!8`fRQcCvD8Q+^t%@=J9sPhXhb17UxJyE#2 z=x>vn(#lLknRQS64D%VgfUqD^4sx2KxA#8bDcF=aAGjub-f!g(t;WVIMRxY6SXH!z z$;0(@JdM#X(lQ48x-RGTds#rLvQ$w-V$abJe#&~$XSMnU^(|@_V&-@0AO1@HGQOKq zuxFoBeqp=6;3|i0JMH1Ujj=U@@EcL#`-Li335tathYkH7^XD0Oot=iq{p@4F^#g3tuTw=g z6?E$d=2M1IDXX72-W(z7OHAucJ(V&-eW*TdR<1zcU~bKjW3k_2?6M`LjL=ESuAV+R zl0;{kugM2I)h^7IpF~^jtjeSEIrmQRK-LU5?J}ozvI&8)-SVQ_)db#ruOkQ8RjK;j zUf^Wq&@9rfo7Y&YnFnxf&K#97CtB9lq#1iW&4kO>)O@S+6LscldH85d{5@adTPkfg zd;4ElvL2@Phkg|P<6`AXd*T+=l!RX#tOs+aCXM!^t+wW+Sylcf9jC5 zk6u5Uuj*u#QcB7D=RFI(MbnD=@GW%RSl)^5EtwNHFO1wBka_~oi9tGjVYBt=L&?r_ z4|Sa%){?g$5@y$UVFE3Y9gCK+Y_}+zVoqFMq$xF(ep$xso|wP@?&-k*9+dt{+=;PQ zJnwWf`rVn(l`(8z9Zt_4&Bu2g{v?rC??rnd?;SshMUo-2OFxce3`?!~9-mk3&wCm6 z8r3(@@P%5`pDYRNc+=ics`m(7V?jkK?+8Asg5&=FJw)o#YC;IkCLhSkWl_fOT=7## zI#hc*F?s&%b!)uzr@4f;GPM1}EAK^iE%g!i3XZJp^1GykSz9=)%qS{MhGbXpZR{&o z2f=H618NQl^(>y$$%zsET*b;kj*i`gr75^l5?>&h(8%Nb1$_xlx=@Q zO4A=TW6fyBKay2$C`G(b%9UlHqo>?0J4i($hDSyOu7>H^CGadz(W(UFlD?L1eoaAh{%at5qSLcaT=9(}M|s_lJaddS9u?L^Ux<*tMm%$toOQ$|83XuV!fXfj?2 zbopr1uj!h$ThjO5p|*<_wFXCOELUqdT8YO9$t7C#_4SjXReb6$yY|s2KqT;#HO)3zu!)2ds0bntxrASy?REkZs77Ts0PIJ}bVt`cn94%8^&?)K@5lzv^bG5$t20 zZqRKRa<))fKsBdlb-4ES`<{&v`$}gz%bKxN3f*KBFVvldFP*Cp;EjxE!ZeP5Jw zszy@FLbz~l_OG^3P0Ob-zfgTSXM1bB<}IsW_EC#TTxw~_$Bi7|xNn=b5gnP0_+zv- z;YqfszPje%QyF@y9VKd^dJ0!2_Fu~}*73GF5zo(l;6fT%_PYB59=qLMKiqV+;RdVp z5yLalDH+al9GvsYS0+Sm*^I@`^&}fo`);W36EUBqOem&BPc(KqoVuiY_FR<$H?iJ) z`uNksUcyndQXZ!(CCJiZJ%?u%jhB|6Y86fkq9}4w53F z#~;&2mgMiAr|jy`ym|2?5sbqzzoB^fdPvupnrmKz7R_TkAe^%@dm8tO!pyQAF2&XN zU1>VXYvFOcLfS_SG(;W_dHYOKFM6%9oQ`-(e{G;$BaevqBl8C~iNwJPo{)8);7IKt z30xbM-5(yR-Zy(W)Wy?s#AbS@7Tj0W;;)>b>ZKhm2yU;MF`0F-yFBmdYqaR&N_ExI zc@~|c!_66cELeMS9q0P1PbhCKlSke53A@mTIp2cv@RdT%)0d@9bLLsP;+MLvs$CK| zu{!YNkp{y{eEm@BGtcVIKX|rUto10HvNXB8KZ z?&;ilix2f0mBjjI4Xg$7YP3e&&T!?J&+O89VKDP%56=hl9R#$yEjAm1oOP6Blx20T$&CEhvkw9K!WXA zt@CBBhPZ_RdZYA3$L*-OlIg;h`sc2d1phJhN(@)W?Pg;}IF@II^=TLB=kyvYD~Ytc z<+*$}Kb?2o6K*G9K&^3i(QKV;)3{-f#VBDklrp+)&HSh+(Me7>YEFMYGBL5cf{k*1 z)d8!Hqx6G^S?`Beq9soy88T(&zF4USX>_;H(SKz?) zH8p7u*?D7#d*dz%tpf#b#L%TSjeDyC0piQ$7M;da=w5=$sJx}ijB__v+(vxbn>&a<9rJ-k=C|7s80)M>58WgPK73SzB+ zrG4wD(WJa0u3{lm#z0wj!`pR7<{AwWJzcd4<|X|XZOB8@a{~Nk{Oyv~f;CvF!X`%K z#cIoYCEqaFB;Th{>g2<9TH_A5Ra7UH`bJwj*5PDU`D-E1Tk2jWqBB~?3(k5^r>oQ) zPyuo{F@nbJ?{P2i=u%b-5&53jIf*mlZ^~i;bKsM}REr|lT$_4TNrsM5cinblQrjtl zasu~`S#6f>5dBAm!D7YnngFl6E8?dz3>bP^6mNR3R7j!^*PGpKcu~pRz`6&O6U}xo zQQs)>&aH?l;)2S5@siTDc(70=JAQx$EW!1 zuih&3C_lQ&MCyOJZ>o*UI6BwnH_ zMUg{!!lH~O%;%1b-dJI>Hhgvabi&u<5IbD=^um-}WxLbeBrNmPE|Ieni|b#VAF9*V zb;eM={-M3ch>|#_U&nmPpOK0eFLpZh2+X-WVr>{D6)w^(A0pd1C8$&I z8lP`?z&}WKu4j_j2M-^KRr6I|W*a_jA~0*8q*Wk%Xk|UVeZ-`qmD)70wUdtS@d(c` zV%?^}+~DfGBRF1vIEOwn)!y{ocaUED7{9pm+B^GWZtliv)w9K$8cyeGe7c|apz+q^ z!^l=Dpfa9igl9qlW6N9h1;zw4v^@^*GXpRg%?7p|@g{hQhRlGvUkR!|b zAEzxA=cp{wG%Yu&v;%133z%D`L&MH&9239(b~SW0z1zgXF_A#{c7%EpD{AhxF~LBg z=c+IN17c3Tp=Ha-d40aO3VNrL8GMJUs87&(%D-3}Q?HJCBYn3F-C)4# zl|8CVKj(|;i3UCL1?z2E9gW3{%R1z!0?W4|wW`i)Z(HAt=t{g4)7+7z+#^CuTA6Eq zMXVCd*unqHDZo<#&JUYeN+LU@6$7k|V1v!_AUKU5Hc*`ubYbn%6Yq9I{>}FmM z+)>NVlpi|UAFaH(bFKbO3BX{61AFriI zy!ob-hZ1@d538v%-;ZhRQl(J0_{tic`e@p#g81dCM7|gRI^= zn^434lABiCgsZpGRSE!~{u|~K)*)W)e5rZSspoU~MMUl8m_*aT9TqwFc}$Km1(BWd=`T%~q`q~|9&$IqKw^l{7QG;;gy}jUgUOg>L+7O(3 zg(rc7N&3WB-ee`nB8)fG6;Wm3TW>2DA$op;)O;zl_3R(384J}uAI@=PKH&V)&%4%p z=E7!`=FVG<{_Xq@F%m41J1qG^z|bk_t_?FirS415JOkFQy;QM^x7;8(=Cst#_~;1I zX}sakfKQ3RY8hKF_Y>Yz;RGl1eCDKu1K+$MvkuKM=9VlC5Dvcl@!C9p!a<|s9%tS! zEK8^y-CTbicrtK-C5w4Tb-;vW{uYJlMYr8YYRaOt(SD8RpL~sn)Su>-hn%;s zxLlhVcjraHOseYG-V<-A2hHnt-z!K9?g^?dB4^xNuUj(og>dh)gXafp{T#jH1ANbw zD`x4Y>QH6m^Z50pvrqKoO^r=Qx{JxN2f^-!PhRG|kV+V=t$Fk$5{o&T{YVqG zS!ear0!Ga*L7Sg@4<@923Z*kGsO5`H!JY-E-L%s?6vS0m$iQ)l{j99Y+PY}I)BaqR zx;9(eMizPN5{nHEdWOo_;oCLhc}I%cXCJ?_E$}FrK>4#0L_BC0N?6X^FmPM9>RRemYoIvM`;y8fZ?(7e3m;95q`^z=;Un0A9g z9ek-f(V^+5g-;v|Nup1RRN8gLJv`U<4Y7v&+T2qb<=wD{Dthfq<((vvm%dfqh#q-q*llFa5TOvr@b~j zbnn&~=c7TS1Gt;IR+%QkW1TUi8|}d~Hh9-WE~D?-BRw>4n(sP#f9K=(TrC9h_b&NI zu}I>;)Uh1*{Mj>=FWB=VSjDOrDi#C|W(^8G=y5nWXU6&J`pVRZO|&(QCY4pvKFJ;q z0=BCQccHgF{dsrW%LR@CB@F_Uukxk@gvGSB+3|^J0 z3}j*Hh^W23Ls0z1Fs{_7`jaqrQ~So!jX$^n&+u5?Dtc5Fa zm$witw3DHLpNeYIkmHW&@}zS|$+X#lDxpt-cwa-wmzvHVO}%KonXvTiWp zuI3DZMei3f=eZp3^w=Mxvm8D7$!Yb-UV+WW5z;}PLb-%%j9s2pJB(Rr=+FbrTnj~k zpYOh59?~etV5y_&I!|(&-d{>UQ@huI!Zn1-ohO0Q$m~0952opJxpx%SQ6=#&rX-{u7uVx>)8FxHqnKwC7yTht=vM&`}1+>oIhOCU@R~6 z-><%~_jDl79+p?QBLa%2mDmq@mWNU&d@Sw$^yJZ1AL6#do9!$YLkIV?F3Hi1xNYo= zUkVg|OJW`MtbO?|bNroFR^fcZllSGR1jLYm`O=EQ;k1tQ{@*TJsJ2zmlywNK{uW~Uh^Q~u*+VeXe zL{BK*lhpEy>*WW;JbQ9Hi_mPgd2;h8QGf1` zhmmg*UdeeM36ndVB`NLPKR)6!^75>ey7uMQN8$p`lr6-W;t~ptxMmNq=i*WOOY^r1 zjT3U-c}dv&f+jgH#1SR!B^-BrA@78Nx6qNAD#X}o)Z=y2lf9mf)^y>=mO}b= zh)!u~+2_%#PH|`=9U&K2`P1mW220 z>Rd0Wg8AM3}eH`voerFPN%$B#dVFwd8g^~@X2%TAd#|&o?sQp z!*Sv9LyCCWJ4f#vEhLkS6?v@88%mhllNekh_zAqA+@ahix-n30e6)#-obYa5gx-Di z^-eCHY`kM@=RK|rkmO0mdC*qmtdm)fGFQsEduDnVi64%uK6gQIXMW>ucpwI??mD%H zJr%zW_XPE@Gz&3_H zN`CPQ@m^9o)_{u+ynJiC=M%F0S7J0osy-`|2%6g0M)VE(N}!xT5zo3;Ku^JCZgpuT z`Rx$jIJKXEd4|SaUHu4&W2uk$6*GkzNu6%{La*hA>ea>6CMONn50*PHSgFy7`_`#x zu#BXF_p|R}-Nly1zC6A8a!i%mDxZczI6f$5YS20&mU@wT;@S*MROvnn_H(@Su{Js5 z5^o~8JbRFbm_f@K+udRZKCf=BtIsmuE(s$?d-%TABXId}ZeqWHY+5qcM+GNBPv&=l zjb*$^uP!#0NJ#kSUsQ^@zB$`hc4e03pw=GJ{V!MbqgJYy&u&Iq=6UVwnY(e|*0tuQ z!>+aQ#!>cseuj{)DWhVS-NCvn&L^Y6(`q8k26Bpnk9N*>+CCX=oo`EtOfnylwN4fI z(8_0wyDvrcJ#TpJ?1ryl*im+Y((G7w-Tm1!Iz?&?SsJRB==puRR*uz-EVMh**&2J~ zH91J32ROWXW>3W>4cf+qj7`Q&=(4^L5wuKqwKnyoo=7(OQhoSc@k*6RyZQz}+_85R zBIOw>L}KEH`eH{#2gW8uN7;O<2OQ;8&+b{ZKlgn3Jc-El*9VrpN_(|bEj89`P8AUz ztgY5c;P!m-x?&Hx(Je{S(7UJRvUq}U^Z>4qZywsu3rzN&-PqjMwomwMJ~eIsk&x)g zL%4VM$uZ#_a;^<%eYW>zA4iV_ayU%9R9-i()^*Uwncc8HTk|0e0)myi*T=|gcABs?7m_LGa5SD__rJa@jJancY^s@M$`yuOs1tLiDD z)aIGmh)f(DV|v?%qw$b9Ml?DyJ%aVckTR{vg3R(YlSe~`HZS1XWugMFx)eNBw6W~i zn;7@y>gR{o+Ho0C8fth^=V$|nyDS!ZtK}(Z@~+5r5%5Kw4d{5XNle`^L6FE48gsHJ z@^Fj(x^(31oWY)zg@V(ky^p*R`#Qc+zdE1Uc#yO|SGgllygKjG+C{G>nZ0d9VlsZu z$|o1xEr}c!Cv@4K)>`(9;!nSvAZ1rOHf&_!Hb>nX@D8QTk?@N8#3XZAgzn?>jN|$} z7CLz(dw9t*Ocp&(AADo0#fXD{+MDUP@ezWTg)@zpuc_(1$-R;tgp@$L_g%U7d2)M< zt%SA3uX|ln)ty5x+~1+ZSyx@67DgRFvRN4 zWbJOX(Zpx#MoDUYJ}HE$sB(|P?|NU6J(b4!Y-P0L_8p%j%kWJhubqtv!fvmrHk9pv z+ws-b5Wg{8C|LE!+80}ywT2e6711*t*=Unant*ivwo51Hs-np*6>ue_&51gB9y+qJ zW`3FWTGVH&4in)?qm1RKE6>Mmb-#?$Zn2dA+1%P*D#5o7q~ z?uC;ayA&9B$vD+^Goc4&dtK?Rkn^(VbLGCCmOdI1=g`)4s9D8-A!*=gBo|eGu}zlo zLY>a#rRNQv_9{gO=J2n4Ob>WHoKkg``gRge<-qk9y2hM4Hx9E*++J1ZKMUC24UK)& z?#k3*W-u~5uoLY;jbe(wCeK-3QB7bBtzKj>Q9+R!OWS6f`pLr2dr3mas-jm4$9ltW z&=pac9sj~fY9Z==jVE-z=CpbBv$%#&UOR_WUL=&$!;$io1stpmyYAW#vVN3MbS`z^ zMDMfS6Q9pBn7weuFm<<>q*Nh=HdoZ?T`f;Vo0t4wvuMQgJfowKAh7&$B|f`gE=nzL zfY`OQc*Wzk>jZ~9hx}^C1oLcNKIP{OAuMesEqMcO6^U@{c{*AZJnOGVe z9F_h1B->>l@c4^nyddbVGdUFg4wy80lRYoWi0aG~hpKJP<} zxo_*Tm`$DpSfr{J>kH~wyj^+M+h;ICz<_fa=W5=@$wglCqM&TD18A1>;XM5m%FlND z-+NkAh7wJTUVmxYlmq#DpW$c2aJO%F9%W`%$5K(xyt%~$ck9tdi^}=UHs*6)1oV3% z-4t%6?*~b%CihZ5p4z=~Lc1aXpWVuCKt@f6@9Ytm=ute?GYzr|uDxrO3zuap@ulIi z9@weWU5Y19oOI^hL+9E9)DbLuGZo!##$WX=S9NOK9C2CBF1XEOMyvf1CrN_9HDF`- zc4I5qtipb!dE#^qmP)CrE40xeVf>11`llslWqe5#zK~DGi6+blb585}D*#{dAchUriqAXBZM`-6dNS*pnuE zHN~ibGGz5BJxch)i8nQ8@!cN=#0KU1p5fTv=icE|Rb>3!j6;Jaoi@(l`6r!H)0}MW zeV+URjP$Yn?=qwBoQpoGwQhFsy}lD+RUE@Gg+aLa#dkyHOdq@E#+8EFx`i^db?a$T zh|XyhT7LQL56C-#J^^{|!(&e@R#}5uf%7ojrmg37Ezt3KuXOy8?r+HZ$SS#kcdWW9 zESUgUUpZtxUKoAV{H|*%N-E#M-F#4Q;EBcS*2eu0h^=S&Z=KV6Ai8k|-`9e8Qk6qu z4{ov7%9)12=b={2kyq%he3tmiKXF#hc6 zY+1Rk?+HYpV#Zjir_^Rt^(S)c?;sRpsHcDNAh>h^;ZJ-Bd+gYh^DRfqK}~d%eB%ic zul_n^>YH${;1A+&R2R2nFNrOW;GcS|ld}Y$6{b8?N>67GnN6AR#7U}%r3+hV{x4Xe z7Qo-ltTNG>_!r%z4*2XpPh-rkx`O(WIrOCfT=n?ED=WGG&>p(`Y&9^Fq!fZ9h91}D z<(_u_clTy~y<-FG+V@i=!q{*Tb`FzNgw&WbB9w&vESXTwHK*3{uJS_mL=tT4ijzPI zn88&BF;(h9erBiH5(KE6QOo|dyNI-Qr_K>L90etUdP<-m#M1xs?o`F!{!qo)yPNKB z{RI5EGPnES@Pm#gG1X-hT=gDGTE0N=g0nHjML83GO~y#BzlZ4R@8E1*NotZEWWhfg zW24=B@lU<*n7>DWu6Q@wI-W!ZZi#q-uoWBsSkM2v^Un2ZtEznKg|o{{f_l|~`_x=L zKyA^f{jMSYy!&--+qaFLL5#^)AkzE7#8~WhliYgXP5$5hZIs$Jmsd9OiE&eyT~LvGO$%oiR|b!#>8%pTO)7&L^DV0iMyH-2tJ{;KltLNyTeNo41#G`x@&avHmU+n;u4Eoheh_ga+>18*q0#+(TROy7pm;#~!n{wMD1m z>H&u@{+`i{^#`=Q1zp9Ck)lFr5$r${W1xiL{Z>Ef|D&Py}PU3GD zHSz2lt^CJ}yLoY67p1n4)ZFDFD6qaQ%DSB$%otaab~3aBKISYxof+?&N6*17RF#7A zLVTgjgLu5|PGYN`N!g3JmJ`cB#6=`Y;M@g-KlVX<6DQ{`#kf~tc|ENpU;8bIO^=|C zM`{2J;f#MQ#KztG>M<1nKvAHKfK`j9hvS)#^YVfSQmJvRL20#HSfMv_cB8RG2U-L~ zFa)g-#evE`A5`oB8q1*O*;U!i7~$Tv0oj#*zvo z$9ar}L7Q`?S98|XDz+c&;eTG(#hj_Nzrfl49O@bnWmtv& zXhd)iY``~V**iZ%C=OH-vuD#XoP| zwHeK$ble0=LQ~6xb+H~^*|wH%zqyvV1!Y`YH|uRJltLp}tu_lqcw%1{pFQ3+&42_;N&NX)DDgoe%ea3La6NEcd{d@T z@bOFW&pQqA`LpQXv2pipApYuIIJ=$&^}*qs&^(d-6oPx`%|1Uh#z$GOnn-uwZPMW+ z)d)Hr_>R_EdSfeQ!p4{X>nC$_S+Q1e9lb+F7;X zDZ-ncWm$PGpRAk8nN^Jha(K3#0L5V+*Uhiv+SBTIVe27&_|k43-qDVzM}ZNJ*BDbE zJXA$ERMDg}@Y8;Tl;f@|id2^pTDFML<(FWOYsh^jp1L?Yo+t6@T{!zU^qTlS@=WTF zLhw5G^#%#O^L+|1COn6oU9S(=5vZQ3FKA5x#9pytg?|6CbLxBJBnNasj~=QDW*qxw z!0w)Q-gMH`w9f*!k#e#^Cy%u ze?mDs4o3L(nmznx<9_x>5)|1M@eCboovNHumwx@96U1QEl){eVyqS^Ipgz=vJ#!-A zk6ub}@tH_Ccb3-S^}QyeI9pedSa&yW=bqj@{KHB-pGTsiZUpVzjg*YzSTb2vFawXD zW08K>r;mH67_A4?{?YUE?1-ba*{EK@rYO*Nh15NfE)wct4ZO(kkaJ{RF2a5%!B2K= z;)gq4V`0%4K3+eSv#Xj?ON1OQYwE^?`R8*ca{a^5qBqj8F9fKt zEiRccuq3R35WM1IqJMe}N;61nwG6~PM0yA;SxETWtMD~8rq0jHmBu>a*gHsa;~z-wP@J9%40=MfRcFD0l{Y8NavN#K*#r&Be3F zvTQ~*>vwhX?dNy$z?*H9^lsbh+rAT15bYO>aDz-;H5&2kBLwcsKUtc z)f0FNig=EW3;U*qZ2bO!aiq-Efo}mC@lh14>a)eVt~T5}tFkf>6zJ&PMQC+hZrQ($ zpYD5uIiX^%YnZ`h<0exY$o`Os!-~LX8{XAe%B>Bh?CXf~lNWdMhxPl|lXOX{QY6Bp z(hy%idm;4F9nq4U&`1PoN<)10+=+aCNfVoPchQ}2s4fmNzN&E8PEVF_0i|F63W*P`A@;yZoGm*r zRi*gn&m*{G5vJ&ETavj7)s1zL+u{XXJMftx zVY`s-8l?t2xi zVorv^r12=ILthnK`jfd#@I1tbsjyYGR$-(C)b-vIKWFboZ`zldj88 z_ig1zd*5JDQ8|CxFq37qlL+Q4U;V^Hdk&J=^iay1-?Im-A}|Foz%y4BQddWMhJ zPT_AGXHgk08kDL=BNETS*|(nLYkwlS^F{EIsTt6OPZGgD3MY;xqrD2?on&hPq)rVs zV{Bs^pO-})cg3T?-$x99Dv@M@PS-hRRMW|X*ZYqV!vQDBcebzNd)r^-y%lwQrfD{_ z%g5sDjW#@K)Io3TnMOKDZheI0=7(|HcBIN|p}p(-lW^uxP_G9~#QJmu7WgYrJS2+~ z{4Cq}Y<2b6X-CI%p?)e&I_hDol00cfb$S$fPkk32JhYp84{Ya@!g8)_n88J3CsG_p z?Wp8W=0vVh@Lb%3TS;#CJ;@zUqe)VMLB`KXDfDkaL6gu=<);2*E>pauj>vrDOV zDfGSL%)uihTnAe{;@O;Weu8o&uE1EViFR`RYfn)5`t$tN*hze>emYIXgLnS?aG|jd zoNdpL*mw`_q1V9_0cPay-RBy&4NWHd{J79pnOYVN)UuXT83-HE?2EaLu3@vL>u`XP z*Yn*SuW>=eIR0(g88jAU>F^nDRB;b%B)Rc^lG~p_6J4o-8>WDfc|zk*kY>Wn ziO6Zd#?!uIcr&>K9zJvIutX7Id!!R*PzouYn8Z?5Nr(e?x9;Ncr|#m8Q!ij)W&Ln> z?YL1VPIB`DBsV>b+qSJY6VLRn@ka%}U#v>BdppRn4`%V1P_GYQzzC{UIq=LmgnWG$ zp%}Fd21ajv8rnUNzgn}BNOE9@K@1n#(@NxzpCR_lEw~-KdL4Qv{{DS#>05e2z7mw| z&tN>cUGpOV7ub=AasTeuhr278qb`w$zlPh{mRh6c*|BP){Dn~kFal742M_HUF>|N0 z{dwF&+fKf{`w_^f0vHhpJ!uZ}$R8AE`%{orzWOLb#i#-p0f;IyLPf*fjf~M`bkzAX zLKsy5BLGj}-8JJ!j!ap;QD5H(AqNV;CYtQ~#M#ktFmO`mAi_V^Ok!4f)&ZMCgkaY% zOl7i-k|ljhPc+$)Wm&Kk1|$3Xy;B+lL(+>L^D|YYAzX|->I^zAf(W)MKH%?bCvn4^ zrNiB&c>sVSvfoA}p7lJPW}9bdj>#O^2v96S z+;yn*hge?S#K-EUF|};y3Vr4bV-q^>t3>YqN~*S<@r{Q09ye(w&76po#BC9rtPaQ% zi|%CK)k^}FkAzr*a)Q)}fDIIg;Ce2LimJG_VH!)S$5Z4V;^Ve+j42*V!F#_);k%75uTR>3JIL@Vf-^MOBL^2|2y0RTR=uL{`yCH>mc-P z;`b+WnPPmh$MzgAt1AhHodtAH&0Wk%LKiH>b-jis})(3#= zcuCuJ^?)%Vn#D`#N%mF496~-n6~-p2Ns=e&doB_o>bVqIK9*NCa$UnrrkB^85VL${ z94_E#FqM-DRsJ)2+947fA3Un$S7EQ8;3OR+Z^sTGzP@Y!_a}3iAV$P-+=I4=>_$*@ z;NvlpICf_Q2-|*2jm2&^dy{1(Nrj44001BWNkl;sI|8MWiTHKfrOaDKmeONH_66XNH&}BZ8q2L zk^@L~NwSvq$R>d-IX2mxA0#0G;_wm30fB(A0h=S-*!aFJ%aUc?b9HyU-ybsq8!XL8 zGm=Ke&mWkdrn;-TyXvi~x88%usUIM6@_X?2JV$cfZwT5pWa9q4(FK8k6Gp=6zH%f6 z8goOaLPe$7wW{qQM>NR8vv4qJ+!~ofW zgcC|D2@dQz>LLe)=r?sy7M0cTshKD8&S?t@no9gtl)!q#QU?H`G+c{g!Xr@6Sd#7^ z5-BHi!n+6^|4xGa>q%|8AAi>qsMiNh^ys%KP>VBR+JMVN&nAfZz4=w4ij5}ryQES{ zt4;?>&G4ow#cGP4L@PC=GmcndVMR5L>QRv&5Hgl}C}kqNt!5gZn)4=3s+ocm^!d_~ zJy4&HzHMx2zk~hV&*Ir00K#r1Gpm+zV*TF{a`H$NS)g{N|M$?G_62wsA~^L6iPkSf zW9@j`){@%vJ8b7paH}#l1xMkkK$A$-+yQ^?Nwi`$#jxM8qBhWuAk~|6OWYtHQ`sAM zT0Pu5T8-0{Y^A2O;fS}WD=Ej5v|amn{#+4+2$o51n7^4ij}OmS$dvLzr|D7@h^G$H z+_jc%2k)diu@y%qqF9WilaKm=&$jkI)7JYE=g<2lA*ZZhEf`W;W3712cVj!&pjI&@ zlX2_ci!<>p;6y0Yn~~BQ!Y93h@Cg?awCy1E@*VhlpHI6SnDLqgcpwa>Y@j%hN>{QK ztMOO*!jKWvxUx5v*cf*|aoW@Vcb;9^9C&u&a6gvf(~}&)766!1T0uw*%J>riue=de z=9ZRo^~{rb-_&`Og-alxqmv_`C~dv#+1`E+E!|Jz+dhnxVWjE^;hz*m=}ETm?B4Hl z`iyHwUDpuof0WeA|Aq#yhVu?$9RvqHi4}Wy;4X86-Aip|PDCNUr-2APi#DaqRn%S~S&-xAnVtJAQ^c z`Fz}l%P|$RDa<>|=nA5hgid@9p%dPPZQn*})BSim)}pB{kbdK;@i*m&6GbLWWuSM} z+P5Aa# z#PI&fv-tR|lR16_9CB0xI^#Rp*8W>|cRoU(DFg?he-<0Uw@`=nzV%G2I;-IAJaT;& zZ|k?xCcOi>{i+2i0qfzn{0V>GA23x53C*|?r{*o-^gm}IbOi=8aULZT=TUO{Rd~Ce z#@qBq{I-`f>6pUf$Ol0&6Y2(x_piW#*b9h+7_N7X7!fZKYy#9x-&9@>g~WPE9hP^2 zAao@5W34x!W_s3y8vLI2q74+)zrUa8xO{Nx34CPcLZ+5iQn=lHdO&+YoR;qA*nHq; zbi}t~C_@R5JQAmf$bc@{BY_49g3k3Ixy(XJI`Kys+qISC3tvJ?YH+8%6L-qHkdpqr zZh_u&C`xGVIfUk(gYDXfzvB^7TOY)B?F6R^utjcqtT>a8AMjUeJvtKmkvx2C-H_N+ zz{>z`Bg>_nhj-c_zuW+cppWik8&%P%N8F2ER5_WS?%hPOnZh`vm-`K&FrS*akSnI2 zKxIiAh(qqm94C-~9|W-kV;56rpS(tBNgxqrmBZhPUgynOpddsmt05RfzK199w!}iLJ^rjxa`A})qVvr*@KUY8^x5LgpD=lxwq~g za3$E-9#R`_K(_oCXY#qY(=W%A&p5;!xIjYLjo>z%f!lBf>c#MPJdU@0HU9qf;Kjfl zL#HGg5IOn1V2->|7NEK3Ssa-(>?%aCp|IImw`pPrWMVh3TXv#Oczoqnkkf~IV@Jx^ z-TfeE@;68PRIYJ2zq+139o$Fn80^6+MM&C!b0$pUy1A#axNa7vK&z4dRYPC0jjio> zvZLccyda)Y>V;k@RcHi*YYa20FU+ZYD*iY<`!CNlAOJpG;g=IqNktG-Z! zUr{Uv`?j!l$8zr9cm-Py+=m~eGQQd)+i?`jjOt5?xY=iIwK4kIKACCKk-mXP;BBI> z#isM_ybE-GobzY@u|)gcn?djrZX1d<1{T8iKY>sMU-xD3s1X5F?ac{BM}bX$&S%`;y&srP5ZR!$lRb z*o`Y#W?)6&0G!BriOf5$Ta5jfT1tjLN*pGY&ZVyW$Qex?<1i;2<&KtZs1!a_s39%U ztST2*)$xl{mhhSRr%_)vp#h!6;`6 z)D+gyOwwW55QBtDa3&o`Xx@c{Pk0AT1j$L<&<9ZuQ-#B z%km7u=Jto#+VKQ3+-;YlVx&_w^5wlh{atL;D)f~afBoxa&feK=&j+5K$S~J+M#9Xg zp38fV``^LZz`s2A5I=3%M&EEM8GuR=`fR{uRrUPK{L?sf;_$SjuP6OsW2u8|Zu=EG zJ67S_Bx8M?shZ-P*F2kL1DsIE6lmsb) zgL??}uEpE^7`9_OHUKeYX^p;Gus&+ramr@nOj|(s#1G=s&dRxMzD?57(~{Tmu^16Q zW!J7-cj7Ap{MGY@Mlfr6M1+qGcQLD2I#b)|jPGM&*{mZs0w{4q{CLr&T>adixwCCI ziD7I99Kfh$QN<*_cHEf--{ZISZeU~UFWBGvB!&u<5{f0Txe_p^_U$1R$M(b>55m*Li( zhm?*+inYO3iNjk#KDp;+9@+hK^686W#J9;{!L{c-vZH^_J**|F$TuH9e+$Z-VON4s zUp}7?p8TVnujx$2`Q^@+xOLA)UP{Jr)Z&Z56~R*wl#m95oe*b~*Yep}Cv*OkIfohW z#QYh z&o&ZIejH@56Na%w(%y>VU?wcUt-BCs@)9IGfmg%fjs3Q6Fn;yo$7$)^oQW1OOoVOM zEM7J5&;|ElJzWI7aV;xh_yRytT6#AUOLb5h&TY9;6^Zf>3r^?n=bp-r?sm5IcJN|% zJFQ-l364vZ8|E!llbKmw&9sWDf-LhDB?yx2>3WRKZFkU}+=UP+>cJ0S>1BTH2XZQ# z?7asK_A|WBZAf#gO=Wng@`_}^0m9|*Y$RVKO2$1%O_7jpeeR>JjqFQ16ws6iLm1` zziKk`tLwP5zcq(FbRq2Y6+cL@tK(5Nw%tN3)ryhwj2muoE%jfEh)Zqs6e>#Ub11DO zy8f5p2h&Uvcu(OaUM5tMP1z{84eukh?mu|d55HLH?^C4&9a{<7zlgXsn96xL^~-Ro zPedYBnX<(p2)1=RNuViA9`9B}u;`y(`}fyRcQ*BqIN_8k!w#=vB*KRF`&d|a$&d%^ z;c@j|du@InB(N!V99+q!w%h1S?Z%M_h(rtGkvAFywv~Akzlda2XenOeMFQ^`82)Dj zLL|DsMX2N_SxdST&%%q;qNy0gxe7P}>VZ_Efu@DQfomXChf}!_r|vSGiKil=>{gZ| z+C-EM?f2z1_yI&TMUZ;vwSRw|0O&pYk^@ywuYQu0J)2=`b%eb=FA__2P!=9`sKJ6^ z)n`Zh18itrLEPVm5XMN^xEc76-ust^W>J^*+&@jC`zIVpz7Gv06}uZ7d;{YQ6r(PK zTY_7EF5a$t^Q?0$u<4^ZQw@PfaPV1z_O)OtaH>zinS373#KlOsf>$j7N25kj$IOi1iQvXO;jWN6S-5L9e!9I=>_^qU3_b|BGZ!Rckf@IGh$>p6nQ~w$y zmZg2gPUbnK1k@uq_%x}Pze)Vj_mOz|GkCjJpz(IF9wXzIaCl30bUa5gXvwP{5wM

+   | Event 1 (size 6)                              | Event 2
+   |       |       |       |       |       |       |       |       |
+   | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+   |FRAMES |SUBFRMS|TYPE   |SIZE   |DATADATADATAPAD|FRAMES |SUBFRMS|...
+   
+*/ +typedef struct { + uint32_t unit; /**< URID of unit of event time stamps. */ + uint32_t pad; /**< Currently unused. */ + /* Contents (a series of events) follow here. */ +} LV2_Atom_Sequence_Body; + +/** An atom:Sequence. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Sequence_Body body; /**< Body. */ +} LV2_Atom_Sequence; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_ATOM_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.meta.ttl new file mode 100644 index 00000000..9d714d80 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.meta.ttl @@ -0,0 +1,542 @@ +@prefix atom: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Atom" ; + doap:shortdesc "A generic value container and several data types." ; + doap:license ; + doap:created "2007-00-00" ; + doap:developer ; + doap:release [ + doap:revision "2.2" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2_atom_object_get_typed() for easy type-safe access to object properties." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Deprecate Blank and Resource in favour of just Object." + ] , [ + rdfs:label "Add lv2_atom_forge_is_object_type() and lv2_atom_forge_is_blank() to ease backwards compatibility." + ] , [ + rdfs:label "Add lv2_atom_forge_key() for terser object writing." + ] , [ + rdfs:label "Add lv2_atom_sequence_clear() and lv2_atom_sequence_append_event() helper functions." + ] + ] + ] , [ + doap:revision "1.8" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make lv2_atom_*_is_end() arguments const." + ] + ] + ] , [ + doap:revision "1.6" ; + doap:created "2013-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix crash in forge.h when pushing atoms to a full buffer." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2013-01-27" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix lv2_atom_sequence_end()." + ] , [ + rdfs:label "Remove atom:stringType in favour of owl:onDatatype so generic tools can understand and validate atom literals." + ] , [ + rdfs:label "Improve atom documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix implicit conversions in forge.h that are invalid in C++11." + ] , [ + rdfs:label "Fix lv2_atom_object_next() on 32-bit platforms." + ] , [ + rdfs:label "Add lv2_atom_object_body_get()." + ] , [ + rdfs:label "Fix outdated documentation in forge.h." + ] , [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add LV2_ATOM_CONTENTS_CONST and LV2_ATOM_BODY_CONST." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +An atom:Atom is a simple generic data container for holding any type of Plain +Old Data (POD). An Atom can contain simple primitive types like integers, +floating point numbers, and strings; as well as structured data like lists and +dictionary-like Objects. Since Atoms are POD, they can be easily copied +(for example, with `memcpy()`) anywhere and are suitable for use in real-time +code. + +Every atom starts with an LV2_Atom header, followed by the contents. This +allows code to process atoms without requiring special code for every type of +data. For example, plugins that mutually understand a type can be used +together in a host that does not understand that type, because the host is only +required to copy atoms, not interpret their contents. Similarly, plugins (such +as routers, delays, or data structures) can meaningfully process atoms of a +type unknown to them. + +Atoms should be used anywhere values of various types must be stored or +transmitted. An atom:AtomPort can be used to transmit atoms via ports. An +atom:AtomPort that contains a atom:Sequence can be used for sample accurate +communication of events, such as MIDI. + +### Serialisation + +Each Atom type defines a binary format for use at runtime, but also a +serialisation that is natural to express in Turtle format. Thus, this +specification defines a powerful real-time appropriate data model, as well as a +portable way to serialise any data in that model. This is particularly useful +for inter-process communication, saving/restoring state, and describing values +in plugin data files. + +### Custom Atom Types + +While it is possible to define new Atom types for any binary format, the +standard types defined here are powerful enough to describe almost anything. +Implementations SHOULD build structures out of the types provided here, rather +than define new binary formats (for example, using atom:Object rather than a +new C `struct` type). Host and tool implementations have support for +serialising all standard types, so new binary formats are an implementation +burden which harms interoperabilty. In particular, plugins SHOULD NOT expect +UI communication or state saving with custom binary types to work. In general, +new Atom types should only be defined where absolutely necessary due to +performance reasons and serialisation is not a concern. + +"""^^lv2:Markdown . + +atom:Atom + lv2:documentation """ + +An LV2_Atom has a 32-bit `size` and `type`, followed by a body of `size` bytes. +Atoms MUST be 64-bit aligned. + +All concrete Atom types (subclasses of this class) MUST define a precise binary +layout for their body. + +The `type` field is the URI of an Atom type mapped to an integer. +Implementations SHOULD gracefully pass through, or ignore, atoms with unknown +types. + +All atoms are POD by definition except references, which as a special case have +`type` 0. An Atom MUST NOT contain a Reference. It is safe to copy any +non-reference Atom with a simple `memcpy`, even if the implementation does not +understand `type`. Though this extension reserves the type 0 for references, +the details of reference handling are currently unspecified. A future revision +of this extension, or a different extension, may define how to use non-POD data +and references. Implementations MUST NOT send references to another +implementation unless the receiver is explicitly known to support references +(e.g. by supporting a feature). + +The special case of a null atom with both `type` and `size` 0 is not considered +a reference. + +"""^^lv2:Markdown . + +atom:Chunk + lv2:documentation """ + +This type is used to indicate a certain amount of space is available. For +example, output ports with a variably sized type are connected to a Chunk so +the plugin knows the size of the buffer available for writing. + +The use of a Chunk should be constrained to a local scope, since +interpreting it is impossible without context. However, if serialised to RDF, +a Chunk may be represented directly as an xsd:base64Binary string, for example: + + :::turtle + [] eg:someChunk "vu/erQ=="^^xsd:base64Binary . + +"""^^lv2:Markdown . + +atom:String + lv2:documentation """ + +The body of an LV2_Atom_String is a C string in UTF-8 encoding, i.e. an array +of bytes (`uint8_t`) terminated with a NULL byte (`'\\0'`). + +This type is for free-form strings, but SHOULD NOT be used for typed data or +text in any language. Use atom:Literal unless translating the string does not +make sense and the string has no meaningful datatype. + +"""^^lv2:Markdown . + +atom:Literal + lv2:documentation """ + +This type is compatible with rdfs:Literal and is capable of expressing a +string in any language or a value of any type. A Literal has a +`datatype` and `lang` followed by string data in UTF-8 +encoding. The length of the string data in bytes is `size - +sizeof(LV2_Atom_Literal)`, including the terminating NULL character. The +`lang` field SHOULD be a URI of the form +`http://lexvo.org/id/iso639-3/LANG` or +`http://lexvo.org/id/iso639-1/LANG` where LANG is a 3-character ISO 693-3 +language code, or a 2-character ISO 693-1 language code, respectively. + +A Literal may have a `datatype` or a `lang`, but never both. + +For example, a Literal can be Hello in English: + + :::c + void set_to_hello_in_english(LV2_Atom_Literal* lit) { + lit->atom.type = map(expand("atom:Literal")); + lit->atom.size = 14; + lit->body.datatype = 0; + lit->body.lang = map("http://lexvo.org/id/iso639-1/en"); + memcpy(LV2_ATOM_CONTENTS(LV2_Atom_Literal, lit), + "Hello", + sizeof("Hello")); // Assumes enough space + } + +or a Turtle string: + + :::c + void set_to_turtle_string(LV2_Atom_Literal* lit, const char* ttl) { + lit->atom.type = map(expand("atom:Literal")); + lit->atom.size = 64; + lit->body.datatype = map("http://www.w3.org/2008/turtle#turtle"); + lit->body.lang = 0; + memcpy(LV2_ATOM_CONTENTS(LV2_Atom_Literal, lit), + ttl, + strlen(ttl) + 1); // Assumes enough space + } + +"""^^lv2:Markdown . + +atom:Path + lv2:documentation """ + +A Path is a URI reference with only a path component: no scheme, authority, +query, or fragment. In particular, paths to files in the same bundle may be +cleanly written in Turtle files as a relative URI. However, implementations +may assume any binary Path (e.g. in an event payload) is a valid file path +which can passed to system functions like fopen() directly, without any +character encoding or escape expansion required. + +Any implemenation that creates a Path atom to transmit to another is +responsible for ensuring it is valid. A Path SHOULD always be absolute, unless +there is some mechanism in place that defines a base path. Since this is not +the case for plugin instances, effectively any Path sent to or received from a +plugin instance MUST be absolute. + +"""^^lv2:Markdown . + +atom:URI + lv2:documentation """ + +This is useful when a URI is needed but mapping is inappropriate, for example +with temporary or relative URIs. Since the ability to distinguish URIs from +plain strings is often necessary, URIs MUST NOT be transmitted as atom:String. + +This is not strictly a URI, since UTF-8 is allowed. Escaping and related +issues are the host's responsibility. + +"""^^lv2:Markdown . + +atom:URID + lv2:documentation """ + +A URID is typically generated with the LV2_URID_Map provided by the host . + +"""^^lv2:Markdown . + +atom:Vector + lv2:documentation """ + +A homogeneous series of atom bodies with equivalent type and size. + +An LV2_Atom_Vector is a 32-bit `child_size` and `child_type` followed by `size +/ child_size` atom bodies. + +For example, an atom:Vector containing 42 elements of type atom:Float: + + :::c + struct VectorOf42Floats { + uint32_t size; // sizeof(LV2_Atom_Vector_Body) + (42 * sizeof(float); + uint32_t type; // map(expand("atom:Vector")) + uint32_t child_size; // sizeof(float) + uint32_t child_type; // map(expand("atom:Float")) + float elems[42]; + }; + +Note that it is possible to construct a valid Atom for each element of the +vector, even by an implementation which does not understand `child_type`. + +If serialised to RDF, a Vector SHOULD have the form: + + :::turtle + eg:someVector + a atom:Vector ; + atom:childType atom:Int ; + rdf:value ( + "1"^^xsd:int + "2"^^xsd:int + "3"^^xsd:int + "4"^^xsd:int + ) . + +"""^^lv2:Markdown . + +atom:Tuple + lv2:documentation """ + +The body of a Tuple is simply a series of complete atoms, each aligned to +64 bits. + +If serialised to RDF, a Tuple SHOULD have the form: + + :::turtle + eg:someVector + a atom:Tuple ; + rdf:value ( + "1"^^xsd:int + "3.5"^^xsd:float + "etc" + ) . + +"""^^lv2:Markdown . + +atom:Property + lv2:documentation """ + +An LV2_Atom_Property has a URID `key` and `context`, and an Atom `value`. This +corresponds to an RDF Property, where the key is the predicate +and the value is the object. + +The `context` field can be used to specify a different context for each +property, where this is useful. Otherwise, it may be 0. + +Properties generally only exist as part of an atom:Object. Accordingly, +they will typically be represented directly as properties in RDF (see +atom:Object). If this is not possible, they may be expressed as partial +reified statements, for example: + + :::turtle + eg:someProperty + rdf:predicate eg:theKey ; + rdf:object eg:theValue . + +"""^^lv2:Markdown . + +atom:Object + lv2:documentation """ + +An Object is an atom with a set of properties. This corresponds to an +RDF Resource, and can be thought of as a dictionary with URID keys. + +An LV2_Atom_Object body has a uint32_t `id` and `type`, followed by a series of +atom:Property bodies (LV2_Atom_Property_Body). The LV2_Atom_Object_Body::otype +field is equivalent to a property with key rdf:type, but is included in the +structure to allow for fast dispatching. + +Code SHOULD check for objects using lv2_atom_forge_is_object() or +lv2_atom_forge_is_blank() if a forge is available, rather than checking the +atom type directly. This will correctly handle the deprecated atom:Resource +and atom:Blank types. + +When serialised to RDF, an Object is represented as a resource, for example: + + :::turtle + eg:someObject + eg:firstPropertyKey "first property value" ; + eg:secondPropertyKey "first loser" ; + eg:andSoOn "and so on" . + +"""^^lv2:Markdown . + +atom:Resource + lv2:documentation """ + +This class is deprecated. Use atom:Object directly instead. + +An atom:Object where the id field is a URID, that is, an Object +with a URI. + +"""^^lv2:Markdown . + +atom:Blank + lv2:documentation """ + +This class is deprecated. Use atom:Object with ID 0 instead. + +An atom:Object where the LV2_Atom_Object::id is a blank node ID (NOT a URI). +The ID of a Blank is valid only within the context the Blank appears in. For +ports this is the context of the associated run() call, i.e. all ports share +the same context so outputs can contain IDs that correspond to IDs of blanks in +the input. + +"""^^lv2:Markdown . + +atom:Sound + lv2:documentation """ + +The format of a atom:Sound is the same as the buffer format for lv2:AudioPort +(except the size may be arbitrary). An atom:Sound inherently depends on the +sample rate, which is assumed to be known from context. Because of this, +directly serialising an atom:Sound is probably a bad idea, use a standard +format like WAV instead. + +"""^^lv2:Markdown . + +atom:Event + lv2:documentation """ + +An Event is typically an element of an atom:Sequence. Note that this is not an Atom type since it begins with a timestamp, not an atom header. + +"""^^lv2:Markdown . + +atom:Sequence + lv2:documentation """ + +A flat sequence of atom:Event, that is, a series of time-stamped Atoms. + +LV2_Atom_Sequence_Body.unit describes the time unit for the contained atoms. +If the unit is known from context (e.g. run() stamps are always audio frames), +this field may be zero. Otherwise, it SHOULD be either units:frame or +units:beat, in which case ev.time.frames or ev.time.beats is valid, +respectively. + +If serialised to RDF, a Sequence has a similar form to atom:Vector, but for +brevity the elements may be assumed to be atom:Event, for example: + + :::turtle + eg:someSequence + a atom:Sequence ; + rdf:value ( + [ + atom:frameTime 1 ; + rdf:value "901A01"^^midi:MidiEvent + ] [ + atom:frameTime 3 ; + rdf:value "902B02"^^midi:MidiEvent + ] + ) . + +"""^^lv2:Markdown . + +atom:AtomPort + lv2:documentation """ + +Ports of this type are connected to an LV2_Atom with a type specified by +atom:bufferType. + +Output ports with a variably sized type MUST be initialised by the host before +every run() to an atom:Chunk with size set to the available space. The plugin +reads this size to know how much space is available for writing. In all cases, +the plugin MUST write a complete atom (including header) to outputs. However, +to be robust, hosts SHOULD initialise output ports to a safe sentinel (e.g. the +null Atom) before calling run(). + +"""^^lv2:Markdown . + +atom:bufferType + lv2:documentation """ + +Indicates that an AtomPort may be connected to a certain Atom type. A port MAY +support several buffer types. The host MUST NOT connect a port to an Atom with +a type not explicitly listed with this property. The value of this property +MUST be a sub-class of atom:Atom. For example, an input port that is connected +directly to an LV2_Atom_Double value is described like so: + + :::turtle + + lv2:port [ + a lv2:InputPort , atom:AtomPort ; + atom:bufferType atom:Double ; + ] . + +This property only describes the types a port may be directly connected to. It +says nothing about the expected contents of containers. For that, use +atom:supports. + +"""^^lv2:Markdown . + +atom:supports + lv2:documentation """ + +This property is defined loosely, it may be used to indicate that anything +supports an Atom type, wherever that may be useful. It applies +recursively where collections are involved. + +In particular, this property can be used to describe which event types are +expected by a port. For example, a port that receives MIDI events is described +like so: + + :::turtle + + lv2:port [ + a lv2:InputPort , atom:AtomPort ; + atom:bufferType atom:Sequence ; + atom:supports midi:MidiEvent ; + ] . + +"""^^lv2:Markdown . + +atom:eventTransfer + lv2:documentation """ + +Transfer of individual events in a port buffer. Useful as the `format` for a +LV2UI_Write_Function. + +This protocol applies to ports which contain events, usually in an +atom:Sequence. The host must transfer each individual event to the recipient. +The format of the received data is an LV2_Atom, there is no timestamp header. + +"""^^lv2:Markdown . + +atom:atomTransfer + lv2:documentation """ + +Transfer of the complete atom in a port buffer. Useful as the `format` for a +LV2UI_Write_Function. + +This protocol applies to atom ports. The host must transfer the complete atom +contained in the port, including header. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.ttl new file mode 100644 index 00000000..ddfb430d --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.ttl @@ -0,0 +1,247 @@ +@prefix atom: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix ui: . +@prefix units: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:seeAlso , + , + , + ; + rdfs:label "LV2 Atom" ; + rdfs:comment "A generic value container and several data types." . + +atom:cType + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "C type" ; + rdfs:comment "The C type that describes the binary representation of an Atom type." ; + rdfs:domain rdfs:Class ; + rdfs:range lv2:Symbol . + +atom:Atom + a rdfs:Class ; + rdfs:label "Atom" ; + rdfs:comment "Abstract base class for all atoms." ; + atom:cType "LV2_Atom" . + +atom:Chunk + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Chunk" ; + rdfs:comment "A chunk of memory with undefined contents." ; + owl:onDatatype xsd:base64Binary . + +atom:Number + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Number" ; + rdfs:comment "Base class for numeric types." . + +atom:Int + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Int" ; + rdfs:comment "A native `int32_t`." ; + atom:cType "LV2_Atom_Int" ; + owl:onDatatype xsd:int . + +atom:Long + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Long" ; + rdfs:comment "A native `int64_t`." ; + atom:cType "LV2_Atom_Long" ; + owl:onDatatype xsd:long . + +atom:Float + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Float" ; + rdfs:comment "A native `float`." ; + atom:cType "LV2_Atom_Float" ; + owl:onDatatype xsd:float . + +atom:Double + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Double" ; + rdfs:comment "A native `double`." ; + atom:cType "LV2_Atom_Double" ; + owl:onDatatype xsd:double . + +atom:Bool + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Bool" ; + rdfs:comment "An atom:Int where 0 is false and any other value is true." ; + atom:cType "LV2_Atom_Bool" ; + owl:onDatatype xsd:boolean . + +atom:String + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Atom ; + rdfs:label "String" ; + rdfs:comment "A UTF-8 string." ; + atom:cType "LV2_Atom_String" ; + owl:onDatatype xsd:string . + +atom:Literal + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Literal" ; + rdfs:comment "A UTF-8 string literal with optional datatype or language." ; + atom:cType "LV2_Atom_Literal" . + +atom:Path + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:URI ; + owl:onDatatype atom:URI ; + rdfs:label "Path" ; + rdfs:comment "A local file path." . + +atom:URI + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:String ; + owl:onDatatype xsd:anyURI ; + rdfs:label "URI" ; + rdfs:comment "A URI string." . + +atom:URID + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "URID" ; + rdfs:comment "An unsigned 32-bit integer ID for a URI." ; + atom:cType "LV2_Atom_URID" . + +atom:Vector + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Vector" ; + rdfs:comment "A homogeneous sequence of atom bodies with equivalent type and size." ; + atom:cType "LV2_Atom_Vector" . + +atom:Tuple + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Tuple" ; + rdfs:comment "A sequence of atoms with varying type and size." . + +atom:Property + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Property" ; + rdfs:comment "A property of an atom:Object." ; + atom:cType "LV2_Atom_Property" . + +atom:Object + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Object" ; + rdfs:comment "A collection of properties." ; + atom:cType "LV2_Atom_Object" . + +atom:Resource + a rdfs:Class ; + rdfs:subClassOf atom:Object ; + rdfs:label "Resource" ; + rdfs:comment "A named collection of properties with a URI." ; + owl:deprecated "true"^^xsd:boolean ; + atom:cType "LV2_Atom_Object" . + +atom:Blank + a rdfs:Class ; + rdfs:subClassOf atom:Object ; + rdfs:label "Blank" ; + rdfs:comment "An anonymous collection of properties without a URI." ; + owl:deprecated "true"^^xsd:boolean ; + atom:cType "LV2_Atom_Object" . + +atom:Sound + a rdfs:Class ; + rdfs:subClassOf atom:Vector ; + rdfs:label "Sound" ; + rdfs:comment "A atom:Vector of atom:Float which represents an audio waveform." ; + atom:cType "LV2_Atom_Vector" . + +atom:frameTime + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:range xsd:decimal ; + rdfs:label "frame time" ; + rdfs:comment "A time stamp in audio frames." . + +atom:beatTime + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:range xsd:decimal ; + rdfs:label "beat time" ; + rdfs:comment "A time stamp in beats." . + +atom:Event + a rdfs:Class ; + rdfs:label "Event" ; + atom:cType "LV2_Atom_Event" ; + rdfs:comment "An atom with a time stamp prefix in a sequence." . + +atom:Sequence + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Sequence" ; + atom:cType "LV2_Atom_Sequence" ; + rdfs:comment "A sequence of events." . + +atom:AtomPort + a rdfs:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Atom Port" ; + rdfs:comment "A port which contains an atom:Atom." . + +atom:bufferType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain atom:AtomPort ; + rdfs:range rdfs:Class ; + rdfs:label "buffer type" ; + rdfs:comment "An atom type that a port may be connected to." . + +atom:childType + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "child type" ; + rdfs:comment "The type of children in a container." . + +atom:supports + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "supports" ; + rdfs:comment "A supported atom type." ; + rdfs:range rdfs:Class . + +atom:eventTransfer + a ui:PortProtocol ; + rdfs:label "event transfer" ; + rdfs:comment "A port protocol for transferring events." . + +atom:atomTransfer + a ui:PortProtocol ; + rdfs:label "atom transfer" ; + rdfs:comment "A port protocol for transferring atoms." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c new file mode 100644 index 00000000..57414539 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge-overflow-test.c @@ -0,0 +1,235 @@ +/* + Copyright 2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lv2/atom/atom-test-utils.c" +#include "lv2/atom/atom.h" +#include "lv2/atom/forge.h" +#include "lv2/urid/urid.h" + +#include +#include +#include + +static int +test_string_overflow(void) +{ +#define MAX_CHARS 15 + + static const size_t capacity = sizeof(LV2_Atom_String) + MAX_CHARS + 1; + static const char* str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + uint8_t* buf = (uint8_t*)malloc(capacity); + LV2_URID_Map map = {NULL, urid_map}; + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + + // Check that writing increasingly long strings fails at the right point + for (size_t count = 0; count < MAX_CHARS; ++count) { + lv2_atom_forge_set_buffer(&forge, buf, capacity); + + const LV2_Atom_Forge_Ref ref = lv2_atom_forge_string(&forge, str, count); + if (!ref) { + return test_fail("Failed to write %zu byte string\n", count); + } + } + + // Failure writing to an exactly full forge + if (lv2_atom_forge_string(&forge, str, MAX_CHARS + 1)) { + return test_fail("Successfully wrote past end of buffer\n"); + } + + // Failure writing body after successfully writing header + lv2_atom_forge_set_buffer(&forge, buf, sizeof(LV2_Atom) + 1); + if (lv2_atom_forge_string(&forge, "AB", 2)) { + return test_fail("Successfully wrote atom header past end\n"); + } + + free(buf); + return 0; +} + +static int +test_literal_overflow(void) +{ + static const size_t capacity = sizeof(LV2_Atom_Literal) + 2; + + uint8_t* buf = (uint8_t*)malloc(capacity); + LV2_URID_Map map = {NULL, urid_map}; + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + + // Failure in atom header + lv2_atom_forge_set_buffer(&forge, buf, 1); + if (lv2_atom_forge_literal(&forge, "A", 1, 0, 0)) { + return test_fail("Successfully wrote atom header past end\n"); + } + + // Failure in literal header + lv2_atom_forge_set_buffer(&forge, buf, sizeof(LV2_Atom) + 1); + if (lv2_atom_forge_literal(&forge, "A", 1, 0, 0)) { + return test_fail("Successfully wrote literal header past end\n"); + } + + // Success (only room for one character + null terminator) + lv2_atom_forge_set_buffer(&forge, buf, capacity); + if (!lv2_atom_forge_literal(&forge, "A", 1, 0, 0)) { + return test_fail("Failed to write small enough literal\n"); + } + + // Failure in body + lv2_atom_forge_set_buffer(&forge, buf, capacity); + if (lv2_atom_forge_literal(&forge, "AB", 2, 0, 0)) { + return test_fail("Successfully wrote literal body past end\n"); + } + + free(buf); + return 0; +} + +static int +test_sequence_overflow(void) +{ + static const size_t size = sizeof(LV2_Atom_Sequence) + 6 * sizeof(LV2_Atom); + LV2_URID_Map map = {NULL, urid_map}; + + // Test over a range that fails in the sequence header and event components + for (size_t capacity = 1; capacity < size; ++capacity) { + uint8_t* buf = (uint8_t*)malloc(capacity); + + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + lv2_atom_forge_set_buffer(&forge, buf, capacity); + + LV2_Atom_Forge_Frame frame; + LV2_Atom_Forge_Ref ref = lv2_atom_forge_sequence_head(&forge, &frame, 0); + + assert(capacity >= sizeof(LV2_Atom_Sequence) || !frame.ref); + assert(capacity >= sizeof(LV2_Atom_Sequence) || !ref); + (void)ref; + + lv2_atom_forge_frame_time(&forge, 0); + lv2_atom_forge_int(&forge, 42); + lv2_atom_forge_pop(&forge, &frame); + + free(buf); + } + + return 0; +} + +static int +test_vector_head_overflow(void) +{ + static const size_t size = sizeof(LV2_Atom_Vector) + 3 * sizeof(LV2_Atom); + LV2_URID_Map map = {NULL, urid_map}; + + // Test over a range that fails in the vector header and elements + for (size_t capacity = 1; capacity < size; ++capacity) { + uint8_t* buf = (uint8_t*)malloc(capacity); + + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + lv2_atom_forge_set_buffer(&forge, buf, capacity); + + LV2_Atom_Forge_Frame frame; + LV2_Atom_Forge_Ref ref = + lv2_atom_forge_vector_head(&forge, &frame, sizeof(int32_t), forge.Int); + + assert(capacity >= sizeof(LV2_Atom_Vector) || !frame.ref); + assert(capacity >= sizeof(LV2_Atom_Vector) || !ref); + (void)ref; + + lv2_atom_forge_int(&forge, 1); + lv2_atom_forge_int(&forge, 2); + lv2_atom_forge_int(&forge, 3); + lv2_atom_forge_pop(&forge, &frame); + + free(buf); + } + + return 0; +} + +static int +test_vector_overflow(void) +{ + static const size_t size = sizeof(LV2_Atom_Vector) + 3 * sizeof(LV2_Atom); + static const int32_t vec[] = {1, 2, 3}; + LV2_URID_Map map = {NULL, urid_map}; + + // Test over a range that fails in the vector header and elements + for (size_t capacity = 1; capacity < size; ++capacity) { + uint8_t* buf = (uint8_t*)malloc(capacity); + + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + lv2_atom_forge_set_buffer(&forge, buf, capacity); + + LV2_Atom_Forge_Ref ref = + lv2_atom_forge_vector(&forge, sizeof(int32_t), forge.Int, 3, vec); + + assert(capacity >= sizeof(LV2_Atom_Vector) || !ref); + (void)ref; + + free(buf); + } + + return 0; +} + +static int +test_tuple_overflow(void) +{ + static const size_t size = sizeof(LV2_Atom_Tuple) + 3 * sizeof(LV2_Atom); + LV2_URID_Map map = {NULL, urid_map}; + + // Test over a range that fails in the tuple header and elements + for (size_t capacity = 1; capacity < size; ++capacity) { + uint8_t* buf = (uint8_t*)malloc(capacity); + + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + lv2_atom_forge_set_buffer(&forge, buf, capacity); + + LV2_Atom_Forge_Frame frame; + LV2_Atom_Forge_Ref ref = lv2_atom_forge_tuple(&forge, &frame); + + assert(capacity >= sizeof(LV2_Atom_Tuple) || !frame.ref); + assert(capacity >= sizeof(LV2_Atom_Tuple) || !ref); + (void)ref; + + lv2_atom_forge_int(&forge, 1); + lv2_atom_forge_float(&forge, 2.0f); + lv2_atom_forge_string(&forge, "three", 5); + lv2_atom_forge_pop(&forge, &frame); + + free(buf); + } + + return 0; +} + +int +main(void) +{ + const int ret = test_string_overflow() || test_literal_overflow() || + test_sequence_overflow() || test_vector_head_overflow() || + test_vector_overflow() || test_tuple_overflow(); + + free_urid_map(); + + return ret; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h new file mode 100644 index 00000000..714df7e5 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/forge.h @@ -0,0 +1,683 @@ +/* + Copyright 2008-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file forge.h An API for constructing LV2 atoms. + + This file provides an API for constructing Atoms which makes it relatively + simple to build nested atoms of arbitrary complexity without requiring + dynamic memory allocation. + + The API is based on successively appending the appropriate pieces to build a + complete Atom. The size of containers is automatically updated. Functions + that begin a container return (via their frame argument) a stack frame which + must be popped when the container is finished. + + All output is written to a user-provided buffer or sink function. This + makes it popssible to create create atoms on the stack, on the heap, in LV2 + port buffers, in a ringbuffer, or elsewhere, all using the same API. + + This entire API is realtime safe if used with a buffer or a realtime safe + sink, except lv2_atom_forge_init() which is only realtime safe if the URI + map function is. + + Note these functions are all static inline, do not take their address. + + This header is non-normative, it is provided for convenience. +*/ + +#ifndef LV2_ATOM_FORGE_H +#define LV2_ATOM_FORGE_H + +/** + @defgroup forge Forge + @ingroup atom + + An API for constructing LV2 atoms. + + @{ +*/ + +#include "lv2/atom/atom.h" +#include "lv2/atom/util.h" +#include "lv2/core/attributes.h" +#include "lv2/urid/urid.h" + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Disable deprecation warnings for Blank and Resource +LV2_DISABLE_DEPRECATION_WARNINGS + +/** Handle for LV2_Atom_Forge_Sink. */ +typedef void* LV2_Atom_Forge_Sink_Handle; + +/** A reference to a chunk of written output. */ +typedef intptr_t LV2_Atom_Forge_Ref; + +/** Sink function for writing output. See lv2_atom_forge_set_sink(). */ +typedef LV2_Atom_Forge_Ref (*LV2_Atom_Forge_Sink)( + LV2_Atom_Forge_Sink_Handle handle, + const void* buf, + uint32_t size); + +/** Function for resolving a reference. See lv2_atom_forge_set_sink(). */ +typedef LV2_Atom* (*LV2_Atom_Forge_Deref_Func)( + LV2_Atom_Forge_Sink_Handle handle, + LV2_Atom_Forge_Ref ref); + +/** A stack frame used for keeping track of nested Atom containers. */ +typedef struct LV2_Atom_Forge_Frame { + struct LV2_Atom_Forge_Frame* parent; + LV2_Atom_Forge_Ref ref; +} LV2_Atom_Forge_Frame; + +/** A "forge" for creating atoms by appending to a buffer. */ +typedef struct { + uint8_t* buf; + uint32_t offset; + uint32_t size; + + LV2_Atom_Forge_Sink sink; + LV2_Atom_Forge_Deref_Func deref; + LV2_Atom_Forge_Sink_Handle handle; + + LV2_Atom_Forge_Frame* stack; + + LV2_URID Blank LV2_DEPRECATED; + LV2_URID Bool; + LV2_URID Chunk; + LV2_URID Double; + LV2_URID Float; + LV2_URID Int; + LV2_URID Long; + LV2_URID Literal; + LV2_URID Object; + LV2_URID Path; + LV2_URID Property; + LV2_URID Resource LV2_DEPRECATED; + LV2_URID Sequence; + LV2_URID String; + LV2_URID Tuple; + LV2_URID URI; + LV2_URID URID; + LV2_URID Vector; +} LV2_Atom_Forge; + +static inline void +lv2_atom_forge_set_buffer(LV2_Atom_Forge* forge, uint8_t* buf, size_t size); + +/** + Initialise `forge`. + + URIs will be mapped using `map` and stored, a reference to `map` itself is + not held. +*/ +static inline void +lv2_atom_forge_init(LV2_Atom_Forge* forge, LV2_URID_Map* map) +{ + lv2_atom_forge_set_buffer(forge, NULL, 0); + forge->Blank = map->map(map->handle, LV2_ATOM__Blank); + forge->Bool = map->map(map->handle, LV2_ATOM__Bool); + forge->Chunk = map->map(map->handle, LV2_ATOM__Chunk); + forge->Double = map->map(map->handle, LV2_ATOM__Double); + forge->Float = map->map(map->handle, LV2_ATOM__Float); + forge->Int = map->map(map->handle, LV2_ATOM__Int); + forge->Long = map->map(map->handle, LV2_ATOM__Long); + forge->Literal = map->map(map->handle, LV2_ATOM__Literal); + forge->Object = map->map(map->handle, LV2_ATOM__Object); + forge->Path = map->map(map->handle, LV2_ATOM__Path); + forge->Property = map->map(map->handle, LV2_ATOM__Property); + forge->Resource = map->map(map->handle, LV2_ATOM__Resource); + forge->Sequence = map->map(map->handle, LV2_ATOM__Sequence); + forge->String = map->map(map->handle, LV2_ATOM__String); + forge->Tuple = map->map(map->handle, LV2_ATOM__Tuple); + forge->URI = map->map(map->handle, LV2_ATOM__URI); + forge->URID = map->map(map->handle, LV2_ATOM__URID); + forge->Vector = map->map(map->handle, LV2_ATOM__Vector); +} + +/** Access the Atom pointed to by a reference. */ +static inline LV2_Atom* +lv2_atom_forge_deref(LV2_Atom_Forge* forge, LV2_Atom_Forge_Ref ref) +{ + return forge->buf ? (LV2_Atom*)ref : forge->deref(forge->handle, ref); +} + +/** + @name Object Stack + @{ +*/ + +/** + Push a stack frame. + This is done automatically by container functions (which take a stack frame + pointer), but may be called by the user to push the top level container when + writing to an existing Atom. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_push(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + LV2_Atom_Forge_Ref ref) +{ + frame->parent = forge->stack; + frame->ref = ref; + + if (ref) { + forge->stack = frame; // Don't push, so walking the stack is always safe + } + + return ref; +} + +/** Pop a stack frame. This must be called when a container is finished. */ +static inline void +lv2_atom_forge_pop(LV2_Atom_Forge* forge, LV2_Atom_Forge_Frame* frame) +{ + if (frame->ref) { + // If frame has a valid ref, it must be the top of the stack + assert(frame == forge->stack); + forge->stack = frame->parent; + } + // Otherwise, frame was not pushed because of overflow, do nothing +} + +/** Return true iff the top of the stack has the given type. */ +static inline bool +lv2_atom_forge_top_is(LV2_Atom_Forge* forge, uint32_t type) +{ + return forge->stack && forge->stack->ref && + (lv2_atom_forge_deref(forge, forge->stack->ref)->type == type); +} + +/** Return true iff `type` is an atom:Object. */ +static inline bool +lv2_atom_forge_is_object_type(const LV2_Atom_Forge* forge, uint32_t type) +{ + return (type == forge->Object || type == forge->Blank || + type == forge->Resource); +} + +/** Return true iff `type` is an atom:Object with a blank ID. */ +static inline bool +lv2_atom_forge_is_blank(const LV2_Atom_Forge* forge, + uint32_t type, + const LV2_Atom_Object_Body* body) +{ + return (type == forge->Blank || (type == forge->Object && body->id == 0)); +} + +/** + @} + @name Output Configuration + @{ +*/ + +/** Set the output buffer where `forge` will write atoms. */ +static inline void +lv2_atom_forge_set_buffer(LV2_Atom_Forge* forge, uint8_t* buf, size_t size) +{ + forge->buf = buf; + forge->size = (uint32_t)size; + forge->offset = 0; + forge->deref = NULL; + forge->sink = NULL; + forge->handle = NULL; + forge->stack = NULL; +} + +/** + Set the sink function where `forge` will write output. + + The return value of forge functions is an LV2_Atom_Forge_Ref which is an + integer type safe to use as a pointer but is otherwise opaque. The sink + function must return a ref that can be dereferenced to access as least + sizeof(LV2_Atom) bytes of the written data, so sizes can be updated. For + ringbuffers, this should be possible as long as the size of the buffer is a + multiple of sizeof(LV2_Atom), since atoms are always aligned. + + Note that 0 is an invalid reference, so if you are using a buffer offset be + sure to offset it such that 0 is never a valid reference. You will get + confusing errors otherwise. +*/ +static inline void +lv2_atom_forge_set_sink(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Sink sink, + LV2_Atom_Forge_Deref_Func deref, + LV2_Atom_Forge_Sink_Handle handle) +{ + forge->buf = NULL; + forge->size = forge->offset = 0; + forge->deref = deref; + forge->sink = sink; + forge->handle = handle; + forge->stack = NULL; +} + +/** + @} + @name Low Level Output + @{ +*/ + +/** + Write raw output. This is used internally, but is also useful for writing + atom types not explicitly supported by the forge API. Note the caller is + responsible for ensuring the output is approriately padded. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_raw(LV2_Atom_Forge* forge, const void* data, uint32_t size) +{ + LV2_Atom_Forge_Ref out = 0; + if (forge->sink) { + out = forge->sink(forge->handle, data, size); + } else { + out = (LV2_Atom_Forge_Ref)forge->buf + forge->offset; + uint8_t* mem = forge->buf + forge->offset; + if (forge->offset + size > forge->size) { + return 0; + } + forge->offset += size; + memcpy(mem, data, size); + } + for (LV2_Atom_Forge_Frame* f = forge->stack; f; f = f->parent) { + lv2_atom_forge_deref(forge, f->ref)->size += size; + } + return out; +} + +/** Pad output accordingly so next write is 64-bit aligned. */ +static inline void +lv2_atom_forge_pad(LV2_Atom_Forge* forge, uint32_t written) +{ + const uint64_t pad = 0; + const uint32_t pad_size = lv2_atom_pad_size(written) - written; + lv2_atom_forge_raw(forge, &pad, pad_size); +} + +/** Write raw output, padding to 64-bits as necessary. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_write(LV2_Atom_Forge* forge, const void* data, uint32_t size) +{ + LV2_Atom_Forge_Ref out = lv2_atom_forge_raw(forge, data, size); + if (out) { + lv2_atom_forge_pad(forge, size); + } + return out; +} + +/** Write a null-terminated string body. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_string_body(LV2_Atom_Forge* forge, const char* str, uint32_t len) +{ + LV2_Atom_Forge_Ref out = lv2_atom_forge_raw(forge, str, len); + if (out && (out = lv2_atom_forge_raw(forge, "", 1))) { + lv2_atom_forge_pad(forge, len + 1); + } + return out; +} + +/** + @} + @name Atom Output + @{ +*/ + +/** Write an atom:Atom header. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_atom(LV2_Atom_Forge* forge, uint32_t size, uint32_t type) +{ + const LV2_Atom a = {size, type}; + return lv2_atom_forge_raw(forge, &a, sizeof(a)); +} + +/** Write a primitive (fixed-size) atom. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_primitive(LV2_Atom_Forge* forge, const LV2_Atom* a) +{ + return ( + lv2_atom_forge_top_is(forge, forge->Vector) + ? lv2_atom_forge_raw(forge, LV2_ATOM_BODY_CONST(a), a->size) + : lv2_atom_forge_write(forge, a, (uint32_t)sizeof(LV2_Atom) + a->size)); +} + +/** Write an atom:Int. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_int(LV2_Atom_Forge* forge, int32_t val) +{ + const LV2_Atom_Int a = {{sizeof(val), forge->Int}, val}; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:Long. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_long(LV2_Atom_Forge* forge, int64_t val) +{ + const LV2_Atom_Long a = {{sizeof(val), forge->Long}, val}; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:Float. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_float(LV2_Atom_Forge* forge, float val) +{ + const LV2_Atom_Float a = {{sizeof(val), forge->Float}, val}; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:Double. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_double(LV2_Atom_Forge* forge, double val) +{ + const LV2_Atom_Double a = {{sizeof(val), forge->Double}, val}; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:Bool. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_bool(LV2_Atom_Forge* forge, bool val) +{ + const LV2_Atom_Bool a = {{sizeof(int32_t), forge->Bool}, val ? 1 : 0}; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:URID. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_urid(LV2_Atom_Forge* forge, LV2_URID id) +{ + const LV2_Atom_URID a = {{sizeof(id), forge->URID}, id}; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom compatible with atom:String. Used internally. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_typed_string(LV2_Atom_Forge* forge, + uint32_t type, + const char* str, + uint32_t len) +{ + const LV2_Atom_String a = {{len + 1, type}}; + LV2_Atom_Forge_Ref out = lv2_atom_forge_raw(forge, &a, sizeof(a)); + if (out) { + if (!lv2_atom_forge_string_body(forge, str, len)) { + LV2_Atom* atom = lv2_atom_forge_deref(forge, out); + atom->size = atom->type = 0; + out = 0; + } + } + return out; +} + +/** Write an atom:String. Note that `str` need not be NULL terminated. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_string(LV2_Atom_Forge* forge, const char* str, uint32_t len) +{ + return lv2_atom_forge_typed_string(forge, forge->String, str, len); +} + +/** + Write an atom:URI. Note that `uri` need not be NULL terminated. + This does not map the URI, but writes the complete URI string. To write + a mapped URI, use lv2_atom_forge_urid(). +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_uri(LV2_Atom_Forge* forge, const char* uri, uint32_t len) +{ + return lv2_atom_forge_typed_string(forge, forge->URI, uri, len); +} + +/** Write an atom:Path. Note that `path` need not be NULL terminated. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_path(LV2_Atom_Forge* forge, const char* path, uint32_t len) +{ + return lv2_atom_forge_typed_string(forge, forge->Path, path, len); +} + +/** Write an atom:Literal. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_literal(LV2_Atom_Forge* forge, + const char* str, + uint32_t len, + uint32_t datatype, + uint32_t lang) +{ + const LV2_Atom_Literal a = { + {(uint32_t)(sizeof(LV2_Atom_Literal) - sizeof(LV2_Atom) + len + 1), + forge->Literal}, + {datatype, lang}}; + LV2_Atom_Forge_Ref out = lv2_atom_forge_raw(forge, &a, sizeof(a)); + if (out) { + if (!lv2_atom_forge_string_body(forge, str, len)) { + LV2_Atom* atom = lv2_atom_forge_deref(forge, out); + atom->size = atom->type = 0; + out = 0; + } + } + return out; +} + +/** Start an atom:Vector. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_vector_head(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + uint32_t child_size, + uint32_t child_type) +{ + const LV2_Atom_Vector a = {{sizeof(LV2_Atom_Vector_Body), forge->Vector}, + {child_size, child_type}}; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** Write a complete atom:Vector. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_vector(LV2_Atom_Forge* forge, + uint32_t child_size, + uint32_t child_type, + uint32_t n_elems, + const void* elems) +{ + const LV2_Atom_Vector a = { + {(uint32_t)(sizeof(LV2_Atom_Vector_Body) + n_elems * child_size), + forge->Vector}, + {child_size, child_type}}; + LV2_Atom_Forge_Ref out = lv2_atom_forge_write(forge, &a, sizeof(a)); + if (out) { + lv2_atom_forge_write(forge, elems, child_size * n_elems); + } + return out; +} + +/** + Write the header of an atom:Tuple. + + The passed frame will be initialised to represent this tuple. To complete + the tuple, write a sequence of atoms, then pop the frame with + lv2_atom_forge_pop(). + + For example: + @code + // Write tuple (1, 2.0) + LV2_Atom_Forge_Frame frame; + LV2_Atom* tup = (LV2_Atom*)lv2_atom_forge_tuple(forge, &frame); + lv2_atom_forge_int(forge, 1); + lv2_atom_forge_float(forge, 2.0); + lv2_atom_forge_pop(forge, &frame); + @endcode +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_tuple(LV2_Atom_Forge* forge, LV2_Atom_Forge_Frame* frame) +{ + const LV2_Atom_Tuple a = {{0, forge->Tuple}}; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** + Write the header of an atom:Object. + + The passed frame will be initialised to represent this object. To complete + the object, write a sequence of properties, then pop the frame with + lv2_atom_forge_pop(). + + For example: + @code + LV2_URID eg_Cat = map("http://example.org/Cat"); + LV2_URID eg_name = map("http://example.org/name"); + + // Start object with type eg_Cat and blank ID + LV2_Atom_Forge_Frame frame; + lv2_atom_forge_object(forge, &frame, 0, eg_Cat); + + // Append property eg:name = "Hobbes" + lv2_atom_forge_key(forge, eg_name); + lv2_atom_forge_string(forge, "Hobbes", strlen("Hobbes")); + + // Finish object + lv2_atom_forge_pop(forge, &frame); + @endcode +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_object(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + LV2_URID id, + LV2_URID otype) +{ + const LV2_Atom_Object a = { + {(uint32_t)sizeof(LV2_Atom_Object_Body), forge->Object}, {id, otype}}; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** + The same as lv2_atom_forge_object(), but for object:Resource. + + This function is deprecated and should not be used in new code. + Use lv2_atom_forge_object() directly instead. +*/ +LV2_DEPRECATED +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_resource(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + LV2_URID id, + LV2_URID otype) +{ + const LV2_Atom_Object a = { + {(uint32_t)sizeof(LV2_Atom_Object_Body), forge->Resource}, {id, otype}}; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** + The same as lv2_atom_forge_object(), but for object:Blank. + + This function is deprecated and should not be used in new code. + Use lv2_atom_forge_object() directly instead. +*/ +LV2_DEPRECATED +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_blank(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + uint32_t id, + LV2_URID otype) +{ + const LV2_Atom_Object a = { + {(uint32_t)sizeof(LV2_Atom_Object_Body), forge->Blank}, {id, otype}}; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** + Write a property key in an Object, to be followed by the value. + + See lv2_atom_forge_object() documentation for an example. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_key(LV2_Atom_Forge* forge, LV2_URID key) +{ + const LV2_Atom_Property_Body a = {key, 0, {0, 0}}; + return lv2_atom_forge_write(forge, &a, 2 * (uint32_t)sizeof(uint32_t)); +} + +/** + Write the header for a property body in an object, with context. + + If you do not need the context, which is almost certainly the case, + use the simpler lv2_atom_forge_key() instead. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_property_head(LV2_Atom_Forge* forge, + LV2_URID key, + LV2_URID context) +{ + const LV2_Atom_Property_Body a = {key, context, {0, 0}}; + return lv2_atom_forge_write(forge, &a, 2 * (uint32_t)sizeof(uint32_t)); +} + +/** + Write the header for a Sequence. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_sequence_head(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + uint32_t unit) +{ + const LV2_Atom_Sequence a = { + {(uint32_t)sizeof(LV2_Atom_Sequence_Body), forge->Sequence}, {unit, 0}}; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** + Write the time stamp header of an Event (in a Sequence) in audio frames. + After this, call the appropriate forge method(s) to write the body. Note + the returned reference is to an LV2_Event which is NOT an Atom. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_frame_time(LV2_Atom_Forge* forge, int64_t frames) +{ + return lv2_atom_forge_write(forge, &frames, sizeof(frames)); +} + +/** + Write the time stamp header of an Event (in a Sequence) in beats. After + this, call the appropriate forge method(s) to write the body. Note the + returned reference is to an LV2_Event which is NOT an Atom. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_beat_time(LV2_Atom_Forge* forge, double beats) +{ + return lv2_atom_forge_write(forge, &beats, sizeof(beats)); +} + +LV2_RESTORE_WARNINGS + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} + @} +*/ + +#endif /* LV2_ATOM_FORGE_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/manifest.ttl new file mode 100644 index 00000000..46d6de5a --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 2 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h new file mode 100644 index 00000000..f4612e94 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/util.h @@ -0,0 +1,523 @@ +/* + Copyright 2008-2015 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_ATOM_UTIL_H +#define LV2_ATOM_UTIL_H + +/** + @file util.h Helper functions for the LV2 Atom extension. + + Note these functions are all static inline, do not take their address. + + This header is non-normative, it is provided for convenience. +*/ + +/** + @defgroup util Utilities + @ingroup atom + + Utilities for working with atoms. + + @{ +*/ + +#include "lv2/atom/atom.h" + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Pad a size to 64 bits. */ +static inline uint32_t +lv2_atom_pad_size(uint32_t size) +{ + return (size + 7U) & (~7U); +} + +/** Return the total size of `atom`, including the header. */ +static inline uint32_t +lv2_atom_total_size(const LV2_Atom* atom) +{ + return (uint32_t)sizeof(LV2_Atom) + atom->size; +} + +/** Return true iff `atom` is null. */ +static inline bool +lv2_atom_is_null(const LV2_Atom* atom) +{ + return !atom || (atom->type == 0 && atom->size == 0); +} + +/** Return true iff `a` is equal to `b`. */ +static inline bool +lv2_atom_equals(const LV2_Atom* a, const LV2_Atom* b) +{ + return (a == b) || ((a->type == b->type) && (a->size == b->size) && + !memcmp(a + 1, b + 1, a->size)); +} + +/** + @name Sequence Iterator + @{ +*/ + +/** Get an iterator pointing to the first event in a Sequence body. */ +static inline LV2_Atom_Event* +lv2_atom_sequence_begin(const LV2_Atom_Sequence_Body* body) +{ + return (LV2_Atom_Event*)(body + 1); +} + +/** Get an iterator pointing to the end of a Sequence body. */ +static inline LV2_Atom_Event* +lv2_atom_sequence_end(const LV2_Atom_Sequence_Body* body, uint32_t size) +{ + return (LV2_Atom_Event*)((const uint8_t*)body + lv2_atom_pad_size(size)); +} + +/** Return true iff `i` has reached the end of `body`. */ +static inline bool +lv2_atom_sequence_is_end(const LV2_Atom_Sequence_Body* body, + uint32_t size, + const LV2_Atom_Event* i) +{ + return (const uint8_t*)i >= ((const uint8_t*)body + size); +} + +/** Return an iterator to the element following `i`. */ +static inline LV2_Atom_Event* +lv2_atom_sequence_next(const LV2_Atom_Event* i) +{ + return (LV2_Atom_Event*)((const uint8_t*)i + sizeof(LV2_Atom_Event) + + lv2_atom_pad_size(i->body.size)); +} + +/** + A macro for iterating over all events in a Sequence. + @param seq The sequence to iterate over + @param iter The name of the iterator + + This macro is used similarly to a for loop (which it expands to), for + example: + + @code + LV2_ATOM_SEQUENCE_FOREACH(sequence, ev) { + // Do something with ev (an LV2_Atom_Event*) here... + } + @endcode +*/ +#define LV2_ATOM_SEQUENCE_FOREACH(seq, iter) \ + for (LV2_Atom_Event * (iter) = lv2_atom_sequence_begin(&(seq)->body); \ + !lv2_atom_sequence_is_end(&(seq)->body, (seq)->atom.size, (iter)); \ + (iter) = lv2_atom_sequence_next(iter)) + +/** Like LV2_ATOM_SEQUENCE_FOREACH but for a headerless sequence body. */ +#define LV2_ATOM_SEQUENCE_BODY_FOREACH(body, size, iter) \ + for (LV2_Atom_Event * (iter) = lv2_atom_sequence_begin(body); \ + !lv2_atom_sequence_is_end(body, size, (iter)); \ + (iter) = lv2_atom_sequence_next(iter)) + +/** + @} + @name Sequence Utilities + @{ +*/ + +/** + Clear all events from `sequence`. + + This simply resets the size field, the other fields are left untouched. +*/ +static inline void +lv2_atom_sequence_clear(LV2_Atom_Sequence* seq) +{ + seq->atom.size = sizeof(LV2_Atom_Sequence_Body); +} + +/** + Append an event at the end of `sequence`. + + @param seq Sequence to append to. + @param capacity Total capacity of the sequence atom + (as set by the host for sequence output ports). + @param event Event to write. + + @return A pointer to the newly written event in `seq`, + or NULL on failure (insufficient space). +*/ +static inline LV2_Atom_Event* +lv2_atom_sequence_append_event(LV2_Atom_Sequence* seq, + uint32_t capacity, + const LV2_Atom_Event* event) +{ + const uint32_t total_size = (uint32_t)sizeof(*event) + event->body.size; + if (capacity - seq->atom.size < total_size) { + return NULL; + } + + LV2_Atom_Event* e = lv2_atom_sequence_end(&seq->body, seq->atom.size); + memcpy(e, event, total_size); + + seq->atom.size += lv2_atom_pad_size(total_size); + + return e; +} + +/** + @} + @name Tuple Iterator + @{ +*/ + +/** Get an iterator pointing to the first element in `tup`. */ +static inline LV2_Atom* +lv2_atom_tuple_begin(const LV2_Atom_Tuple* tup) +{ + return (LV2_Atom*)(LV2_ATOM_BODY(tup)); +} + +/** Return true iff `i` has reached the end of `body`. */ +static inline bool +lv2_atom_tuple_is_end(const void* body, uint32_t size, const LV2_Atom* i) +{ + return (const uint8_t*)i >= ((const uint8_t*)body + size); +} + +/** Return an iterator to the element following `i`. */ +static inline LV2_Atom* +lv2_atom_tuple_next(const LV2_Atom* i) +{ + return (LV2_Atom*)((const uint8_t*)i + sizeof(LV2_Atom) + + lv2_atom_pad_size(i->size)); +} + +/** + A macro for iterating over all properties of a Tuple. + @param tuple The tuple to iterate over + @param iter The name of the iterator + + This macro is used similarly to a for loop (which it expands to), for + example: + + @code + LV2_ATOM_TUPLE_FOREACH(tuple, elem) { + // Do something with elem (an LV2_Atom*) here... + } + @endcode +*/ +#define LV2_ATOM_TUPLE_FOREACH(tuple, iter) \ + for (LV2_Atom * (iter) = lv2_atom_tuple_begin(tuple); \ + !lv2_atom_tuple_is_end( \ + LV2_ATOM_BODY(tuple), (tuple)->atom.size, (iter)); \ + (iter) = lv2_atom_tuple_next(iter)) + +/** Like LV2_ATOM_TUPLE_FOREACH but for a headerless tuple body. */ +#define LV2_ATOM_TUPLE_BODY_FOREACH(body, size, iter) \ + for (LV2_Atom * (iter) = (LV2_Atom*)(body); \ + !lv2_atom_tuple_is_end(body, size, (iter)); \ + (iter) = lv2_atom_tuple_next(iter)) + +/** + @} + @name Object Iterator + @{ +*/ + +/** Return a pointer to the first property in `body`. */ +static inline LV2_Atom_Property_Body* +lv2_atom_object_begin(const LV2_Atom_Object_Body* body) +{ + return (LV2_Atom_Property_Body*)(body + 1); +} + +/** Return true iff `i` has reached the end of `obj`. */ +static inline bool +lv2_atom_object_is_end(const LV2_Atom_Object_Body* body, + uint32_t size, + const LV2_Atom_Property_Body* i) +{ + return (const uint8_t*)i >= ((const uint8_t*)body + size); +} + +/** Return an iterator to the property following `i`. */ +static inline LV2_Atom_Property_Body* +lv2_atom_object_next(const LV2_Atom_Property_Body* i) +{ + const LV2_Atom* const value = + (const LV2_Atom*)((const uint8_t*)i + 2 * sizeof(uint32_t)); + return (LV2_Atom_Property_Body*)((const uint8_t*)i + + lv2_atom_pad_size( + (uint32_t)sizeof(LV2_Atom_Property_Body) + + value->size)); +} + +/** + A macro for iterating over all properties of an Object. + @param obj The object to iterate over + @param iter The name of the iterator + + This macro is used similarly to a for loop (which it expands to), for + example: + + @code + LV2_ATOM_OBJECT_FOREACH(object, i) { + // Do something with i (an LV2_Atom_Property_Body*) here... + } + @endcode +*/ +#define LV2_ATOM_OBJECT_FOREACH(obj, iter) \ + for (LV2_Atom_Property_Body * (iter) = lv2_atom_object_begin(&(obj)->body); \ + !lv2_atom_object_is_end(&(obj)->body, (obj)->atom.size, (iter)); \ + (iter) = lv2_atom_object_next(iter)) + +/** Like LV2_ATOM_OBJECT_FOREACH but for a headerless object body. */ +#define LV2_ATOM_OBJECT_BODY_FOREACH(body, size, iter) \ + for (LV2_Atom_Property_Body * (iter) = lv2_atom_object_begin(body); \ + !lv2_atom_object_is_end(body, size, (iter)); \ + (iter) = lv2_atom_object_next(iter)) + +/** + @} + @name Object Query + @{ +*/ + +/** A single entry in an Object query. */ +typedef struct { + uint32_t key; /**< Key to query (input set by user) */ + const LV2_Atom** value; /**< Found value (output set by query function) */ +} LV2_Atom_Object_Query; + +/** Sentinel for lv2_atom_object_query(). */ +static const LV2_Atom_Object_Query LV2_ATOM_OBJECT_QUERY_END = {0, NULL}; + +/** + Get an object's values for various keys. + + The value pointer of each item in `query` will be set to the location of + the corresponding value in `object`. Every value pointer in `query` MUST + be initialised to NULL. This function reads `object` in a single linear + sweep. By allocating `query` on the stack, objects can be "queried" + quickly without allocating any memory. This function is realtime safe. + + This function can only do "flat" queries, it is not smart enough to match + variables in nested objects. + + For example: + @code + const LV2_Atom* name = NULL; + const LV2_Atom* age = NULL; + LV2_Atom_Object_Query q[] = { + { urids.eg_name, &name }, + { urids.eg_age, &age }, + LV2_ATOM_OBJECT_QUERY_END + }; + lv2_atom_object_query(obj, q); + // name and age are now set to the appropriate values in obj, or NULL. + @endcode +*/ +static inline int +lv2_atom_object_query(const LV2_Atom_Object* object, + LV2_Atom_Object_Query* query) +{ + int matches = 0; + int n_queries = 0; + + /* Count number of query keys so we can short-circuit when done */ + for (LV2_Atom_Object_Query* q = query; q->key; ++q) { + ++n_queries; + } + + LV2_ATOM_OBJECT_FOREACH (object, prop) { + for (LV2_Atom_Object_Query* q = query; q->key; ++q) { + if (q->key == prop->key && !*q->value) { + *q->value = &prop->value; + if (++matches == n_queries) { + return matches; + } + break; + } + } + } + return matches; +} + +/** + Body only version of lv2_atom_object_get(). +*/ +static inline int +lv2_atom_object_body_get(uint32_t size, const LV2_Atom_Object_Body* body, ...) +{ + int matches = 0; + int n_queries = 0; + + /* Count number of keys so we can short-circuit when done */ + va_list args; + va_start(args, body); + for (n_queries = 0; va_arg(args, uint32_t); ++n_queries) { + if (!va_arg(args, const LV2_Atom**)) { + va_end(args); + return -1; + } + } + va_end(args); + + LV2_ATOM_OBJECT_BODY_FOREACH (body, size, prop) { + va_start(args, body); + for (int i = 0; i < n_queries; ++i) { + uint32_t qkey = va_arg(args, uint32_t); + const LV2_Atom** qval = va_arg(args, const LV2_Atom**); + if (qkey == prop->key && !*qval) { + *qval = &prop->value; + if (++matches == n_queries) { + va_end(args); + return matches; + } + break; + } + } + va_end(args); + } + return matches; +} + +/** + Variable argument version of lv2_atom_object_query(). + + This is nicer-looking in code, but a bit more error-prone since it is not + type safe and the argument list must be terminated. + + The arguments should be a series of uint32_t key and const LV2_Atom** value + pairs, terminated by a zero key. The value pointers MUST be initialized to + NULL. For example: + + @code + const LV2_Atom* name = NULL; + const LV2_Atom* age = NULL; + lv2_atom_object_get(obj, + uris.name_key, &name, + uris.age_key, &age, + 0); + @endcode +*/ +static inline int +lv2_atom_object_get(const LV2_Atom_Object* object, ...) +{ + int matches = 0; + int n_queries = 0; + + /* Count number of keys so we can short-circuit when done */ + va_list args; + va_start(args, object); + for (n_queries = 0; va_arg(args, uint32_t); ++n_queries) { + if (!va_arg(args, const LV2_Atom**)) { + va_end(args); + return -1; + } + } + va_end(args); + + LV2_ATOM_OBJECT_FOREACH (object, prop) { + va_start(args, object); + for (int i = 0; i < n_queries; ++i) { + uint32_t qkey = va_arg(args, uint32_t); + const LV2_Atom** qval = va_arg(args, const LV2_Atom**); + if (qkey == prop->key && !*qval) { + *qval = &prop->value; + if (++matches == n_queries) { + va_end(args); + return matches; + } + break; + } + } + va_end(args); + } + return matches; +} + +/** + Variable argument version of lv2_atom_object_query() with types. + + This is like lv2_atom_object_get(), but each entry has an additional + parameter to specify the required type. Only atoms with a matching type + will be selected. + + The arguments should be a series of uint32_t key, const LV2_Atom**, uint32_t + type triples, terminated by a zero key. The value pointers MUST be + initialized to NULL. For example: + + @code + const LV2_Atom_String* name = NULL; + const LV2_Atom_Int* age = NULL; + lv2_atom_object_get(obj, + uris.name_key, &name, uris.atom_String, + uris.age_key, &age, uris.atom_Int + 0); + @endcode +*/ +static inline int +lv2_atom_object_get_typed(const LV2_Atom_Object* object, ...) +{ + int matches = 0; + int n_queries = 0; + + /* Count number of keys so we can short-circuit when done */ + va_list args; + va_start(args, object); + for (n_queries = 0; va_arg(args, uint32_t); ++n_queries) { + if (!va_arg(args, const LV2_Atom**) || !va_arg(args, uint32_t)) { + va_end(args); + return -1; + } + } + va_end(args); + + LV2_ATOM_OBJECT_FOREACH (object, prop) { + va_start(args, object); + for (int i = 0; i < n_queries; ++i) { + const uint32_t qkey = va_arg(args, uint32_t); + const LV2_Atom** qval = va_arg(args, const LV2_Atom**); + const uint32_t qtype = va_arg(args, uint32_t); + if (!*qval && qkey == prop->key && qtype == prop->value.type) { + *qval = &prop->value; + if (++matches == n_queries) { + va_end(args); + return matches; + } + break; + } + } + va_end(args); + } + return matches; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} + @} +*/ + +#endif /* LV2_ATOM_UTIL_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h new file mode 100644 index 00000000..d96e17d5 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.h @@ -0,0 +1,51 @@ +/* + Copyright 2007-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_BUF_SIZE_H +#define LV2_BUF_SIZE_H + +/** + @defgroup buf-size Buffer Size + @ingroup lv2 + + Access to, and restrictions on, buffer sizes. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_BUF_SIZE_URI "http://lv2plug.in/ns/ext/buf-size" ///< http://lv2plug.in/ns/ext/buf-size +#define LV2_BUF_SIZE_PREFIX LV2_BUF_SIZE_URI "#" ///< http://lv2plug.in/ns/ext/buf-size# + +#define LV2_BUF_SIZE__boundedBlockLength LV2_BUF_SIZE_PREFIX "boundedBlockLength" ///< http://lv2plug.in/ns/ext/buf-size#boundedBlockLength +#define LV2_BUF_SIZE__coarseBlockLength LV2_BUF_SIZE_PREFIX "coarseBlockLength" ///< http://lv2plug.in/ns/ext/buf-size#coarseBlockLength +#define LV2_BUF_SIZE__fixedBlockLength LV2_BUF_SIZE_PREFIX "fixedBlockLength" ///< http://lv2plug.in/ns/ext/buf-size#fixedBlockLength +#define LV2_BUF_SIZE__maxBlockLength LV2_BUF_SIZE_PREFIX "maxBlockLength" ///< http://lv2plug.in/ns/ext/buf-size#maxBlockLength +#define LV2_BUF_SIZE__minBlockLength LV2_BUF_SIZE_PREFIX "minBlockLength" ///< http://lv2plug.in/ns/ext/buf-size#minBlockLength +#define LV2_BUF_SIZE__nominalBlockLength LV2_BUF_SIZE_PREFIX "nominalBlockLength" ///< http://lv2plug.in/ns/ext/buf-size#nominalBlockLength +#define LV2_BUF_SIZE__powerOf2BlockLength LV2_BUF_SIZE_PREFIX "powerOf2BlockLength" ///< http://lv2plug.in/ns/ext/buf-size#powerOf2BlockLength +#define LV2_BUF_SIZE__sequenceSize LV2_BUF_SIZE_PREFIX "sequenceSize" ///< http://lv2plug.in/ns/ext/buf-size#sequenceSize + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_BUF_SIZE_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.meta.ttl new file mode 100644 index 00000000..b1d8011c --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.meta.ttl @@ -0,0 +1,157 @@ +@prefix bufsz: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Buf Size" ; + doap:shortdesc "Access to, and restrictions on, buffer sizes." ; + doap:created "2012-08-07" ; + doap:developer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2015-09-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add bufsz:nominalBlockLength option." + ] , [ + rdfs:label "Add bufsz:coarseBlockLength feature." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-12-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix typo in bufsz:sequenceSize label." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a facility for plugins to get information about the +block length (the sample_count parameter of LV2_Descriptor::run) and port +buffer sizes, as well as several features which can be used to restrict the +block length. + +This extension defines features and properties but has no special purpose +API of its own. The host provides all the relevant information to the plugin +as [options](options.html). + +To require restrictions on the block length, plugins can require additional +features: bufsz:boundedBlockLength, bufsz:powerOf2BlockLength, and +bufsz:fixedBlockLength. These features are data-only, that is they merely +indicate a restriction and do not carry any data or API. + +"""^^lv2:Markdown . + +bufsz:boundedBlockLength + lv2:documentation """ + +A feature that indicates the host will provide both the bufsz:minBlockLength +and bufsz:maxBlockLength options to the plugin. Plugins that copy data from +audio inputs can require this feature to ensure they know how much space is +required for auxiliary buffers. Note the minimum may be zero, this feature is +mainly useful to ensure a maximum is available. + +All hosts SHOULD support this feature, since it is simple to support and +necessary for any plugins that may need to copy the input. + +"""^^lv2:Markdown . + +bufsz:fixedBlockLength + lv2:documentation """ + +A feature that indicates the host will always call LV2_Descriptor::run() with +the same value for sample_count. This length MUST be provided as the value of +both the bufsz:minBlockLength and bufsz:maxBlockLength options. + +Note that requiring this feature may severely limit the number of hosts capable +of running the plugin. + +"""^^lv2:Markdown . + +bufsz:powerOf2BlockLength + lv2:documentation """ + +A feature that indicates the host will always call LV2_Descriptor::run() with a +power of two sample_count. Note that this feature does not guarantee the value +is the same each call, to guarantee a fixed power of two block length plugins +must require both this feature and bufsz:fixedBlockLength. + +Note that requiring this feature may severely limit the number of hosts capable +of running the plugin. + +"""^^lv2:Markdown . + +bufsz:coarseBlockLength + lv2:documentation """ + +A feature that indicates the plugin prefers coarse, regular block lengths. For +example, plugins that do not implement sample-accurate control use this feature +to indicate that the host should not split the run cycle because controls have +changed. + +Note that this feature is merely a hint, and does not guarantee a fixed block +length. The run cycle may be split for other reasons, and the blocksize itself +may change anytime. + +"""^^lv2:Markdown . + +bufsz:maxBlockLength + lv2:documentation """ + +The maximum block length the host will ever request the plugin to process at +once, that is, the maximum `sample_count` parameter that will ever be passed to +LV2_Descriptor::run(). + +"""^^lv2:Markdown . + +bufsz:minBlockLength + lv2:documentation """ + +The minimum block length the host will ever request the plugin to process at +once, that is, the minimum `sample_count` parameter that will ever be passed to +LV2_Descriptor::run(). + +"""^^lv2:Markdown . + +bufsz:nominalBlockLength + lv2:documentation """ + +The typical block length the host will request the plugin to process at once, +that is, the typical `sample_count` parameter that will be passed to +LV2_Descriptor::run(). This will usually be equivalent, or close to, the +maximum block length, but there are no strong guarantees about this value +whatsoever. Plugins may use this length for optimization purposes, but MUST +NOT assume the host will always process blocks of this length. In particular, +the host MAY process longer blocks. + +"""^^lv2:Markdown . + +bufsz:sequenceSize + lv2:documentation """ + +This should be provided as an option by hosts that support event ports +(including but not limited to MIDI), so plugins have the ability to allocate +auxiliary buffers large enough to copy the input. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.ttl new file mode 100644 index 00000000..88631982 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/buf-size.ttl @@ -0,0 +1,67 @@ +@prefix bufsz: . +@prefix lv2: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Buf Size" ; + rdfs:comment "Access to, and restrictions on, buffer sizes." ; + rdfs:seeAlso , + . + +bufsz:boundedBlockLength + a lv2:Feature ; + rdfs:label "bounded block length" ; + rdfs:comment "Block length has lower and upper bounds." . + +bufsz:fixedBlockLength + a lv2:Feature ; + rdfs:label "fixed block length" ; + rdfs:comment "Block length never changes." . + +bufsz:powerOf2BlockLength + a lv2:Feature ; + rdfs:label "power of 2 block length" ; + rdfs:comment "Block length is a power of 2." . + +bufsz:coarseBlockLength + a lv2:Feature ; + rdfs:label "coarse block length" ; + rdfs:comment "Plugin prefers coarse block length without buffer splitting." . + +bufsz:maxBlockLength + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "maximum block length" ; + rdfs:comment "Block length has an upper bound." ; + rdfs:range xsd:nonNegativeInteger . + +bufsz:minBlockLength + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "minimum block length" ; + rdfs:comment "Block length has a lower bound." ; + rdfs:range xsd:nonNegativeInteger . + +bufsz:nominalBlockLength + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "nominal block length" ; + rdfs:comment "Typical block length that will most often be processed." ; + rdfs:range xsd:nonNegativeInteger . + +bufsz:sequenceSize + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "sequence size" ; + rdfs:comment "The maximum size of a sequence, in bytes." ; + rdfs:range xsd:nonNegativeInteger . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/manifest.ttl new file mode 100644 index 00000000..d242f97b --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/buf-size/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h new file mode 100644 index 00000000..dfcff3a9 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/attributes.h @@ -0,0 +1,59 @@ +/* + Copyright 2018 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_CORE_ATTRIBUTES_H +#define LV2_CORE_ATTRIBUTES_H + +/** + @defgroup attributes Attributes + @ingroup lv2 + + Macros for source code attributes. + + @{ +*/ + +#if defined(__GNUC__) && __GNUC__ > 3 +# define LV2_DEPRECATED __attribute__((__deprecated__)) +#else +# define LV2_DEPRECATED +#endif + +#if defined(__clang__) +# define LV2_DISABLE_DEPRECATION_WARNINGS \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif defined(__GNUC__) && __GNUC__ > 4 +# define LV2_DISABLE_DEPRECATION_WARNINGS \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#else +# define LV2_DISABLE_DEPRECATION_WARNINGS +#endif + +#if defined(__clang__) +# define LV2_RESTORE_WARNINGS _Pragma("clang diagnostic pop") +#elif defined(__GNUC__) && __GNUC__ > 4 +# define LV2_RESTORE_WARNINGS _Pragma("GCC diagnostic pop") +#else +# define LV2_RESTORE_WARNINGS +#endif + +/** + @} +*/ + +#endif /* LV2_CORE_ATTRIBUTES_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h new file mode 100644 index 00000000..614ec765 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2.h @@ -0,0 +1,484 @@ +/* + LV2 - An audio plugin interface specification. + Copyright 2007-2012 Steve Harris, David Robillard. + + Based on LADSPA, Copyright 2000-2002 Richard W.E. Furse, + Paul Barton-Davis, Stefan Westerfeld. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_H_INCLUDED +#define LV2_H_INCLUDED + +/** + @defgroup lv2 LV2 + + The LV2 specification. + + @{ +*/ + +/** + @defgroup lv2core LV2 Core + + Core LV2 specification. + + See for details. + + @{ +*/ + +#include + +// clang-format off + +#define LV2_CORE_URI "http://lv2plug.in/ns/lv2core" ///< http://lv2plug.in/ns/lv2core +#define LV2_CORE_PREFIX LV2_CORE_URI "#" ///< http://lv2plug.in/ns/lv2core# + +#define LV2_CORE__AllpassPlugin LV2_CORE_PREFIX "AllpassPlugin" ///< http://lv2plug.in/ns/lv2core#AllpassPlugin +#define LV2_CORE__AmplifierPlugin LV2_CORE_PREFIX "AmplifierPlugin" ///< http://lv2plug.in/ns/lv2core#AmplifierPlugin +#define LV2_CORE__AnalyserPlugin LV2_CORE_PREFIX "AnalyserPlugin" ///< http://lv2plug.in/ns/lv2core#AnalyserPlugin +#define LV2_CORE__AudioPort LV2_CORE_PREFIX "AudioPort" ///< http://lv2plug.in/ns/lv2core#AudioPort +#define LV2_CORE__BandpassPlugin LV2_CORE_PREFIX "BandpassPlugin" ///< http://lv2plug.in/ns/lv2core#BandpassPlugin +#define LV2_CORE__CVPort LV2_CORE_PREFIX "CVPort" ///< http://lv2plug.in/ns/lv2core#CVPort +#define LV2_CORE__ChorusPlugin LV2_CORE_PREFIX "ChorusPlugin" ///< http://lv2plug.in/ns/lv2core#ChorusPlugin +#define LV2_CORE__CombPlugin LV2_CORE_PREFIX "CombPlugin" ///< http://lv2plug.in/ns/lv2core#CombPlugin +#define LV2_CORE__CompressorPlugin LV2_CORE_PREFIX "CompressorPlugin" ///< http://lv2plug.in/ns/lv2core#CompressorPlugin +#define LV2_CORE__ConstantPlugin LV2_CORE_PREFIX "ConstantPlugin" ///< http://lv2plug.in/ns/lv2core#ConstantPlugin +#define LV2_CORE__ControlPort LV2_CORE_PREFIX "ControlPort" ///< http://lv2plug.in/ns/lv2core#ControlPort +#define LV2_CORE__ConverterPlugin LV2_CORE_PREFIX "ConverterPlugin" ///< http://lv2plug.in/ns/lv2core#ConverterPlugin +#define LV2_CORE__DelayPlugin LV2_CORE_PREFIX "DelayPlugin" ///< http://lv2plug.in/ns/lv2core#DelayPlugin +#define LV2_CORE__DistortionPlugin LV2_CORE_PREFIX "DistortionPlugin" ///< http://lv2plug.in/ns/lv2core#DistortionPlugin +#define LV2_CORE__DynamicsPlugin LV2_CORE_PREFIX "DynamicsPlugin" ///< http://lv2plug.in/ns/lv2core#DynamicsPlugin +#define LV2_CORE__EQPlugin LV2_CORE_PREFIX "EQPlugin" ///< http://lv2plug.in/ns/lv2core#EQPlugin +#define LV2_CORE__EnvelopePlugin LV2_CORE_PREFIX "EnvelopePlugin" ///< http://lv2plug.in/ns/lv2core#EnvelopePlugin +#define LV2_CORE__ExpanderPlugin LV2_CORE_PREFIX "ExpanderPlugin" ///< http://lv2plug.in/ns/lv2core#ExpanderPlugin +#define LV2_CORE__ExtensionData LV2_CORE_PREFIX "ExtensionData" ///< http://lv2plug.in/ns/lv2core#ExtensionData +#define LV2_CORE__Feature LV2_CORE_PREFIX "Feature" ///< http://lv2plug.in/ns/lv2core#Feature +#define LV2_CORE__FilterPlugin LV2_CORE_PREFIX "FilterPlugin" ///< http://lv2plug.in/ns/lv2core#FilterPlugin +#define LV2_CORE__FlangerPlugin LV2_CORE_PREFIX "FlangerPlugin" ///< http://lv2plug.in/ns/lv2core#FlangerPlugin +#define LV2_CORE__FunctionPlugin LV2_CORE_PREFIX "FunctionPlugin" ///< http://lv2plug.in/ns/lv2core#FunctionPlugin +#define LV2_CORE__GatePlugin LV2_CORE_PREFIX "GatePlugin" ///< http://lv2plug.in/ns/lv2core#GatePlugin +#define LV2_CORE__GeneratorPlugin LV2_CORE_PREFIX "GeneratorPlugin" ///< http://lv2plug.in/ns/lv2core#GeneratorPlugin +#define LV2_CORE__HighpassPlugin LV2_CORE_PREFIX "HighpassPlugin" ///< http://lv2plug.in/ns/lv2core#HighpassPlugin +#define LV2_CORE__InputPort LV2_CORE_PREFIX "InputPort" ///< http://lv2plug.in/ns/lv2core#InputPort +#define LV2_CORE__InstrumentPlugin LV2_CORE_PREFIX "InstrumentPlugin" ///< http://lv2plug.in/ns/lv2core#InstrumentPlugin +#define LV2_CORE__LimiterPlugin LV2_CORE_PREFIX "LimiterPlugin" ///< http://lv2plug.in/ns/lv2core#LimiterPlugin +#define LV2_CORE__LowpassPlugin LV2_CORE_PREFIX "LowpassPlugin" ///< http://lv2plug.in/ns/lv2core#LowpassPlugin +#define LV2_CORE__MixerPlugin LV2_CORE_PREFIX "MixerPlugin" ///< http://lv2plug.in/ns/lv2core#MixerPlugin +#define LV2_CORE__ModulatorPlugin LV2_CORE_PREFIX "ModulatorPlugin" ///< http://lv2plug.in/ns/lv2core#ModulatorPlugin +#define LV2_CORE__MultiEQPlugin LV2_CORE_PREFIX "MultiEQPlugin" ///< http://lv2plug.in/ns/lv2core#MultiEQPlugin +#define LV2_CORE__OscillatorPlugin LV2_CORE_PREFIX "OscillatorPlugin" ///< http://lv2plug.in/ns/lv2core#OscillatorPlugin +#define LV2_CORE__OutputPort LV2_CORE_PREFIX "OutputPort" ///< http://lv2plug.in/ns/lv2core#OutputPort +#define LV2_CORE__ParaEQPlugin LV2_CORE_PREFIX "ParaEQPlugin" ///< http://lv2plug.in/ns/lv2core#ParaEQPlugin +#define LV2_CORE__PhaserPlugin LV2_CORE_PREFIX "PhaserPlugin" ///< http://lv2plug.in/ns/lv2core#PhaserPlugin +#define LV2_CORE__PitchPlugin LV2_CORE_PREFIX "PitchPlugin" ///< http://lv2plug.in/ns/lv2core#PitchPlugin +#define LV2_CORE__Plugin LV2_CORE_PREFIX "Plugin" ///< http://lv2plug.in/ns/lv2core#Plugin +#define LV2_CORE__PluginBase LV2_CORE_PREFIX "PluginBase" ///< http://lv2plug.in/ns/lv2core#PluginBase +#define LV2_CORE__Point LV2_CORE_PREFIX "Point" ///< http://lv2plug.in/ns/lv2core#Point +#define LV2_CORE__Port LV2_CORE_PREFIX "Port" ///< http://lv2plug.in/ns/lv2core#Port +#define LV2_CORE__PortProperty LV2_CORE_PREFIX "PortProperty" ///< http://lv2plug.in/ns/lv2core#PortProperty +#define LV2_CORE__Resource LV2_CORE_PREFIX "Resource" ///< http://lv2plug.in/ns/lv2core#Resource +#define LV2_CORE__ReverbPlugin LV2_CORE_PREFIX "ReverbPlugin" ///< http://lv2plug.in/ns/lv2core#ReverbPlugin +#define LV2_CORE__ScalePoint LV2_CORE_PREFIX "ScalePoint" ///< http://lv2plug.in/ns/lv2core#ScalePoint +#define LV2_CORE__SimulatorPlugin LV2_CORE_PREFIX "SimulatorPlugin" ///< http://lv2plug.in/ns/lv2core#SimulatorPlugin +#define LV2_CORE__SpatialPlugin LV2_CORE_PREFIX "SpatialPlugin" ///< http://lv2plug.in/ns/lv2core#SpatialPlugin +#define LV2_CORE__Specification LV2_CORE_PREFIX "Specification" ///< http://lv2plug.in/ns/lv2core#Specification +#define LV2_CORE__SpectralPlugin LV2_CORE_PREFIX "SpectralPlugin" ///< http://lv2plug.in/ns/lv2core#SpectralPlugin +#define LV2_CORE__UtilityPlugin LV2_CORE_PREFIX "UtilityPlugin" ///< http://lv2plug.in/ns/lv2core#UtilityPlugin +#define LV2_CORE__WaveshaperPlugin LV2_CORE_PREFIX "WaveshaperPlugin" ///< http://lv2plug.in/ns/lv2core#WaveshaperPlugin +#define LV2_CORE__appliesTo LV2_CORE_PREFIX "appliesTo" ///< http://lv2plug.in/ns/lv2core#appliesTo +#define LV2_CORE__binary LV2_CORE_PREFIX "binary" ///< http://lv2plug.in/ns/lv2core#binary +#define LV2_CORE__connectionOptional LV2_CORE_PREFIX "connectionOptional" ///< http://lv2plug.in/ns/lv2core#connectionOptional +#define LV2_CORE__control LV2_CORE_PREFIX "control" ///< http://lv2plug.in/ns/lv2core#control +#define LV2_CORE__default LV2_CORE_PREFIX "default" ///< http://lv2plug.in/ns/lv2core#default +#define LV2_CORE__designation LV2_CORE_PREFIX "designation" ///< http://lv2plug.in/ns/lv2core#designation +#define LV2_CORE__documentation LV2_CORE_PREFIX "documentation" ///< http://lv2plug.in/ns/lv2core#documentation +#define LV2_CORE__enumeration LV2_CORE_PREFIX "enumeration" ///< http://lv2plug.in/ns/lv2core#enumeration +#define LV2_CORE__extensionData LV2_CORE_PREFIX "extensionData" ///< http://lv2plug.in/ns/lv2core#extensionData +#define LV2_CORE__freeWheeling LV2_CORE_PREFIX "freeWheeling" ///< http://lv2plug.in/ns/lv2core#freeWheeling +#define LV2_CORE__hardRTCapable LV2_CORE_PREFIX "hardRTCapable" ///< http://lv2plug.in/ns/lv2core#hardRTCapable +#define LV2_CORE__inPlaceBroken LV2_CORE_PREFIX "inPlaceBroken" ///< http://lv2plug.in/ns/lv2core#inPlaceBroken +#define LV2_CORE__index LV2_CORE_PREFIX "index" ///< http://lv2plug.in/ns/lv2core#index +#define LV2_CORE__integer LV2_CORE_PREFIX "integer" ///< http://lv2plug.in/ns/lv2core#integer +#define LV2_CORE__isLive LV2_CORE_PREFIX "isLive" ///< http://lv2plug.in/ns/lv2core#isLive +#define LV2_CORE__latency LV2_CORE_PREFIX "latency" ///< http://lv2plug.in/ns/lv2core#latency +#define LV2_CORE__maximum LV2_CORE_PREFIX "maximum" ///< http://lv2plug.in/ns/lv2core#maximum +#define LV2_CORE__microVersion LV2_CORE_PREFIX "microVersion" ///< http://lv2plug.in/ns/lv2core#microVersion +#define LV2_CORE__minimum LV2_CORE_PREFIX "minimum" ///< http://lv2plug.in/ns/lv2core#minimum +#define LV2_CORE__minorVersion LV2_CORE_PREFIX "minorVersion" ///< http://lv2plug.in/ns/lv2core#minorVersion +#define LV2_CORE__name LV2_CORE_PREFIX "name" ///< http://lv2plug.in/ns/lv2core#name +#define LV2_CORE__optionalFeature LV2_CORE_PREFIX "optionalFeature" ///< http://lv2plug.in/ns/lv2core#optionalFeature +#define LV2_CORE__port LV2_CORE_PREFIX "port" ///< http://lv2plug.in/ns/lv2core#port +#define LV2_CORE__portProperty LV2_CORE_PREFIX "portProperty" ///< http://lv2plug.in/ns/lv2core#portProperty +#define LV2_CORE__project LV2_CORE_PREFIX "project" ///< http://lv2plug.in/ns/lv2core#project +#define LV2_CORE__prototype LV2_CORE_PREFIX "prototype" ///< http://lv2plug.in/ns/lv2core#prototype +#define LV2_CORE__reportsLatency LV2_CORE_PREFIX "reportsLatency" ///< http://lv2plug.in/ns/lv2core#reportsLatency +#define LV2_CORE__requiredFeature LV2_CORE_PREFIX "requiredFeature" ///< http://lv2plug.in/ns/lv2core#requiredFeature +#define LV2_CORE__sampleRate LV2_CORE_PREFIX "sampleRate" ///< http://lv2plug.in/ns/lv2core#sampleRate +#define LV2_CORE__scalePoint LV2_CORE_PREFIX "scalePoint" ///< http://lv2plug.in/ns/lv2core#scalePoint +#define LV2_CORE__symbol LV2_CORE_PREFIX "symbol" ///< http://lv2plug.in/ns/lv2core#symbol +#define LV2_CORE__toggled LV2_CORE_PREFIX "toggled" ///< http://lv2plug.in/ns/lv2core#toggled + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Plugin Instance Handle. + + This is a handle for one particular instance of a plugin. It is valid to + compare to NULL (or 0 for C++) but otherwise the host MUST NOT attempt to + interpret it. +*/ +typedef void* LV2_Handle; + +/** + Feature. + + Features allow hosts to make additional functionality available to plugins + without requiring modification to the LV2 API. Extensions may define new + features and specify the `URI` and `data` to be used if necessary. + Some features, such as lv2:isLive, do not require the host to pass data. +*/ +typedef struct { + /** + A globally unique, case-sensitive identifier (URI) for this feature. + + This MUST be a valid URI string as defined by RFC 3986. + */ + const char* URI; + + /** + Pointer to arbitrary data. + + The format of this data is defined by the extension which describes the + feature with the given `URI`. + */ + void* data; +} LV2_Feature; + +/** + Plugin Descriptor. + + This structure provides the core functions necessary to instantiate and use + a plugin. +*/ +typedef struct LV2_Descriptor { + /** + A globally unique, case-sensitive identifier for this plugin. + + This MUST be a valid URI string as defined by RFC 3986. All plugins with + the same URI MUST be compatible to some degree, see + http://lv2plug.in/ns/lv2core for details. + */ + const char* URI; + + /** + Instantiate the plugin. + + Note that instance initialisation should generally occur in activate() + rather than here. If a host calls instantiate(), it MUST call cleanup() + at some point in the future. + + @param descriptor Descriptor of the plugin to instantiate. + + @param sample_rate Sample rate, in Hz, for the new plugin instance. + + @param bundle_path Path to the LV2 bundle which contains this plugin + binary. It MUST include the trailing directory separator so that simply + appending a filename will yield the path to that file in the bundle. + + @param features A NULL terminated array of LV2_Feature structs which + represent the features the host supports. Plugins may refuse to + instantiate if required features are not found here. However, hosts MUST + NOT use this as a discovery mechanism: instead, use the RDF data to + determine which features are required and do not attempt to instantiate + unsupported plugins at all. This parameter MUST NOT be NULL, i.e. a host + that supports no features MUST pass a single element array containing + NULL. + + @return A handle for the new plugin instance, or NULL if instantiation + has failed. + */ + LV2_Handle (*instantiate)(const struct LV2_Descriptor* descriptor, + double sample_rate, + const char* bundle_path, + const LV2_Feature* const* features); + + /** + Connect a port on a plugin instance to a memory location. + + Plugin writers should be aware that the host may elect to use the same + buffer for more than one port and even use the same buffer for both + input and output (see lv2:inPlaceBroken in lv2.ttl). + + If the plugin has the feature lv2:hardRTCapable then there are various + things that the plugin MUST NOT do within the connect_port() function; + see lv2core.ttl for details. + + connect_port() MUST be called at least once for each port before run() + is called, unless that port is lv2:connectionOptional. The plugin must + pay careful attention to the block size passed to run() since the block + allocated may only just be large enough to contain the data, and is not + guaranteed to remain constant between run() calls. + + connect_port() may be called more than once for a plugin instance to + allow the host to change the buffers that the plugin is reading or + writing. These calls may be made before or after activate() or + deactivate() calls. + + @param instance Plugin instance containing the port. + + @param port Index of the port to connect. The host MUST NOT try to + connect a port index that is not defined in the plugin's RDF data. If + it does, the plugin's behaviour is undefined (a crash is likely). + + @param data_location Pointer to data of the type defined by the port + type in the plugin's RDF data (for example, an array of float for an + lv2:AudioPort). This pointer must be stored by the plugin instance and + used to read/write data when run() is called. Data present at the time + of the connect_port() call MUST NOT be considered meaningful. + */ + void (*connect_port)(LV2_Handle instance, uint32_t port, void* data_location); + + /** + Initialise a plugin instance and activate it for use. + + This is separated from instantiate() to aid real-time support and so + that hosts can reinitialise a plugin instance by calling deactivate() + and then activate(). In this case the plugin instance MUST reset all + state information dependent on the history of the plugin instance except + for any data locations provided by connect_port(). If there is nothing + for activate() to do then this field may be NULL. + + When present, hosts MUST call this function once before run() is called + for the first time. This call SHOULD be made as close to the run() call + as possible and indicates to real-time plugins that they are now live, + however plugins MUST NOT rely on a prompt call to run() after + activate(). + + The host MUST NOT call activate() again until deactivate() has been + called first. If a host calls activate(), it MUST call deactivate() at + some point in the future. Note that connect_port() may be called before + or after activate(). + */ + void (*activate)(LV2_Handle instance); + + /** + Run a plugin instance for a block. + + Note that if an activate() function exists then it must be called before + run(). If deactivate() is called for a plugin instance then run() may + not be called until activate() has been called again. + + If the plugin has the feature lv2:hardRTCapable then there are various + things that the plugin MUST NOT do within the run() function (see + lv2core.ttl for details). + + As a special case, when `sample_count` is 0, the plugin should update + any output ports that represent a single instant in time (for example, + control ports, but not audio ports). This is particularly useful for + latent plugins, which should update their latency output port so hosts + can pre-roll plugins to compute latency. Plugins MUST NOT crash when + `sample_count` is 0. + + @param instance Instance to be run. + + @param sample_count The block size (in samples) for which the plugin + instance must run. + */ + void (*run)(LV2_Handle instance, uint32_t sample_count); + + /** + Deactivate a plugin instance (counterpart to activate()). + + Hosts MUST deactivate all activated instances after they have been run() + for the last time. This call SHOULD be made as close to the last run() + call as possible and indicates to real-time plugins that they are no + longer live, however plugins MUST NOT rely on prompt deactivation. If + there is nothing for deactivate() to do then this field may be NULL + + Deactivation is not similar to pausing since the plugin instance will be + reinitialised by activate(). However, deactivate() itself MUST NOT fully + reset plugin state. For example, the host may deactivate a plugin, then + store its state (using some extension to do so). + + Hosts MUST NOT call deactivate() unless activate() was previously + called. Note that connect_port() may be called before or after + deactivate(). + */ + void (*deactivate)(LV2_Handle instance); + + /** + Clean up a plugin instance (counterpart to instantiate()). + + Once an instance of a plugin has been finished with it must be deleted + using this function. The instance handle passed ceases to be valid after + this call. + + If activate() was called for a plugin instance then a corresponding call + to deactivate() MUST be made before cleanup() is called. Hosts MUST NOT + call cleanup() unless instantiate() was previously called. + */ + void (*cleanup)(LV2_Handle instance); + + /** + Return additional plugin data defined by some extenion. + + A typical use of this facility is to return a struct containing function + pointers to extend the LV2_Descriptor API. + + The actual type and meaning of the returned object MUST be specified + precisely by the extension. This function MUST return NULL for any + unsupported URI. If a plugin does not support any extension data, this + field may be NULL. + + The host is never responsible for freeing the returned value. + */ + const void* (*extension_data)(const char* uri); +} LV2_Descriptor; + +/** + Helper macro needed for LV2_SYMBOL_EXPORT when using C++. +*/ +#ifdef __cplusplus +# define LV2_SYMBOL_EXTERN extern "C" +#else +# define LV2_SYMBOL_EXTERN +#endif + +/** + Put this (LV2_SYMBOL_EXPORT) before any functions that are to be loaded + by the host as a symbol from the dynamic library. +*/ +#ifdef _WIN32 +# define LV2_SYMBOL_EXPORT LV2_SYMBOL_EXTERN __declspec(dllexport) +#else +# define LV2_SYMBOL_EXPORT \ + LV2_SYMBOL_EXTERN __attribute__((visibility("default"))) +#endif + +/** + Prototype for plugin accessor function. + + Plugins are discovered by hosts using RDF data (not by loading libraries). + See http://lv2plug.in for details on the discovery process, though most + hosts should use an existing library to implement this functionality. + + This is the simple plugin discovery API, suitable for most statically + defined plugins. Advanced plugins that need access to their bundle during + discovery can use lv2_lib_descriptor() instead. Plugin libraries MUST + include a function called "lv2_descriptor" or "lv2_lib_descriptor" with + C-style linkage, but SHOULD provide "lv2_descriptor" wherever possible. + + When it is time to load a plugin (designated by its URI), the host loads the + plugin's library, gets the lv2_descriptor() function from it, and uses this + function to find the LV2_Descriptor for the desired plugin. Plugins are + accessed by index using values from 0 upwards. This function MUST return + NULL for out of range indices, so the host can enumerate plugins by + increasing `index` until NULL is returned. + + Note that `index` has no meaning, hosts MUST NOT depend on it remaining + consistent between loads of the plugin library. +*/ +LV2_SYMBOL_EXPORT +const LV2_Descriptor* +lv2_descriptor(uint32_t index); + +/** + Type of the lv2_descriptor() function in a library (old discovery API). +*/ +typedef const LV2_Descriptor* (*LV2_Descriptor_Function)(uint32_t index); + +/** + Handle for a library descriptor. +*/ +typedef void* LV2_Lib_Handle; + +/** + Descriptor for a plugin library. + + To access a plugin library, the host creates an LV2_Lib_Descriptor via the + lv2_lib_descriptor() function in the shared object. +*/ +typedef struct { + /** + Opaque library data which must be passed as the first parameter to all + the methods of this struct. + */ + LV2_Lib_Handle handle; + + /** + The total size of this struct. This allows for this struct to be + expanded in the future if necessary. This MUST be set by the library to + sizeof(LV2_Lib_Descriptor). The host MUST NOT access any fields of this + struct beyond get_plugin() unless this field indicates they are present. + */ + uint32_t size; + + /** + Destroy this library descriptor and free all related resources. + */ + void (*cleanup)(LV2_Lib_Handle handle); + + /** + Plugin accessor. + + Plugins are accessed by index using values from 0 upwards. Out of range + indices MUST result in this function returning NULL, so the host can + enumerate plugins by increasing `index` until NULL is returned. + */ + const LV2_Descriptor* (*get_plugin)(LV2_Lib_Handle handle, uint32_t index); +} LV2_Lib_Descriptor; + +/** + Prototype for library accessor function. + + This is the more advanced discovery API, which allows plugin libraries to + access their bundles during discovery, which makes it possible for plugins to + be dynamically defined by files in their bundle. This API also has an + explicit cleanup function, removing any need for non-portable shared library + destructors. Simple plugins that do not require these features may use + lv2_descriptor() instead. + + This is the entry point for a plugin library. Hosts load this symbol from + the library and call this function to obtain a library descriptor which can + be used to access all the contained plugins. The returned object must not + be destroyed (using LV2_Lib_Descriptor::cleanup()) until all plugins loaded + from that library have been destroyed. +*/ +LV2_SYMBOL_EXPORT +const LV2_Lib_Descriptor* +lv2_lib_descriptor(const char* bundle_path, const LV2_Feature* const* features); + +/** + Type of the lv2_lib_descriptor() function in an LV2 library. +*/ +typedef const LV2_Lib_Descriptor* (*LV2_Lib_Descriptor_Function)( + const char* bundle_path, + const LV2_Feature* const* features); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} + @} +*/ + +#endif /* LV2_H_INCLUDED */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h new file mode 100644 index 00000000..5dab8a02 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2_util.h @@ -0,0 +1,103 @@ +/* + Copyright 2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @defgroup util Utilities + @ingroup lv2core + @{ +*/ + +#include "lv2/core/lv2.h" + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Return the data for a feature in a features array. + + If the feature is not found, NULL is returned. Note that this function is + only useful for features with data, and can not detect features that are + present but have NULL data. +*/ +static inline void* +lv2_features_data(const LV2_Feature* const* features, const char* const uri) +{ + if (features) { + for (const LV2_Feature* const* f = features; *f; ++f) { + if (!strcmp(uri, (*f)->URI)) { + return (*f)->data; + } + } + } + return NULL; +} + +/** + Query a features array. + + This function allows getting several features in one call, and detect + missing required features, with the same caveat of lv2_features_data(). + + The arguments should be a series of const char* uri, void** data, bool + required, terminated by a NULL URI. The data pointers MUST be initialized + to NULL. For example: + + @code + LV2_URID_Log* log = NULL; + LV2_URID_Map* map = NULL; + const char* missing = lv2_features_query( + features, + LV2_LOG__log, &log, false, + LV2_URID__map, &map, true, + NULL); + @endcode + + @return NULL on success, otherwise the URI of this missing feature. +*/ +static inline const char* +lv2_features_query(const LV2_Feature* const* features, ...) +{ + va_list args; + va_start(args, features); + + const char* uri = NULL; + while ((uri = va_arg(args, const char*))) { + void** data = va_arg(args, void**); + bool required = va_arg(args, int); + + *data = lv2_features_data(features, uri); + if (required && !*data) { + va_end(args); + return uri; + } + } + + va_end(args); + return NULL; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.meta.ttl new file mode 100644 index 00000000..465917dc --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.meta.ttl @@ -0,0 +1,905 @@ +@prefix lv2: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2" ; + doap:homepage ; + doap:created "2004-04-21" ; + doap:shortdesc "An extensible open standard for audio plugins" ; + doap:programming-language "C" ; + doap:developer , + ; + doap:maintainer ; + doap:release [ + doap:revision "18.0" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:Markdown datatype." + ] , [ + rdfs:label "Deprecate lv2:reportsLatency." + ] + ] + ] , [ + doap:revision "16.0" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:MIDIPlugin class." + ] , [ + rdfs:label "Rework port restrictions so that presets can be validated." + ] + ] + ] , [ + doap:revision "14.0" ; + doap:created "2016-09-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2_util.h with lv2_features_data() and lv2_features_query()." + ] , [ + rdfs:label "Add lv2:enabled designation." + ] + ] + ] , [ + doap:revision "12.4" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Relax domain of lv2:minimum lv2:maximum and lv2:default so they can be used to describe properties/parameters as well." + ] , [ + rdfs:label "Add extern C and visibility attribute to LV2_SYMBOL_EXPORT." + ] , [ + rdfs:label "Add lv2:isSideChain port property." + ] + ] + ] , [ + doap:revision "12.2" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Clarify lv2_descriptor() and lv2_lib_descriptor() documentation." + ] + ] + ] , [ + doap:revision "12.0" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:prototype for property inheritance." + ] + ] + ] , [ + doap:revision "10.0" ; + doap:created "2013-02-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:EnvelopePlugin class." + ] , [ + rdfs:label "Add lv2:control for designating primary event-based control ports." + ] , [ + rdfs:label "Set range of lv2:designation to lv2:Designation." + ] , [ + rdfs:label "Make lv2:Parameter rdfs:subClassOf rdf:Property." + ] , [ + rdfs:label "Reserve minor version 0 for unstable development plugins." + ] + ] + ] , [ + doap:revision "8.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "8.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix LV2_SYMBOL_EXPORT and lv2_descriptor prototype for Windows." + ] , [ + rdfs:label "Add metadata concept of a designation, a channel or parameter description which can be assigned to ports for more intelligent use by hosts." + ] , [ + rdfs:label "Add new discovery API which allows libraries to read bundle files during discovery, makes library construction/destruction explicit, and adds extensibility to prevent future breakage." + ] , [ + rdfs:label "Relax the range of lv2:index so it can be used for things other than ports." + ] , [ + rdfs:label "Remove lv2:Resource, which turned out to be meaningless." + ] , [ + rdfs:label "Add lv2:CVPort." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "6.0" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Rename core.lv2 and lv2.ttl to lv2core.lv2 and lv2core.ttl to adhere to modern conventions." + ] , [ + rdfs:label "Add lv2:extensionData and lv2:ExtensionData for plugins to indicate that they support some URI for extension_data()." + ] , [ + rdfs:label "Remove lv2config in favour of the simple convention that specifications install headers to standard URI-based paths." + ] , [ + rdfs:label "Switch to the ISC license, a simple BSD-style license (with permission of all contributors to lv2.h and its ancestor, ladspa.h)." + ] , [ + rdfs:label "Make lv2core.ttl a valid OWL 2 DL ontology." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "4.0" ; + doap:created "2011-03-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make doap:license suggested, but not required (for wrappers)." + ] , [ + rdfs:label "Define lv2:binary (MUST be in manifest.ttl)." + ] , [ + rdfs:label "Define lv2:minorVersion and lv2:microVersion (MUST be in manifest.ttl)." + ] , [ + rdfs:label "Define lv2:documentation and use it to document lv2core." + ] , [ + rdfs:label "Add lv2:FunctionPlugin and lv2:ConstantPlugin classes." + ] , [ + rdfs:label "Move lv2:AmplifierPlugin under lv2:DynamicsPlugin." + ] , [ + rdfs:label "Loosen domain of lv2:optionalFeature and lv2:requiredFeature (to allow re-use in extensions)." + ] , [ + rdfs:label "Add generic lv2:Resource and lv2:PluginBase classes." + ] , [ + rdfs:label "Fix definition of lv2:minimum etc. (used for values, not scale points)." + ] , [ + rdfs:label "More precisely define properties with OWL." + ] , [ + rdfs:label "Move project metadata to manifest." + ] , [ + rdfs:label "Add lv2:enumeration port property." + ] , [ + rdfs:label "Define run() pre-roll special case (sample_count == 0)." + ] + ] + ] , [ + doap:revision "3.0" ; + doap:created "2008-11-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Require that serialisations refer to ports by symbol rather than index." + ] , [ + rdfs:label "Minor stylistic changes to lv2.ttl." + ] , [ + rdfs:label "No header changes." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2008-02-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +LV2 is an interface for writing audio plugins in C or compatible languages, +which can be dynamically loaded into many _host_ applications. This core +specification is simple and minimal, but is designed so that _extensions_ can +be defined to add more advanced features, making it possible to implement +nearly any feature. + +LV2 maintains a strong distinction between code and data. Plugin code is in a +shared library, while data is in a companion data file written in +[Turtle](https://www.w3.org/TR/turtle/). Code, data, and any other resources +(such as waveforms) are shipped together in a bundle directory. The code +contains only the executable portions of the plugin. All other data is +provided in the data file(s). This makes plugin data flexible and extensible, +and allows the host to do everything but run the plugin without loading or +executing any code. Among other advantages, this makes hosts more robust +(broken plugins can't crash a host during discovery) and allows generic tools +written in any language to work with LV2 data. The LV2 specification itself is +distributed in a similar way. + +An LV2 plugin library is suitable for dynamic loading (for example with +`dlopen()`) and provides one or more plugin descriptors via `lv2_descriptor()` +or `lv2_lib_descriptor()`. These can be instantiated to create plugin +instances, which can be run directly on data or connected together to perform +advanced signal processing tasks. + +Plugins communicate via _ports_, which can transmit any type of data. Data is +processed by first connecting each port to a buffer, then repeatedly calling +the `run()` method to process blocks of data. + +This core specification defines two types of port, equivalent to those in +[LADSPA](http://www.ladspa.org/), lv2:ControlPort and lv2:AudioPort, as well as +lv2:CVPort which has the same format as an audio port but is interpreted as +non-audible control data. Audio ports contain arrays with one `float` element +per sample, allowing a block of audio to be processed in a single call to +`run()`. Control ports contain single `float` values, which are fixed and +valid for the duration of the call to `run()`. Thus the _control rate_ is +determined by the block size, which is controlled by the host (and not +necessarily constant). + +### Threading Rules + +To faciliate use in multi-threaded programs, LV2 functions are partitioned into +several threading classes: + +| Discovery Class | Instantiation Class | Audio Class | +|----------------------------------|-------------------------------|------------------------------- | +| lv2_descriptor() | LV2_Descriptor::instantiate() | LV2_Descriptor::run() | +| lv2_lib_descriptor() | LV2_Descriptor::cleanup() | LV2_Descriptor::connect_port() | +| LV2_Descriptor::extension_data() | LV2_Descriptor::activate() | | +| | LV2_Descriptor::deactivate() | | + +Hosts MUST guarantee that: + + * A function in any class is never called concurrently with another function + in that class. + + * A _Discovery_ function is never called concurrently with any other fuction + in the same shared object file. + + * An _Instantiation_ function for an instance is never called concurrently + with any other function for that instance. + +Any simultaneous calls that are not explicitly forbidden by these rules are +allowed. For example, a host may call `run()` for two different plugin +instances simultaneously. + +Plugin functions in any class MUST NOT manipulate any state which might affect +other plugins or the host (beyond the contract of that function), for example +by using non-reentrant global functions. + +Extensions to this specification which add new functions MUST declare in which +of these classes the functions belong, define new classes for them, or +otherwise precisely describe their threading rules. + +"""^^lv2:Markdown . + +lv2:Specification + lv2:documentation """ + +An LV2 specification typically contains a vocabulary description, C headers to +define an API, and any other resources that may be useful. Specifications, +like plugins, are distributed and installed as bundles so that hosts may +discover them. + +"""^^lv2:Markdown . + +lv2:Markdown + lv2:documentation """ + +This datatype is typically used for documentation in +[Markdown](https://daringfireball.net/projects/markdown/syntax) syntax. + +Generally, documentation with this datatype should stay as close to readable +plain text as possible, but may use core Markdown syntax for nicer +presentation. Documentation can assume that basic extensions like codehilite +and tables are available. + +"""^^lv2:Markdown . + +lv2:documentation + lv2:documentation """ + +Relates a Resource to extended documentation. + +LV2 specifications are documented using this property with an lv2:Markdown +datatype. + +If the value has no explicit datatype, it is assumed to be a valid XHTML Basic +1.1 fragment suitable for use as the content of the `body` element of a page. + +XHTML Basic is a W3C Recommendation which defines a simplified subset of XHTML +intended to be reasonable to implement with limited resources, for exampe on +embedded devices. See [XHTML Basic, Section +3](http://www.w3.org/TR/xhtml-basic/#s_xhtmlmodules) for a list of valid tags. + +"""^^lv2:Markdown . + +lv2:PluginBase + lv2:documentation """ + +An abstract plugin-like resource that may not actually be an LV2 plugin, for +example that may not have a lv2:binary. This is useful for describing things +that share common structure with a plugin, but are not themselves an actul +plugin, such as presets. + +"""^^lv2:Markdown . + +lv2:Plugin + lv2:documentation """ + +To be discovered by hosts, plugins MUST explicitly have an rdf:type of lv2:Plugin +in their bundle's manifest, for example: + + :::turtle + a lv2:Plugin . + +Plugins should have a doap:name property that is at most a few words in length +using title capitalization, for example Tape Delay Unit. + +"""^^lv2:Markdown . + +lv2:PortBase + lv2:documentation """ + +Similar to lv2:PluginBase, this is an abstract port-like resource that may not +be a fully specified LV2 port. For example, this is used for preset "ports" +which do not specify an index. + +"""^^lv2:Markdown . + +lv2:Port + lv2:documentation """ + +All LV2 port descriptions MUST have a rdf:type that is one of lv2:Port, +lv2:InputPort or lv2:OutputPort. Additionally, there MUST be at least one +other rdf:type which more precisely describes type of the port, for example +lv2:AudioPort. + +Hosts that do not support a specific port class MUST NOT instantiate the +plugin, unless that port has the lv2:connectionOptional property set. + +A port has two identifiers: a (numeric) index, and a (textual) symbol. The +index can be used as an identifier at run-time, but persistent references to +ports (for example in presets or save files) MUST use the symbol. Only the +symbol is guaranteed to refer to the same port on all plugins with a given URI, +that is the index for a port may differ between plugin binaries. + +"""^^lv2:Markdown . + +lv2:AudioPort + lv2:documentation """ + +Ports of this type are connected to a buffer of `float` audio samples, which +the host guarantees have `sample_count` elements in any call to +LV2_Descriptor::run(). + +Audio samples are normalized between -1.0 and 1.0, though there is no +requirement for samples to be strictly within this range. + +"""^^lv2:Markdown . + +lv2:CVPort + lv2:documentation """ + +Ports of this type have the same buffer format as an lv2:AudioPort, except the +buffer represents audio-rate control data rather than audio. Like a +lv2:ControlPort, a CV port SHOULD have properties describing its value, in +particular lv2:minimum, lv2:maximum, and lv2:default. + +Hosts may present CV ports to users as controls in the same way as control +ports. Conceptually, aside from the buffer format, a CV port is the same as a +control port, so hosts can use all the same properties and expectations. + +In particular, this port type does not imply any range, unit, or meaning for +its values. However, if there is no inherent unit to the values, for example +if the port is used to modulate some other value, then plugins SHOULD use a +normalized range, either from -1.0 to 1.0, or from 0.0 to 1.0. + +It is generally safe to connect an audio output to a CV input, but not +vice-versa. Hosts must take care to prevent data from a CVPort port from being +used as audio. + +"""^^lv2:Markdown . + +lv2:project + lv2:documentation """ + +This property provides a way to group plugins and/or related resources. A +project may have useful metadata common to all plugins (such as homepage, +author, version history) which would be wasteful to list separately for each +plugin. + +Grouping via projects also allows users to find plugins in hosts by project, +which is often how they are remembered. For this reason, a project that +contains plugins SHOULD always have a doap:name. It is also a good idea for +each plugin and the project itself to have an lv2:symbol property, which allows +nice quasi-global identifiers for plugins, for example `myproj.superamp` which +can be useful for display or fast user entry. + +"""^^lv2:Markdown . + +lv2:prototype + lv2:documentation """ + +This property can be used to include common properties in several +descriptions, serving as a sort of template mechanism. If a plugin has a +prototype, then the host must load all the properties for the prototype as if +they were properties of the plugin. That is, if `:plug lv2:prototype :prot`, +then for each triple `:prot p o`, the triple `:plug p o` should be loaded. + +This facility is useful for distributing data-only plugins that rely on a +common binary, for example those where the internal state is loaded from some +other file. Such plugins can refer to a prototype in a template LV2 bundle +which is installed by the corresponding software. + +"""^^lv2:Markdown . + +lv2:minorVersion + lv2:documentation """ + +This, along with lv2:microVersion, is used to distinguish between different +versions of the same resource, for example to load only the bundle with +the most recent version of a plugin. An LV2 version has a minor and micro +number with the usual semantics: + + * The minor version MUST be incremented when backwards (but not forwards) + compatible additions are made, for example the addition of a port to a + plugin. + + * The micro version is incremented for changes which do not affect + compatibility at all, for example bug fixes or documentation updates. + +Note that there is deliberately no major version: all versions with the same +URI are compatible by definition. Replacing a resource with a newer version of +that resource MUST NOT break anything. If a change violates this rule, then +the URI of the resource (which serves as the major version) MUST be changed. + +Plugins and extensions MUST adhere to at least the following rules: + + * All versions of a plugin with a given URI MUST have the same set of + mandatory (not lv2:connectionOptional) ports with respect to lv2:symbol and + rdf:type. In other words, every port on a particular version is guaranteed + to exist on a future version with same lv2:symbol and at least those + rdf:types. + + * New ports MAY be added without changing the plugin URI if and only if they + are lv2:connectionOptional and the minor version is incremented. + + * The minor version MUST be incremented if the index of any port (identified + by its symbol) is changed. + + * All versions of a specification MUST be compatible in the sense that an + implementation of the new version can interoperate with an implementation + of any previous version. + +Anything that depends on a specific version of a plugin (including referencing +ports by index) MUST refer to the plugin by both URI and version. However, +implementations should be tolerant where possible. + +When hosts discover several installed versions of a resource, they SHOULD warn +the user and load only the most recent version. + +An odd minor _or_ micro version, or minor version zero, indicates that the +resource is a development version. Hosts and tools SHOULD clearly indicate +this wherever appropriate. Minor version zero is a special case for +pre-release development of plugins, or experimental plugins that are not +intended for stable use at all. Hosts SHOULD NOT expect such a plugin to +remain compatible with any future version. Where feasible, hosts SHOULD NOT +expose such plugins to users by default, but may provide an option to display +them. + +"""^^lv2:Markdown . + +lv2:microVersion + lv2:documentation """ + +Releases of plugins and extensions MUST be explicitly versioned. Correct +version numbers MUST always be maintained for any versioned resource that is +published. For example, after a release, if a change is made in the development +version in source control, the micro version MUST be incremented (to an odd +number) to distinguish this modified version from the previous release. + +This property describes half of a resource version. For detailed documentation +on LV2 resource versioning, see lv2:minorVersion. + +"""^^lv2:Markdown . + +lv2:binary + lv2:documentation """ + +The value of this property must be the URI of a shared library object, +typically in the same bundle as the data file which contains this property. +The actual type of the library is platform specific. + +This is a required property of a lv2:Plugin which MUST be included in the +bundle's `manifest.ttl` file. The lv2:binary of a lv2:Plugin is the shared +object containing the lv2_descriptor() or lv2_lib_descriptor() function. This +probably may also be used similarly by extensions to relate other resources to +their implementations (it is not implied that a lv2:binary on an arbitrary +resource is an LV2 plugin library). + +"""^^lv2:Markdown . + +lv2:appliesTo + lv2:documentation """ + +This is primarily intended for discovery purposes: bundles that describe +resources that work with particular plugins (like presets or user interfaces) +SHOULD specify this in their `manifest.ttl` so the host can associate them with +the correct plugin. For example: + + :::turtle + + a ext:Thing ; + lv2:appliesTo ; + rdfs:seeAlso . + +Using this pattern is preferable for large amounts of data, since the host may +choose whether/when to load the data. + +"""^^lv2:Markdown . + +lv2:Symbol + lv2:documentation """ + +The first character of a symbol must be one of `_`, `a-z` or `A-Z`, and +subsequent characters may additionally be `0-9`. This is, among other things, +a valid C identifier, and generally compatible in most contexts which have +restrictions on string identifiers, such as file paths. + +"""^^lv2:Markdown . + +lv2:symbol + lv2:documentation """ + +The value of this property MUST be a valid lv2:Symbol, and MUST NOT have a +language tag. + +A symbol is a unique identifier with respect to the parent, for example a +port's symbol is a unique identifiers with respect to its plugin. The plugin +author MUST change the plugin URI if any port symbol is changed or removed. + +"""^^lv2:Markdown . + +lv2:name + lv2:documentation """ + +Unlike lv2:symbol, this is unrestricted, may be translated, and is not relevant +for compatibility. The name is not necessarily unique and MUST NOT be used as +an identifier. + +"""^^lv2:Markdown . + +lv2:shortName + lv2:documentation """ + +This is the same as lv2:name, with the additional requirement that the value is +shorter than 16 characters. + +"""^^lv2:Markdown . + +lv2:Designation + lv2:documentation """ + +A designation is metadata that describes the meaning or role of something. By +assigning a designation to a port using lv2:designation, the port's content +becomes meaningful and can be used more intelligently by the host. + +"""^^lv2:Markdown . + +lv2:Channel + lv2:documentation """ + +A specific channel, for example the left channel of a stereo stream. A +channel may be audio, or another type such as a MIDI control stream. + +"""^^lv2:Markdown . + +lv2:Parameter + lv2:documentation """ + +A parameter is a designation for a control. + +A parameter defines the meaning of a control, not the method of conveying its +value. For example, a parameter could be controlled via a lv2:ControlPort, +messages, or both. + +A lv2:ControlPort can be associated with a parameter using lv2:designation. + +"""^^lv2:Markdown . + +lv2:designation + lv2:documentation """ + +This property is used to give a port's contents a well-defined meaning. For +example, if a port has the designation `eg:gain`, then the value of that port +represents the `eg:gain` of the plugin instance. + +Ports should be given designations whenever possible, particularly if a +suitable designation is already defined. This allows the host to act more +intelligently and provide a more effective user interface. For example, if the +plugin has a BPM parameter, the host may automatically set that parameter to +the current tempo. + +"""^^lv2:Markdown . + +lv2:freeWheeling + lv2:documentation """ + +If true, this means that all processing is happening as quickly as possible, +not in real-time. When free-wheeling there is no relationship between the +passage of real wall-clock time and the passage of time in the data being +processed. + +"""^^lv2:Markdown . + +lv2:enabled + lv2:documentation """ + +If this value is greater than zero, the plugin processes normally. If this +value is zero, the plugin is expected to bypass all signals unmodified. The +plugin must provide a click-free transition between the enabled and disabled +(bypassed) states. + +Values less than zero are reserved for future use (such as click-free +insertion/removal of latent plugins), and should be treated like zero +(bypassed) by current implementations. + +"""^^lv2:Markdown . + +lv2:control + lv2:documentation """ + +This should be used as the lv2:designation of ports that are used to send +commands and receive responses. Typically this will be an event port that +supports some protocol, for example MIDI or LV2 Atoms. + +"""^^lv2:Markdown . + +lv2:Point + lv2:documentation """ + + * A Point MUST have at least one rdfs:label which is a string. + + * A Point MUST have exactly one rdf:value with a type that is compatible with + the type of the corresponding Port. + +"""^^lv2:Markdown . + +lv2:default + lv2:documentation """ + +The host SHOULD set the port to this value initially, and in any situation +where the port value should be cleared or reset. + +"""^^lv2:Markdown . + +lv2:minimum + lv2:documentation """ + +This is a soft limit: the plugin is required to gracefully accept all values in +the range of a port's data type. + +"""^^lv2:Markdown . + +lv2:maximum + lv2:documentation """ + +This is a soft limit: the plugin is required to gracefully accept all values in +the range of a port's data type. + +"""^^lv2:Markdown . + +lv2:optionalFeature + lv2:documentation """ + +To support this feature, the host MUST pass its URI and any additional data to +the plugin in LV2_Descriptor::instantiate(). + +The plugin MUST NOT fail to instantiate if an optional feature is not supported +by the host. + +"""^^lv2:Markdown . + +lv2:requiredFeature + lv2:documentation """ + +To support this feature, the host MUST pass its URI and any additional data to +the plugin in LV2_Descriptor::instantiate(). + +The host MUST check this property before attempting to instantiate a plugin, +and not attempt to instantiate plugins which require features it does not +support. The plugin MUST fail to instantiate if a required feature is not +supported by the host. Note that these rules are intentionally redundant for +resilience: neither host nor plugin should assume that the other does not +violate them. + +"""^^lv2:Markdown . + +lv2:ExtensionData + lv2:documentation """ + +This is additional data that a plugin may return from +LV2_Descriptor::extension_data(). This is generally used to add APIs to extend +that defined by LV2_Descriptor. + +"""^^lv2:Markdown . + +lv2:extensionData + lv2:documentation """ + +If a plugin has a value for this property, it must be a URI that defines the +extension data. The plugin should return the appropriate data when +LV2_Descriptor::extension_data() is called with that URI as a parameter. + +"""^^lv2:Markdown . + +lv2:isLive + lv2:documentation """ + +This feature is for plugins that have time-sensitive internals, for example +communicating in real time over a socket. It indicates to the host that its +input and output must not be cached or subject to significant latency, and that +calls to LV2_Descriptor::run() should be made at a rate that roughly +corresponds to wall clock time (according to the `sample_count` parameter). + +Note that this feature is not related to hard real-time execution +requirements (see lv2:hardRTCapable). + +"""^^lv2:Markdown . + +lv2:inPlaceBroken + lv2:documentation """ + +This feature indicates that the plugin may not work correctly if the host +elects to use the same data location for both input and output. Plugins that +will fail to work correctly if ANY input port is connected to the same location +as ANY output port MUST require this feature. Doing so should be avoided +whenever possible since it prevents hosts from running the plugin on data +in-place. + +"""^^lv2:Markdown . + +lv2:hardRTCapable + lv2:documentation """ + +This feature indicates that the plugin is capable of running in a hard +real-time environment. This should be the case for most audio processors, +so most plugins are expected to have this feature. + +To support this feature, plugins MUST adhere to the following in all of their +audio class functions (LV2_Descriptor::run() and +LV2_Descriptor::connect_port()): + + * There is no use of `malloc()`, `free()` or any other heap memory management + functions. + + * There is no use of any library functions which do not adhere to these + rules. The plugin may assume that the standard C math library functions + are safe. + + * There is no access to files, devices, pipes, sockets, system calls, or any + other mechanism that might result in the process or thread blocking. + + * The maximum amount of time for a `run()` call is bounded by some expression + of the form `A + B * sample_count`, where `A` and `B` are platform specific + constants. Note that this bound does not depend on input signals or plugin + state. + +"""^^lv2:Markdown . + +lv2:portProperty + lv2:documentation """ + +States that a port has a particular lv2:PortProperty. This may be ignored +without catastrophic effects, though it may be useful, for example to provide a +sensible user interface for the port. + +"""^^lv2:Markdown . + +lv2:connectionOptional + lv2:documentation """ + +This property means that the port does not have to be connected to valid data +by the host. To leave a port unconnected, the host MUST explicitly +connect the port to `NULL`. + +"""^^lv2:Markdown . + +lv2:reportsLatency + lv2:documentation """ + +This property indicates that the port is used to express the processing latency +incurred by the plugin, expressed in samples. The latency may be affected by +the current sample rate, plugin settings, or other factors, and may be changed +by the plugin at any time. Where the latency is frequency dependent the plugin +may choose any appropriate value. If a plugin introduces latency it MUST +provide EXACTLY ONE port with this property set. In fuzzy cases the +value should be the most reasonable one based on user expectation of +input/output alignment. For example, musical delay plugins should not report +their delay as latency, since it is an intentional effect that the host should +not compensate for. + +This property is deprecated, use a lv2:designation of lv2:latency instead, +following the same rules as above: + + :::turtle + + lv2:port [ + a lv2:OutputPort , lv2:ControlPort ; + lv2:designation lv2:latency ; + lv2:symbol "latency" ; + ] + +"""^^lv2:Markdown . + +lv2:toggled + lv2:documentation """ + +Indicates that the data item should be considered a boolean toggle. Data less +than or equal to zero should be considered off or false, and data +above zero should be considered on or true. + +"""^^lv2:Markdown . + +lv2:sampleRate + lv2:documentation """ + +Indicates that any specified bounds should be interpreted as multiples of the +sample rate. For example, a frequency range from 0 Hz to the Nyquist frequency +(half the sample rate) can be specified by using this property with lv2:minimum +0.0 and lv2:maximum 0.5. Hosts that support bounds at all MUST support this +property. + +"""^^lv2:Markdown . + +lv2:integer + lv2:documentation """ + +Indicates that all the reasonable values for a port are integers. For such +ports, a user interface should provide a stepped control that only allows +choosing integer values. + +Note that this is only a hint, and that the plugin MUST operate reasonably even +if such a port has a non-integer value. + +"""^^lv2:Markdown . + +lv2:enumeration + lv2:documentation """ + +Indicates that all the rasonable values for a port are defined by +lv2:scalePoint properties. For such ports, a user interface should provide a selector that allows the user to choose any of the scale point values by name. It is recommended to show the value as well if possible. + +Note that this is only a hint, and that the plugin MUST operate reasonably even +if such a port has a value that does not correspond to a scale point. + +"""^^lv2:Markdown . + +lv2:isSideChain + lv2:documentation """ + +Indicates that a port is a sidechain, which affects the output somehow +but should not be considered a part of the main signal chain. Sidechain ports +SHOULD be lv2:connectionOptional, and may be ignored by hosts. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.ttl new file mode 100644 index 00000000..f5836c6e --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/lv2core.ttl @@ -0,0 +1,674 @@ +@prefix doap: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2" ; + rdfs:comment "An extensible open standard for audio plugins." ; + rdfs:seeAlso , + , + . + +lv2:Specification + a rdfs:Class , + owl:Class ; + rdfs:subClassOf doap:Project ; + rdfs:label "Specification" ; + rdfs:comment "An LV2 specifiation." . + +lv2:Markdown + a rdfs:Datatype ; + owl:onDatatype xsd:string ; + rdfs:label "Markdown" ; + rdfs:comment "A string in Markdown syntax." . + +lv2:documentation + a rdf:Property , + owl:AnnotationProperty ; + rdfs:range rdfs:Literal ; + rdfs:label "documentation" ; + rdfs:comment "Extended documentation." ; + rdfs:seeAlso . + +lv2:PluginBase + a rdfs:Class , + owl:Class ; + rdfs:label "Plugin Base" ; + rdfs:comment "Base class for a plugin-like resource." . + +lv2:Plugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:PluginBase ; + rdfs:label "Plugin" ; + rdfs:comment "An LV2 plugin." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty doap:name ; + owl:someValuesFrom rdf:PlainLiteral ; + rdfs:comment "A plugin MUST have at least one untranslated doap:name." + ] , [ + a owl:Restriction ; + owl:onProperty lv2:port ; + owl:allValuesFrom lv2:Port ; + rdfs:comment "All ports on a plugin MUST be fully specified lv2:Port instances." + ] . + +lv2:PortBase + a rdfs:Class , + owl:Class ; + rdfs:label "Port Base" ; + rdfs:comment "Base class for a port-like resource." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:symbol ; + owl:cardinality 1 ; + rdfs:comment "A port MUST have exactly one lv2:symbol." + ] . + +lv2:Port + a rdfs:Class , + owl:Class ; + rdfs:label "Port" ; + rdfs:comment "An LV2 plugin port." ; + rdfs:subClassOf lv2:PortBase , + [ + a owl:Restriction ; + owl:onProperty lv2:name ; + owl:minCardinality 1 ; + rdfs:comment "A port MUST have at least one lv2:name." + ] . + +lv2:InputPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Input Port" ; + rdfs:comment "A port connected to constant data which is read during `run()`." . + +lv2:OutputPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Output Port" ; + rdfs:comment "A port connected to data which is written during `run()`." . + +lv2:ControlPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Control Port" ; + rdfs:comment "A port connected to a single `float`." . + +lv2:AudioPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Audio Port" ; + rdfs:comment "A port connected to an array of float audio samples." . + +lv2:CVPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "CV Port" ; + rdfs:comment "A port connected to an array of float control values." . + +lv2:port + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:PluginBase ; + rdfs:range lv2:PortBase ; + rdfs:label "port" ; + rdfs:comment "A port (input or output) on this plugin." . + +lv2:project + a rdf:Property , + owl:ObjectProperty ; + rdfs:range doap:Project ; + rdfs:label "project" ; + rdfs:comment "The project this is a part of." . + +lv2:prototype + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "prototype" ; + rdfs:comment "The prototype to inherit properties from." . + +lv2:minorVersion + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "minor version" ; + rdfs:comment "The minor version of this resource." . + +lv2:microVersion + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "micro version" ; + rdfs:comment "The micro version of this resource." . + +lv2:binary + a rdf:Property , + owl:ObjectProperty ; + rdfs:range owl:Thing ; + rdfs:label "binary" ; + rdfs:comment "The binary of this resource." . + +lv2:appliesTo + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:Plugin ; + rdfs:label "applies to" ; + rdfs:comment "The plugin this resource is related to." . + +lv2:index + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:range xsd:unsignedInt ; + rdfs:label "index" ; + rdfs:comment "A non-negative zero-based 32-bit index." . + +lv2:Symbol + a rdfs:Datatype ; + owl:onDatatype xsd:string ; + owl:withRestrictions ( + [ + xsd:pattern "[_a-zA-Z][_a-zA-Z0-9]*" + ] + ) ; + rdfs:label "Symbol" ; + rdfs:comment "A short restricted name used as a strong identifier." . + +lv2:symbol + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "symbol" ; + rdfs:range lv2:Symbol , + rdf:PlainLiteral ; + rdfs:comment "The symbol that identifies this resource in the context of its parent." . + +lv2:name + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "name" ; + rdfs:range xsd:string ; + rdfs:comment "A display name for labeling in a user interface." . + +lv2:shortName + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "short name" ; + rdfs:range xsd:string ; + rdfs:comment "A short display name for labeling in a user interface." . + +lv2:Designation + a rdfs:Class , + owl:Class ; + rdfs:subClassOf rdf:Property ; + rdfs:label "Designation" ; + rdfs:comment "A designation which defines the meaning of some data." . + +lv2:Channel + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Designation ; + rdfs:label "Channel" ; + rdfs:comment "An individual channel, such as left or right." . + +lv2:Parameter + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Designation , + rdf:Property ; + rdfs:label "Parameter" ; + rdfs:comment "A property that is a plugin parameter." . + +lv2:designation + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:range rdf:Property ; + rdfs:label "designation" ; + rdfs:comment "The designation that defines the meaning of this input or output." . + +lv2:latency + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "latency" ; + rdfs:comment "The latency introduced, in frames." . + +lv2:freeWheeling + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "free-wheeling" ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether processing is currently free-wheeling." . + +lv2:enabled + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "enabled" ; + rdfs:range xsd:int ; + rdfs:comment "Whether processing is currently enabled (not bypassed)." . + +lv2:control + a lv2:Channel ; + rdfs:label "control" ; + rdfs:comment "The primary control channel." . + +lv2:Point + a rdfs:Class , + owl:Class ; + rdfs:label "Point" ; + rdfs:comment "An interesting point in a value range." . + +lv2:ScalePoint + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Point ; + rdfs:label "Scale Point" ; + rdfs:comment "A single `float` Point for control inputs." . + +lv2:scalePoint + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:ScalePoint ; + rdfs:label "scale point" ; + rdfs:comment "A scale point of a port or parameter." . + +lv2:default + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "default" ; + rdfs:comment "The default value for this control." . + +lv2:minimum + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "minimum" ; + rdfs:comment "The minimum value for this control." . + +lv2:maximum + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "maximum" ; + rdfs:comment "The maximum value for this control." . + +lv2:Feature + a rdfs:Class , + owl:Class ; + rdfs:label "Feature" ; + rdfs:comment "An additional feature which may be used or required." . + +lv2:optionalFeature + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:Feature ; + rdfs:label "optional feature" ; + rdfs:comment "An optional feature that is supported if available." . + +lv2:requiredFeature + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:Feature ; + rdfs:label "required feature" ; + rdfs:comment "A required feature that must be available to run." . + +lv2:ExtensionData + a rdfs:Class , + owl:Class ; + rdfs:label "Extension Data" ; + rdfs:comment "Additional data defined by an extension." . + +lv2:extensionData + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:ExtensionData ; + rdfs:label "extension data" ; + rdfs:comment "Extension data provided by a plugin or other binary." . + +lv2:isLive + a lv2:Feature ; + rdfs:label "is live" ; + rdfs:comment "Plugin has a real-time dependency." . + +lv2:inPlaceBroken + a lv2:Feature ; + rdfs:label "in-place broken" ; + rdfs:comment "Plugin requires separate locations for input and output." . + +lv2:hardRTCapable + a lv2:Feature ; + rdfs:label "hard real-time capable" ; + rdfs:comment "Plugin is capable of running in a hard real-time environment." . + +lv2:PortProperty + a rdfs:Class , + owl:Class ; + rdfs:label "Port Property" ; + rdfs:comment "A particular property that a port has." . + +lv2:portProperty + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:Port ; + rdfs:range lv2:PortProperty ; + rdfs:label "port property" ; + rdfs:comment "A property of this port hosts may find useful." . + +lv2:connectionOptional + a lv2:PortProperty ; + rdfs:label "connection optional" ; + rdfs:comment "The property that this port may be connected to NULL." . + +lv2:reportsLatency + a lv2:PortProperty ; + owl:deprecated "true"^^xsd:boolean ; + rdfs:label "reports latency" ; + rdfs:comment "Control port value is the plugin latency in frames." . + +lv2:toggled + a lv2:PortProperty ; + rdfs:label "toggled" ; + rdfs:comment "Control port value is considered a boolean toggle." . + +lv2:sampleRate + a lv2:PortProperty ; + rdfs:label "sample rate" ; + rdfs:comment "Control port bounds are interpreted as multiples of the sample rate." . + +lv2:integer + a lv2:PortProperty ; + rdfs:label "integer" ; + rdfs:comment "Control port values are treated as integers." . + +lv2:enumeration + a lv2:PortProperty ; + rdfs:label "enumeration" ; + rdfs:comment "Control port scale points represent all useful values." . + +lv2:isSideChain + a lv2:PortProperty ; + rdfs:label "is side-chain" ; + rdfs:comment "Signal for port should not be considered a main input or output." . + +lv2:GeneratorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Generator Plugin" ; + rdfs:comment "A plugin that generates new sound internally." . + +lv2:InstrumentPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Instrument Plugin" ; + rdfs:comment "A plugin intended to be played as a musical instrument." . + +lv2:OscillatorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Oscillator Plugin" ; + rdfs:comment "A plugin that generates output with an oscillator." . + +lv2:UtilityPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Utility Plugin" ; + rdfs:comment "A utility plugin that is not a typical audio effect or generator." . + +lv2:ConverterPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Converter Plugin" ; + rdfs:comment "A plugin that converts its input into a different form." . + +lv2:AnalyserPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Analyser Plugin" ; + rdfs:comment "A plugin that analyses its input and emits some useful information." . + +lv2:MixerPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Mixer Plugin" ; + rdfs:comment "A plugin that mixes some number of inputs into some number of outputs." . + +lv2:SimulatorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Simulator Plugin" ; + rdfs:comment "A plugin that aims to emulate some environmental effect or musical equipment." . + +lv2:DelayPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Delay Plugin" ; + rdfs:comment "An effect that intentionally delays its input as an effect." . + +lv2:ModulatorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Modulator Plugin" ; + rdfs:comment "An effect that modulats its input as an effect." . + +lv2:ReverbPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin , + lv2:SimulatorPlugin , + lv2:DelayPlugin ; + rdfs:label "Reverb Plugin" ; + rdfs:comment "An effect that adds reverberation to its input." . + +lv2:PhaserPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Phaser Plugin" ; + rdfs:comment "An effect that periodically sweeps a filter over its input." . + +lv2:FlangerPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Flanger Plugin" ; + rdfs:comment "An effect that mixes slightly delayed copies of its input." . + +lv2:ChorusPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Chorus Plugin" ; + rdfs:comment "An effect that mixes significantly delayed copies of its input." . + +lv2:FilterPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Filter Plugin" ; + rdfs:comment "An effect that manipulates the frequency spectrum of its input." . + +lv2:LowpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Lowpass Filter Plugin" ; + rdfs:comment "A filter that attenuates frequencies above some cutoff." . + +lv2:BandpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Bandpass Filter Plugin" ; + rdfs:comment "A filter that attenuates frequencies outside of some band." . + +lv2:HighpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Highpass Filter Plugin" ; + rdfs:comment "A filter that attenuates frequencies below some cutoff." . + +lv2:CombPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Comb FilterPlugin" ; + rdfs:comment "A filter that adds a delayed version of its input to itself." . + +lv2:AllpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Allpass Plugin" ; + rdfs:comment "A filter that changes the phase relationship between frequency components." . + +lv2:EQPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Equaliser Plugin" ; + rdfs:comment "A plugin that adjusts the balance between frequency components." . + +lv2:ParaEQPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:EQPlugin ; + rdfs:label "Parametric EQ Plugin" ; + rdfs:comment "A plugin that adjusts the balance between configurable frequency components." . + +lv2:MultiEQPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:EQPlugin ; + rdfs:label "Multiband EQ Plugin" ; + rdfs:comment "A plugin that adjusts the balance between a fixed set of frequency components." . + +lv2:SpatialPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Spatial Plugin" ; + rdfs:comment "A plugin that manipulates the position of audio in space." . + +lv2:SpectralPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Spectral Plugin" ; + rdfs:comment "A plugin that alters the spectral properties of audio." . + +lv2:PitchPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:SpectralPlugin ; + rdfs:label "Pitch Shifter Plugin" ; + rdfs:comment "A plugin that shifts the pitch of its input." . + +lv2:AmplifierPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Amplifier Plugin" ; + rdfs:comment "A plugin that primarily changes the volume of its input." . + +lv2:EnvelopePlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Envelope Plugin" ; + rdfs:comment "A plugin that applies an envelope to its input." . + +lv2:DistortionPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Distortion Plugin" ; + rdfs:comment "A plugin that adds distortion to its input." . + +lv2:WaveshaperPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DistortionPlugin ; + rdfs:label "Waveshaper Plugin" ; + rdfs:comment "An effect that alters the shape of input waveforms." . + +lv2:DynamicsPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Dynamics Plugin" ; + rdfs:comment "A plugin that alters the envelope or dynamic range of its input." . + +lv2:CompressorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Compressor Plugin" ; + rdfs:comment "A plugin that reduces the dynamic range of its input." . + +lv2:ExpanderPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Expander Plugin" ; + rdfs:comment "A plugin that expands the dynamic range of its input." . + +lv2:LimiterPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Limiter Plugin" ; + rdfs:comment "A plugin that limits its input to some maximum level." . + +lv2:GatePlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Gate Plugin" ; + rdfs:comment "A plugin that attenuates signals below some threshold." . + +lv2:FunctionPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Function Plugin" ; + rdfs:comment "A plugin whose output is a mathmatical function of its input." . + +lv2:ConstantPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Constant Plugin" ; + rdfs:comment "A plugin that emits constant values." . + +lv2:MIDIPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "MIDI Plugin" ; + rdfs:comment "A plugin that primarily processes MIDI messages." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/manifest.ttl new file mode 100644 index 00000000..7f1512bf --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/manifest.ttl @@ -0,0 +1,15 @@ +@prefix doap: . +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 18 ; + lv2:microVersion 0 ; + rdfs:seeAlso . + + + a doap:Project ; + rdfs:seeAlso , + . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/meta.ttl new file mode 100644 index 00000000..b626a0c9 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/meta.ttl @@ -0,0 +1,199 @@ +@prefix dcs: . +@prefix doap: . +@prefix lv2: . +@prefix meta: . +@prefix rdf: . +@prefix rdfs: . + + + rdf:value """ +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +""" . + + + a doap:Project ; + lv2:symbol "lv2" ; + rdfs:label "LV2" ; + rdfs:comment "The LV2 Plugin Interface Project." ; + doap:name "LV2" ; + doap:license ; + doap:shortdesc "The LV2 Plugin Interface Project." ; + doap:description "LV2 is a plugin standard for audio systems. It defines a minimal yet extensible C API for plugin code and a format for plugin bundles" ; + doap:created "2006-05-10" ; + doap:homepage ; + doap:mailing-list ; + doap:programming-language "C" ; + doap:repository [ + a doap:SVNRepository ; + doap:location + ] ; + doap:developer , + ; + doap:helper meta:larsl , + meta:bmwiedemann , + meta:gabrbedd , + meta:daste , + meta:kfoltman , + meta:paniq ; + doap:release [ + doap:revision "1.18.2" ; + doap:created "2021-01-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "eg-sampler: Save and restore gain parameter value." + ] , [ + rdfs:label "Various code cleanups and infrastructure improvements." + ] + ] + ] , [ + doap:revision "1.18.0" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] , [ + rdfs:label "Separate extended documentation from primary data." + ] + ] + ] , [ + doap:revision "1.16.0" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add core/attributes.h utility header." + ] , [ + rdfs:label "eg-sampler: Add waveform display to UI." + ] , [ + rdfs:label "eg-midigate: Respond to \"all notes off\" MIDI message." + ] , [ + rdfs:label "Simplify use of lv2specgen." + ] , [ + rdfs:label "Add lv2_validate utility." + ] , [ + rdfs:label "Install headers to simpler paths." + ] , [ + rdfs:label "Aggressively deprecate uri-map and event extensions." + ] , [ + rdfs:label "Upgrade build system and fix building with Python 3.7." + ] + ] + ] , [ + doap:revision "1.14.0" ; + doap:created "2016-09-19" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label """eg-scope: Don't feed back UI state updates.""" + ] , [ + rdfs:label "eg-sampler: Fix handling of state file paths." + ] , [ + rdfs:label "eg-sampler: Support thread-safe state restoration." + ] + ] + ] , [ + doap:revision "1.12.0" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "eg-sampler: Support patch:Get, and request initial state from UI." + ] , [ + rdfs:label "eg-sampler: Add gain parameter." + ] , [ + rdfs:label "Fix merging of version histories in specification documentation." + ] , [ + rdfs:label "Improve API documentation." + ] , [ + rdfs:label "Simplify property restrictions by removing redundancy." + ] + ] + ] , [ + doap:revision "1.10.0" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "lv2specgen: Display deprecated warning on classes marked owl:deprecated." + ] , [ + rdfs:label "Fix -Wconversion warnings in headers." + ] , [ + rdfs:label "Upgrade to waf 1.7.16." + ] + ] + ] , [ + doap:revision "1.8.0" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add scope example plugin from Robin Gareus." + ] , [ + rdfs:label "lv2specgen: Fix links to externally defined terms." + ] , [ + rdfs:label "Install lv2specgen for use by other projects." + ] + ] + ] , [ + doap:revision "1.6.0" ; + doap:created "2013-08-09" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix port indices of metronome example." + ] , [ + rdfs:label "Fix lv2specgen usage from command line." + ] , [ + rdfs:label "Upgrade to waf 1.7.11." + ] + ] + ] , [ + doap:revision "1.4.0" ; + doap:created "2013-02-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add metronome example plugin to demonstrate sample accurate tempo sync." + ] , [ + rdfs:label "Generate book-style HTML documentation from example plugins." + ] + ] + ] , [ + doap:revision "1.2.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Move all project metadata for extensions (e.g. change log) to separate files to spare hosts from loading them during discovery." + ] , [ + rdfs:label "Use stricter datatype definitions conformant with the XSD and OWL specifications for better validation." + ] + ] + ] , [ + doap:revision "1.0.0" ; + doap:created "2012-04-16" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label """Initial release as a unified project. Projects can now simply depend on the pkg-config package 'lv2' for all official LV2 APIs.""" + ] , [ + rdfs:label "New extensions: atom, log, parameters, patch, port-groups, port-props, resize-port, state, time, worker." + ] + ] + ] . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/people.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/people.ttl new file mode 100644 index 00000000..52d0384e --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/core/people.ttl @@ -0,0 +1,51 @@ +@prefix foaf: . +@prefix meta: . +@prefix rdfs: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:mbox ; + rdfs:seeAlso . + + + a foaf:Person ; + foaf:name "Steve Harris" ; + foaf:mbox ; + rdfs:seeAlso . + +meta:larsl + a foaf:Person ; + foaf:name "Lars Luthman" ; + foaf:mbox . + +meta:gabrbedd + a foaf:Person ; + foaf:name "Gabriel M. Beddingfield" ; + foaf:mbox . + +meta:daste + a foaf:Person ; + foaf:name """Stefano D'Angelo""" ; + foaf:mbox . + +meta:kfoltman + a foaf:Person ; + foaf:name "Krzysztof Foltman" ; + foaf:mbox . + +meta:paniq + a foaf:Person ; + foaf:name "Leonard Ritter" ; + foaf:mbox . + +meta:harry + a foaf:Person ; + foaf:name "Harry van Haaren" ; + foaf:mbox . + +meta:bmwiedemann + a foaf:Person ; + foaf:name "Bernhard M. Wiedemann" ; + foaf:mbox . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h new file mode 100644 index 00000000..de3b6b65 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.h @@ -0,0 +1,73 @@ +/* + Copyright 2008-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_DATA_ACCESS_H +#define LV2_DATA_ACCESS_H + +/** + @defgroup data-access Data Access + @ingroup lv2 + + Access to plugin extension_data() for UIs. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_DATA_ACCESS_URI "http://lv2plug.in/ns/ext/data-access" ///< http://lv2plug.in/ns/ext/data-access +#define LV2_DATA_ACCESS_PREFIX LV2_DATA_ACCESS_URI "#" ///< http://lv2plug.in/ns/ext/data-access# + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +/** + The data field of the LV2_Feature for this extension. + + To support this feature the host must pass an LV2_Feature struct to the + instantiate method with URI "http://lv2plug.in/ns/ext/data-access" + and data pointed to an instance of this struct. +*/ +typedef struct { + /** + A pointer to a method the UI can call to get data (of a type specified + by some other extension) from the plugin. + + This call never is never guaranteed to return anything, UIs should + degrade gracefully if direct access to the plugin data is not possible + (in which case this function will return NULL). + + This is for access to large data that can only possibly work if the UI + and plugin are running in the same process. For all other things, use + the normal LV2 UI communication system. + */ + const void* (*data_access)(const char* uri); +} LV2_Extension_Data_Feature; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_DATA_ACCESS_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.meta.ttl new file mode 100644 index 00000000..3184110c --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.meta.ttl @@ -0,0 +1,77 @@ +@prefix da: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + rdfs:seeAlso ; + doap:license ; + doap:name "LV2 Data Access" ; + doap:shortdesc "Provides access to plugin extension data." ; + doap:created "2008-00-00" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature, LV2_Extension_Data_Feature, which provides +access to LV2_Descriptor::extension_data() for plugin UIs or other potentially +remote users of a plugin. + +Note that the use of this extension by UIs violates the important principle of +UI/plugin separation, and is potentially a source of many problems. +Accordingly, **use of this extension is highly discouraged**, and plugins +should not expect hosts to support it, since it is often impossible to do so. + +To support this feature the host must pass an LV2_Feature struct to +LV2_Descriptor::extension_data() with URI LV2_DATA_ACCESS_URI and data pointed +to an instance of LV2_Extension_Data_Feature. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.ttl new file mode 100644 index 00000000..0185cd0d --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/data-access.ttl @@ -0,0 +1,11 @@ +@prefix da: . +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Feature ; + rdfs:label "data access" ; + rdfs:comment "A feature that provides access to plugin extension data." ; + rdfs:seeAlso , + . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/manifest.ttl new file mode 100644 index 00000000..9585a5e4 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/data-access/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h new file mode 100644 index 00000000..6181f71e --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.h @@ -0,0 +1,160 @@ +/* + Dynamic manifest specification for LV2 + Copyright 2008-2011 Stefano D'Angelo + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_DYN_MANIFEST_H_INCLUDED +#define LV2_DYN_MANIFEST_H_INCLUDED + +/** + @defgroup dynmanifest Dynamic Manifest + @ingroup lv2 + + Support for dynamic data generation. + + See for details. + + @{ +*/ + +#include "lv2/core/lv2.h" + +#include + +// clang-format off + +#define LV2_DYN_MANIFEST_URI "http://lv2plug.in/ns/ext/dynmanifest" ///< http://lv2plug.in/ns/ext/dynmanifest +#define LV2_DYN_MANIFEST_PREFIX LV2_DYN_MANIFEST_URI "#" ///< http://lv2plug.in/ns/ext/dynmanifest# + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Dynamic manifest generator handle. + + This handle indicates a particular status of a dynamic manifest generator. + The host MUST NOT attempt to interpret it and, unlikely LV2_Handle, it is + NOT even valid to compare this to NULL. The dynamic manifest generator MAY + use it to reference internal data. +*/ +typedef void* LV2_Dyn_Manifest_Handle; + +/** + Generate the dynamic manifest. + + @param handle Pointer to an uninitialized dynamic manifest generator handle. + + @param features NULL terminated array of LV2_Feature structs which represent + the features the host supports. The dynamic manifest generator may refuse to + (re)generate the dynamic manifest if required features are not found here + (however hosts SHOULD NOT use this as a discovery mechanism, instead of + reading the static manifest file). This array must always exist; if a host + has no features, it MUST pass a single element array containing NULL. + + @return 0 on success, otherwise a non-zero error code. The host SHOULD + evaluate the result of the operation by examining the returned value and + MUST NOT try to interpret the value of handle. +*/ +int +lv2_dyn_manifest_open(LV2_Dyn_Manifest_Handle* handle, + const LV2_Feature* const* features); + +/** + Fetch a "list" of subject URIs described in the dynamic manifest. + + The dynamic manifest generator has to fill the resource only with the needed + triples to make the host aware of the "objects" it wants to expose. For + example, if the plugin library exposes a regular LV2 plugin, it should + output only a triple like the following: + + a lv2:Plugin . + + The objects that are elegible for exposure are those that would need to be + represented by a subject node in a static manifest. + + @param handle Dynamic manifest generator handle. + + @param fp FILE * identifying the resource the host has to set up for the + dynamic manifest generator. The host MUST pass a writable, empty resource to + this function, and the dynamic manifest generator MUST ONLY perform write + operations on it at the end of the stream (for example, using only + fprintf(), fwrite() and similar). + + @return 0 on success, otherwise a non-zero error code. +*/ +int +lv2_dyn_manifest_get_subjects(LV2_Dyn_Manifest_Handle handle, FILE* fp); + +/** + Function that fetches data related to a specific URI. + + The dynamic manifest generator has to fill the resource with data related to + object represented by the given URI. For example, if the library exposes a + regular LV2 plugin whose URI, as retrieved by the host using + lv2_dyn_manifest_get_subjects() is http://example.org/plugin then it + should output something like: + +
+   
+       a lv2:Plugin ;
+       doap:name "My Plugin" ;
+       lv2:binary  ;
+       etc:etc "..." .
+   
+ + @param handle Dynamic manifest generator handle. + + @param fp FILE * identifying the resource the host has to set up for the + dynamic manifest generator. The host MUST pass a writable resource to this + function, and the dynamic manifest generator MUST ONLY perform write + operations on it at the current position of the stream (for example, using + only fprintf(), fwrite() and similar). + + @param uri URI to get data about (in the "plain" form, i.e., absolute URI + without Turtle prefixes). + + @return 0 on success, otherwise a non-zero error code. +*/ +int +lv2_dyn_manifest_get_data(LV2_Dyn_Manifest_Handle handle, + FILE* fp, + const char* uri); + +/** + Function that ends the operations on the dynamic manifest generator. + + This function SHOULD be used by the dynamic manifest generator to perform + cleanup operations, etc. + + Once this function is called, referring to handle will cause undefined + behavior. + + @param handle Dynamic manifest generator handle. +*/ +void +lv2_dyn_manifest_close(LV2_Dyn_Manifest_Handle handle); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_DYN_MANIFEST_H_INCLUDED */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.meta.ttl new file mode 100644 index 00000000..4e66d98a --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.meta.ttl @@ -0,0 +1,131 @@ +@prefix dcs: . +@prefix dman: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Dynamic Manifest" ; + doap:homepage ; + doap:created "2009-06-13" ; + doap:shortdesc "Support for dynamic manifest data generation." ; + doap:programming-language "C" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-04-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +The LV2 API, on its own, cannot be used to write plugin libraries where data is +dynamically generated at runtime, since LV2 requires needed information to be +provided in one or more static data (RDF) files. This API addresses this +limitation by extending the LV2 API. + +To detect that a plugin library implements a dynamic manifest generator, the +host checks its static manifest for a description like: + + :::turtle + + a dman:DynManifest ; + lv2:binary . + +To load the data, the host loads the library (`mydynmanifest.so` in this +example) as usual and fetches the dynamic Turtle data from it using this API. + +The host is allowed to request regeneration of the dynamic manifest multiple +times, and the plugin library is expected to provide updated data if/when +possible. All data and references provided via this API before the last +regeneration of the dynamic manifest is to be considered invalid by the host, +including plugin descriptors whose URIs were discovered using this API. + +### Accessing Data + +To access data using this API, the host must: + + 1. Call lv2_dyn_manifest_open(). + + 2. Create a `FILE` for functions to write data to (for example with `tmpfile()`). + + 3. Get a list of exposed subject URIs using lv2_dyn_manifest_get_subjects(). + + 4. Call lv2_dyn_manifest_get_data() for each URI of interest to write the + related data to the file. + + 5. Call lv2_dyn_manifest_close(). + + 6. Parse the content of the file(s). + + 7. Remove the file(s). + +Each call to the above mentioned dynamic manifest functions MUST write a +complete, valid Turtle document (including all needed prefix definitions) to +the output FILE. + +Each call to lv2_dyn_manifest_open() causes the (re)generation of the dynamic +manifest data, and invalidates all data fetched before the call. + +In case the plugin library uses this same API to access other dynamic +manifests, it MUST implement some mechanism to avoid potentially endless loops +(such as A loads B, B loads A, etc.) and, in case such a loop is detected, the +operation MUST fail. For this purpose, use of a static boolean flag is +suggested. + +### Threading Rules + +All of the functions defined by this specification belong to the Discovery +class. + + +"""^^lv2:Markdown . + +dman:DynManifest + lv2:documentation """ + +There MUST NOT be any instances of dman:DynManifest in the generated manifest. + +All relative URIs in the generated data MUST be relative to the base path that +would be used to parse a normal LV2 manifest (the bundle path). + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.ttl new file mode 100644 index 00000000..4e2e8309 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/dynmanifest.ttl @@ -0,0 +1,25 @@ +@prefix dman: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Dyn Manifest" ; + rdfs:comment "Support for dynamic manifest data generation." ; + rdfs:seeAlso , + . + +dman:DynManifest + a rdfs:Class ; + rdfs:label "Dynamic Manifest" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:binary ; + owl:minCardinality 1 ; + rdfs:comment "A DynManifest MUST have at least one lv2:binary." + ] ; + rdfs:comment "Dynamic manifest for an LV2 binary." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/manifest.ttl new file mode 100644 index 00000000..db27a731 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/dynmanifest/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h new file mode 100644 index 00000000..1e19e582 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event-helpers.h @@ -0,0 +1,255 @@ +/* + Copyright 2008-2015 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_EVENT_HELPERS_H +#define LV2_EVENT_HELPERS_H + +/** + @file event-helpers.h Helper functions for the LV2 Event extension + . +*/ + +#include "lv2/core/attributes.h" +#include "lv2/event/event.h" + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +LV2_DISABLE_DEPRECATION_WARNINGS + +/** @file + * Helper functions for the LV2 Event extension + * . + * + * These functions are provided for convenience only, use of them is not + * required for supporting lv2ev (i.e. the events extension is defined by the + * raw buffer format described in lv2_event.h and NOT by this API). + * + * Note that these functions are all static inline which basically means: + * do not take the address of these functions. */ + +/** Pad a size to 64 bits (for event sizes) */ +static inline uint16_t +lv2_event_pad_size(uint16_t size) +{ + return (uint16_t)(size + 7U) & (uint16_t)(~7U); +} + +/** Initialize (empty, reset..) an existing event buffer. + * The contents of buf are ignored entirely and overwritten, except capacity + * which is unmodified. */ +static inline void +lv2_event_buffer_reset(LV2_Event_Buffer* buf, + uint16_t stamp_type, + uint8_t* data) +{ + buf->data = data; + buf->header_size = sizeof(LV2_Event_Buffer); + buf->stamp_type = stamp_type; + buf->event_count = 0; + buf->size = 0; +} + +/** Allocate a new, empty event buffer. */ +static inline LV2_Event_Buffer* +lv2_event_buffer_new(uint32_t capacity, uint16_t stamp_type) +{ + const size_t size = sizeof(LV2_Event_Buffer) + capacity; + LV2_Event_Buffer* buf = (LV2_Event_Buffer*)malloc(size); + if (buf != NULL) { + buf->capacity = capacity; + lv2_event_buffer_reset(buf, stamp_type, (uint8_t*)(buf + 1)); + return buf; + } + return NULL; +} + +/** An iterator over an LV2_Event_Buffer. + * + * Multiple simultaneous read iterators over a single buffer is fine, + * but changing the buffer invalidates all iterators. */ +typedef struct { + LV2_Event_Buffer* buf; + uint32_t offset; +} LV2_Event_Iterator; + +/** Reset an iterator to point to the start of `buf`. + * @return True if `iter` is valid, otherwise false (buffer is empty) */ +static inline bool +lv2_event_begin(LV2_Event_Iterator* iter, LV2_Event_Buffer* buf) +{ + iter->buf = buf; + iter->offset = 0; + return (buf->size > 0); +} + +/** Check if `iter` is valid. + * @return True if `iter` is valid, otherwise false (past end of buffer) */ +static inline bool +lv2_event_is_valid(LV2_Event_Iterator* iter) +{ + return (iter->buf && (iter->offset < iter->buf->size)); +} + +/** Advance `iter` forward one event. + * `iter` must be valid. + * @return True if `iter` is valid, otherwise false (reached end of buffer) */ +static inline bool +lv2_event_increment(LV2_Event_Iterator* iter) +{ + if (!lv2_event_is_valid(iter)) { + return false; + } + + LV2_Event* const ev = (LV2_Event*)(iter->buf->data + iter->offset); + + iter->offset += + lv2_event_pad_size((uint16_t)((uint16_t)sizeof(LV2_Event) + ev->size)); + + return true; +} + +/** Dereference an event iterator (get the event currently pointed at). + * `iter` must be valid. + * `data` if non-NULL, will be set to point to the contents of the event + * returned. + * @return A Pointer to the event `iter` is currently pointing at, or NULL + * if the end of the buffer is reached (in which case `data` is + * also set to NULL). */ +static inline LV2_Event* +lv2_event_get(LV2_Event_Iterator* iter, uint8_t** data) +{ + if (!lv2_event_is_valid(iter)) { + return NULL; + } + + LV2_Event* const ev = (LV2_Event*)(iter->buf->data + iter->offset); + + if (data) { + *data = (uint8_t*)ev + sizeof(LV2_Event); + } + + return ev; +} + +/** Write an event at `iter`. + * The event (if any) pointed to by `iter` will be overwritten, and `iter` + * incremented to point to the following event (i.e. several calls to this + * function can be done in sequence without twiddling iter in-between). + * @return True if event was written, otherwise false (buffer is full). */ +static inline bool +lv2_event_write(LV2_Event_Iterator* iter, + uint32_t frames, + uint32_t subframes, + uint16_t type, + uint16_t size, + const uint8_t* data) +{ + if (!iter->buf) { + return false; + } + + if (iter->buf->capacity - iter->buf->size < sizeof(LV2_Event) + size) { + return false; + } + + LV2_Event* const ev = (LV2_Event*)(iter->buf->data + iter->offset); + + ev->frames = frames; + ev->subframes = subframes; + ev->type = type; + ev->size = size; + memcpy((uint8_t*)ev + sizeof(LV2_Event), data, size); + ++iter->buf->event_count; + + size = lv2_event_pad_size((uint16_t)(sizeof(LV2_Event) + size)); + iter->buf->size += size; + iter->offset += size; + + return true; +} + +/** Reserve space for an event in the buffer and return a pointer to + the memory where the caller can write the event data, or NULL if there + is not enough room in the buffer. */ +static inline uint8_t* +lv2_event_reserve(LV2_Event_Iterator* iter, + uint32_t frames, + uint32_t subframes, + uint16_t type, + uint16_t size) +{ + const uint16_t total_size = (uint16_t)(sizeof(LV2_Event) + size); + if (iter->buf->capacity - iter->buf->size < total_size) { + return NULL; + } + + LV2_Event* const ev = (LV2_Event*)(iter->buf->data + iter->offset); + + ev->frames = frames; + ev->subframes = subframes; + ev->type = type; + ev->size = size; + ++iter->buf->event_count; + + const uint16_t padded_size = lv2_event_pad_size(total_size); + iter->buf->size += padded_size; + iter->offset += padded_size; + + return (uint8_t*)ev + sizeof(LV2_Event); +} + +/** Write an event at `iter`. + * The event (if any) pointed to by `iter` will be overwritten, and `iter` + * incremented to point to the following event (i.e. several calls to this + * function can be done in sequence without twiddling iter in-between). + * @return True if event was written, otherwise false (buffer is full). */ +static inline bool +lv2_event_write_event(LV2_Event_Iterator* iter, + const LV2_Event* ev, + const uint8_t* data) +{ + const uint16_t total_size = (uint16_t)(sizeof(LV2_Event) + ev->size); + if (iter->buf->capacity - iter->buf->size < total_size) { + return false; + } + + LV2_Event* const write_ev = (LV2_Event*)(iter->buf->data + iter->offset); + + *write_ev = *ev; + memcpy((uint8_t*)write_ev + sizeof(LV2_Event), data, ev->size); + ++iter->buf->event_count; + + const uint16_t padded_size = lv2_event_pad_size(total_size); + iter->buf->size += padded_size; + iter->offset += padded_size; + + return true; +} + +LV2_RESTORE_WARNINGS + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_EVENT_HELPERS_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h new file mode 100644 index 00000000..d55d5cf4 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.h @@ -0,0 +1,306 @@ +/* + Copyright 2008-2016 David Robillard + Copyright 2006-2007 Lars Luthman + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_EVENT_H +#define LV2_EVENT_H + +/** + @defgroup event Event + @ingroup lv2 + + Generic time-stamped events. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_EVENT_URI "http://lv2plug.in/ns/ext/event" ///< http://lv2plug.in/ns/ext/event +#define LV2_EVENT_PREFIX LV2_EVENT_URI "#" ///< http://lv2plug.in/ns/ext/event# + +#define LV2_EVENT__Event LV2_EVENT_PREFIX "Event" ///< http://lv2plug.in/ns/ext/event#Event +#define LV2_EVENT__EventPort LV2_EVENT_PREFIX "EventPort" ///< http://lv2plug.in/ns/ext/event#EventPort +#define LV2_EVENT__FrameStamp LV2_EVENT_PREFIX "FrameStamp" ///< http://lv2plug.in/ns/ext/event#FrameStamp +#define LV2_EVENT__TimeStamp LV2_EVENT_PREFIX "TimeStamp" ///< http://lv2plug.in/ns/ext/event#TimeStamp +#define LV2_EVENT__generatesTimeStamp LV2_EVENT_PREFIX "generatesTimeStamp" ///< http://lv2plug.in/ns/ext/event#generatesTimeStamp +#define LV2_EVENT__generic LV2_EVENT_PREFIX "generic" ///< http://lv2plug.in/ns/ext/event#generic +#define LV2_EVENT__inheritsEvent LV2_EVENT_PREFIX "inheritsEvent" ///< http://lv2plug.in/ns/ext/event#inheritsEvent +#define LV2_EVENT__inheritsTimeStamp LV2_EVENT_PREFIX "inheritsTimeStamp" ///< http://lv2plug.in/ns/ext/event#inheritsTimeStamp +#define LV2_EVENT__supportsEvent LV2_EVENT_PREFIX "supportsEvent" ///< http://lv2plug.in/ns/ext/event#supportsEvent +#define LV2_EVENT__supportsTimeStamp LV2_EVENT_PREFIX "supportsTimeStamp" ///< http://lv2plug.in/ns/ext/event#supportsTimeStamp + +// clang-format on + +#define LV2_EVENT_AUDIO_STAMP 0 ///< Special timestamp type for audio frames + +#include "lv2/core/attributes.h" + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +LV2_DISABLE_DEPRECATION_WARNINGS + +/** + The best Pulses Per Quarter Note for tempo-based uint32_t timestamps. + Equal to 2^12 * 5 * 7 * 9 * 11 * 13 * 17, which is evenly divisble + by all integers from 1 through 18 inclusive, and powers of 2 up to 2^12. +*/ +LV2_DEPRECATED +static const uint32_t LV2_EVENT_PPQN = 3136573440U; + +/** + An LV2 event (header only). + + LV2 events are generic time-stamped containers for any type of event. + The type field defines the format of a given event's contents. + + This struct defines the header of an LV2 event. An LV2 event is a single + chunk of POD (plain old data), usually contained in a flat buffer (see + LV2_EventBuffer below). Unless a required feature says otherwise, hosts may + assume a deep copy of an LV2 event can be created safely using a simple: + + memcpy(ev_copy, ev, sizeof(LV2_Event) + ev->size); (or equivalent) +*/ +LV2_DEPRECATED +typedef struct { + /** + The frames portion of timestamp. The units used here can optionally be + set for a port (with the lv2ev:timeUnits property), otherwise this is + audio frames, corresponding to the sample_count parameter of the LV2 run + method (frame 0 is the first frame for that call to run). + */ + uint32_t frames; + + /** + The sub-frames portion of timestamp. The units used here can optionally + be set for a port (with the lv2ev:timeUnits property), otherwise this is + 1/(2^32) of an audio frame. + */ + uint32_t subframes; + + /** + The type of this event, as a number which represents some URI + defining an event type. This value MUST be some value previously + returned from a call to the uri_to_id function defined in the LV2 + URI map extension (see lv2_uri_map.h). + There are special rules which must be followed depending on the type + of an event. If the plugin recognizes an event type, the definition + of that event type will describe how to interpret the event, and + any required behaviour. Otherwise, if the type is 0, this event is a + non-POD event and lv2_event_unref MUST be called if the event is + 'dropped' (see above). Even if the plugin does not understand an event, + it may pass the event through to an output by simply copying (and NOT + calling lv2_event_unref). These rules are designed to allow for generic + event handling plugins and large non-POD events, but with minimal hassle + on simple plugins that "don't care" about these more advanced features. + */ + uint16_t type; + + /** + The size of the data portion of this event in bytes, which immediately + follows. The header size (12 bytes) is not included in this value. + */ + uint16_t size; + + /* size bytes of data follow here */ +} LV2_Event; + +/** + A buffer of LV2 events (header only). + + Like events (which this contains) an event buffer is a single chunk of POD: + the entire buffer (including contents) can be copied with a single memcpy. + The first contained event begins sizeof(LV2_EventBuffer) bytes after the + start of this struct. + + After this header, the buffer contains an event header (defined by struct + LV2_Event), followed by that event's contents (padded to 64 bits), followed + by another header, etc: + + | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | + |FRAMES |SUBFRMS|TYP|LEN|DATA..DATA..PAD|FRAMES | ... +*/ +LV2_DEPRECATED +typedef struct { + /** + The contents of the event buffer. This may or may not reside in the + same block of memory as this header, plugins must not assume either. + The host guarantees this points to at least capacity bytes of allocated + memory (though only size bytes of that are valid events). + */ + uint8_t* data; + + /** + The size of this event header in bytes (including everything). + + This is to allow for extending this header in the future without + breaking binary compatibility. Whenever this header is copied, + it MUST be done using this field (and NOT the sizeof this struct). + */ + uint16_t header_size; + + /** + The type of the time stamps for events in this buffer. + As a special exception, '0' always means audio frames and subframes + (1/UINT32_MAX'th of a frame) in the sample rate passed to instantiate. + + INPUTS: The host must set this field to the numeric ID of some URI + defining the meaning of the frames/subframes fields of contained events + (obtained by the LV2 URI Map uri_to_id function with the URI of this + extension as the 'map' argument, see lv2_uri_map.h). The host must + never pass a plugin a buffer which uses a stamp type the plugin does not + 'understand'. The value of this field must never change, except when + connect_port is called on the input port, at which time the host MUST + have set the stamp_type field to the value that will be used for all + subsequent run calls. + + OUTPUTS: The plugin may set this to any value that has been returned + from uri_to_id with the URI of this extension for a 'map' argument. + When connected to a buffer with connect_port, output ports MUST set this + field to the type of time stamp they will be writing. On any call to + connect_port on an event input port, the plugin may change this field on + any output port, it is the responsibility of the host to check if any of + these values have changed and act accordingly. + */ + uint16_t stamp_type; + + /** + The number of events in this buffer. + + INPUTS: The host must set this field to the number of events contained + in the data buffer before calling run(). The plugin must not change + this field. + + OUTPUTS: The plugin must set this field to the number of events it has + written to the buffer before returning from run(). Any initial value + should be ignored by the plugin. + */ + uint32_t event_count; + + /** + The size of the data buffer in bytes. + This is set by the host and must not be changed by the plugin. + The host is allowed to change this between run() calls. + */ + uint32_t capacity; + + /** + The size of the initial portion of the data buffer containing data. + + INPUTS: The host must set this field to the number of bytes used + by all events it has written to the buffer (including headers) + before calling the plugin's run(). + The plugin must not change this field. + + OUTPUTS: The plugin must set this field to the number of bytes + used by all events it has written to the buffer (including headers) + before returning from run(). + Any initial value should be ignored by the plugin. + */ + uint32_t size; +} LV2_Event_Buffer; + +/** + Opaque pointer to host data. +*/ +LV2_DEPRECATED +typedef void* LV2_Event_Callback_Data; + +/** + Non-POD events feature. + + To support this feature the host must pass an LV2_Feature struct to the + plugin's instantiate method with URI "http://lv2plug.in/ns/ext/event" + and data pointed to an instance of this struct. Note this feature + is not mandatory to support the event extension. +*/ +LV2_DEPRECATED +typedef struct { + /** + Opaque pointer to host data. + + The plugin MUST pass this to any call to functions in this struct. + Otherwise, it must not be interpreted in any way. + */ + LV2_Event_Callback_Data callback_data; + + /** + Take a reference to a non-POD event. + + If a plugin receives an event with type 0, it means the event is a + pointer to some object in memory and not a flat sequence of bytes + in the buffer. When receiving a non-POD event, the plugin already + has an implicit reference to the event. If the event is stored AND + passed to an output, lv2_event_ref MUST be called on that event. + If the event is only stored OR passed through, this is not necessary + (as the plugin already has 1 implicit reference). + + @param event An event received at an input that will not be copied to + an output or stored in any way. + + @param context The calling context. Like event types, this is a mapped + URI, see lv2_context.h. Simple plugin with just a run() method should + pass 0 here (the ID of the 'standard' LV2 run context). The host + guarantees that this function is realtime safe iff the context is + realtime safe. + + PLUGINS THAT VIOLATE THESE RULES MAY CAUSE CRASHES AND MEMORY LEAKS. + */ + uint32_t (*lv2_event_ref)(LV2_Event_Callback_Data callback_data, + LV2_Event* event); + + /** + Drop a reference to a non-POD event. + + If a plugin receives an event with type 0, it means the event is a + pointer to some object in memory and not a flat sequence of bytes + in the buffer. If the plugin does not pass the event through to + an output or store it internally somehow, it MUST call this function + on the event (more information on using non-POD events below). + + @param event An event received at an input that will not be copied to an + output or stored in any way. + + @param context The calling context. Like event types, this is a mapped + URI, see lv2_context.h. Simple plugin with just a run() method should + pass 0 here (the ID of the 'standard' LV2 run context). The host + guarantees that this function is realtime safe iff the context is + realtime safe. + + PLUGINS THAT VIOLATE THESE RULES MAY CAUSE CRASHES AND MEMORY LEAKS. + */ + uint32_t (*lv2_event_unref)(LV2_Event_Callback_Data callback_data, + LV2_Event* event); +} LV2_Event_Feature; + +LV2_RESTORE_WARNINGS + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_EVENT_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.meta.ttl new file mode 100644 index 00000000..ecc40c72 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.meta.ttl @@ -0,0 +1,246 @@ +@prefix dcs: . +@prefix doap: . +@prefix ev: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Event" ; + doap:shortdesc "A port-based real-time generic event interface." ; + doap:created "2008-00-00" ; + doap:developer , + ; + doap:release [ + doap:revision "1.12" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Minor documentation improvements." + ] + ] + ] , [ + doap:revision "1.10" ; + doap:created "2013-01-13" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect return type in lv2_event_get()." + ] + ] + ] , [ + doap:revision "1.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make event iterator gracefully handle optional ports." + ] , [ + rdfs:label "Remove asserts from event-helper.h." + ] , [ + rdfs:label "Use more precise domain and range for EventPort properties." + ] , [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix bug in lv2_event_reserve()." + ] , [ + rdfs:label "Fix incorrect ranges of some properties." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Convert documentation to HTML and use lv2:documentation." + ] , [ + rdfs:label "Use lv2:Specification to be discovered as an extension." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-11-24" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension is deprecated. New implementations +should use LV2 Atom instead. + +This extension defines a generic time-stamped event port type, which can be +used to create plugins that read and write real-time events, such as MIDI, +OSC, or any other type of event payload. The type(s) of event supported by +a port is defined in the data file for a plugin, for example: + + :::turtle + + lv2:port [ + a ev:EventPort, lv2:InputPort ; + lv2:index 0 ; + ev:supportsEvent ; + lv2:symbol "midi_input" ; + lv2:name "MIDI input" ; + ] . + +"""^^lv2:Markdown . + +ev:EventPort + lv2:documentation """ + +Ports of this type will be connected to a struct of type LV2_Event_Buffer, +defined in event.h. These ports contain a sequence of generic events (possibly +several types mixed in a single stream), the specific types of which are +defined by some URI in another LV2 extension. + +"""^^lv2:Markdown . + +ev:Event + a rdfs:Class ; + rdfs:label "Event" ; + lv2:documentation """ + +An ev:EventPort contains an LV2_Event_Buffer which contains a sequence of these +events. The binary format of LV2 events is defined by the LV2_Event struct in +event.h. + +Specific event types (such as MIDI or OSC) are defined by extensions, and +should be rdfs:subClassOf this class. + +"""^^lv2:Markdown . + +ev:TimeStamp + lv2:documentation """ + +This defines the meaning of the 'frames' and 'subframes' fields of an LV2_Event +(both unsigned 32-bit integers). + +"""^^lv2:Markdown . + +ev:FrameStamp + lv2:documentation """ + +The default time stamp unit for an LV2 event: the frames field represents audio +frames (in the sample rate passed to intantiate), and the subframes field is +1/UINT32_MAX of a frame. + +"""^^lv2:Markdown . + +ev:generic + lv2:documentation """ + +Indicates that this port does something meaningful for any event type. This is +useful for things like event mixers, delays, serialisers, and so on. + +If this property is set, hosts should consider the port suitable for any type +of event. Otherwise, hosts should consider the port 'appropriate' only for the +specific event types listed with :supportsEvent. Note that plugins must +gracefully handle unknown event types whether or not this property is present. + +"""^^lv2:Markdown . + +ev:supportsEvent + lv2:documentation """ + +Indicates that this port supports or "understands" a certain event type. + +For input ports, this means the plugin understands and does something useful +with events of this type. For output ports, this means the plugin may generate +events of this type. If the plugin never actually generates events of this +type, but might pass them through from an input, this property should not be +set (use ev:inheritsEvent for that). + +Plugins with event input ports must always gracefully handle any type of event, +even if it does not 'support' it. This property should always be set for event +types the plugin understands/generates so hosts can discover plugins +appropriate for a given scenario (for example, plugins with a MIDI input). +Hosts are not expected to consider event ports suitable for some type of event +if the relevant :supportsEvent property is not set, unless the ev:generic +property for that port is also set. + + +"""^^lv2:Markdown . + +ev:inheritsEvent + lv2:documentation """ + +Indicates that this output port might pass through events that arrived at some +other input port (or generate an event of the same type as events arriving at +that input). The host must always check the stamp type of all outputs when +connecting an input, but this property should be set whenever it applies. + + +"""^^lv2:Markdown . + +ev:supportsTimeStamp + lv2:documentation """ + +Indicates that this port supports or "understands" a certain time stamp type. +Meaningful only for input ports, the host must never connect a port to an event +buffer with a time stamp type that isn't supported by the port. + +"""^^lv2:Markdown . + +ev:generatesTimeStamp + lv2:documentation """ + +Indicates that this port may output a certain time stamp type, regardless of +the time stamp type of any input ports. + +If the port outputs stamps based on what type inputs are connected to, this +property should not be set (use the ev:inheritsTimeStamp property for that). +Hosts MUST check the time_stamp value of any output port buffers after a call +to connect_port on ANY event input port on the plugin. + +If the plugin changes the stamp_type field of an output event buffer during a +call to run(), the plugin must call the stamp_type_changed function provided by +the host in the LV2_Event_Feature struct, if it is non-NULL. + +"""^^lv2:Markdown . + +ev:inheritsTimeStamp + lv2:documentation """ + +Indicates that this port follows the time stamp type of an input port. + +This property is not necessary, but it should be set for outputs that base +their output type on an input port so the host can make more sense of the +plugin and provide a more sensible interface. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.ttl new file mode 100644 index 00000000..de400d43 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/event.ttl @@ -0,0 +1,86 @@ +@prefix ev: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . + + + a owl:Ontology ; + owl:deprecated true ; + rdfs:label "LV2 Event" ; + rdfs:comment "A port-based real-time generic event interface." ; + rdfs:seeAlso , + , + . + +ev:EventPort + a rdfs:Class ; + rdfs:label "Event Port" ; + rdfs:subClassOf lv2:Port ; + rdfs:comment "An LV2 event port." . + +ev:Event + a rdfs:Class ; + rdfs:label "Event" ; + rdfs:comment "A single generic time-stamped event." . + +ev:TimeStamp + a rdfs:Class ; + rdfs:label "Event Time Stamp" ; + rdfs:comment "The time stamp of an Event." . + +ev:FrameStamp + a rdfs:Class ; + rdfs:subClassOf ev:TimeStamp ; + rdfs:label "Audio Frame Time Stamp" ; + rdfs:comment "The default time stamp unit for an event." . + +ev:generic + a lv2:PortProperty ; + rdfs:label "generic event port" ; + rdfs:comment "Port works with generic events." . + +ev:supportsEvent + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort ; + rdfs:range rdfs:Class ; + rdfs:label "supports event type" ; + rdfs:comment "An event type supported by this port." . + +ev:inheritsEvent + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:OutputPort ; + rdfs:range lv2:Port ; + rdfs:label "inherits event type" ; + rdfs:comment "Output port inherits event types from an input port." . + +ev:supportsTimeStamp + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:InputPort ; + rdfs:range rdfs:Class ; + rdfs:label "supports time stamp type" ; + rdfs:comment "A time stamp type suported by this input port." . + +ev:generatesTimeStamp + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:OutputPort ; + rdfs:range rdfs:Class ; + rdfs:label "generates time stamp type" ; + rdfs:comment "A time stamp type generated by this input port." . + +ev:inheritsTimeStamp + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:OutputPort ; + rdfs:range lv2:Port ; + rdfs:label "inherits time stamp type" ; + rdfs:comment "Output port inherits time stamp types from an input port." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/manifest.ttl new file mode 100644 index 00000000..0194d717 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/event/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 12 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h new file mode 100644 index 00000000..2986f699 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.h @@ -0,0 +1,41 @@ +/* + Copyright 2008-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_INSTANCE_ACCESS_H +#define LV2_INSTANCE_ACCESS_H + +/** + @defgroup instance-access Instance Access + @ingroup lv2 + + Access to the LV2_Handle of a plugin for UIs. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_INSTANCE_ACCESS_URI "http://lv2plug.in/ns/ext/instance-access" ///< http://lv2plug.in/ns/ext/instance-access + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_INSTANCE_ACCESS_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.meta.ttl new file mode 100644 index 00000000..875e2f84 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.meta.ttl @@ -0,0 +1,75 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix ia: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Instance Access" ; + doap:shortdesc "Provides access to the LV2_Handle of a plugin." ; + doap:created "2010-10-04" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature which allows plugin UIs to get a direct handle +to an LV2 plugin instance (LV2_Handle), if possible. + +Note that the use of this extension by UIs violates the important principle of +UI/plugin separation, and is potentially a source of many problems. +Accordingly, **use of this extension is highly discouraged**, and plugins +should not expect hosts to support it, since it is often impossible to do so. + +To support this feature the host must pass an LV2_Feature struct to the UI +instantiate method with URI LV2_INSTANCE_ACCESS_URI and data pointed directly +to the LV2_Handle of the plugin instance. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.ttl new file mode 100644 index 00000000..085ae37d --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/instance-access.ttl @@ -0,0 +1,11 @@ +@prefix ia: . +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Feature ; + rdfs:label "instance access" ; + rdfs:comment "A feature that provides access to a plugin instance." ; + rdfs:seeAlso , + . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/manifest.ttl new file mode 100644 index 00000000..e6c88107 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/instance-access/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h new file mode 100644 index 00000000..cc62befa --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.h @@ -0,0 +1,113 @@ +/* + Copyright 2012-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_LOG_H +#define LV2_LOG_H + +/** + @defgroup log Log + @ingroup lv2 + + Interface for plugins to log via the host. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_LOG_URI "http://lv2plug.in/ns/ext/log" ///< http://lv2plug.in/ns/ext/log +#define LV2_LOG_PREFIX LV2_LOG_URI "#" ///< http://lv2plug.in/ns/ext/log# + +#define LV2_LOG__Entry LV2_LOG_PREFIX "Entry" ///< http://lv2plug.in/ns/ext/log#Entry +#define LV2_LOG__Error LV2_LOG_PREFIX "Error" ///< http://lv2plug.in/ns/ext/log#Error +#define LV2_LOG__Note LV2_LOG_PREFIX "Note" ///< http://lv2plug.in/ns/ext/log#Note +#define LV2_LOG__Trace LV2_LOG_PREFIX "Trace" ///< http://lv2plug.in/ns/ext/log#Trace +#define LV2_LOG__Warning LV2_LOG_PREFIX "Warning" ///< http://lv2plug.in/ns/ext/log#Warning +#define LV2_LOG__log LV2_LOG_PREFIX "log" ///< http://lv2plug.in/ns/ext/log#log + +// clang-format on + +#include "lv2/urid/urid.h" + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond */ +#ifdef __GNUC__ +/** Allow type checking of printf-like functions. */ +# define LV2_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define LV2_LOG_FUNC(fmt, arg1) +#endif +/** @endcond */ + +/** + Opaque data to host data for LV2_Log_Log. +*/ +typedef void* LV2_Log_Handle; + +/** + Log feature (LV2_LOG__log) +*/ +typedef struct { + /** + Opaque pointer to host data. + + This MUST be passed to methods in this struct whenever they are called. + Otherwise, it must not be interpreted in any way. + */ + LV2_Log_Handle handle; + + /** + Log a message, passing format parameters directly. + + The API of this function matches that of the standard C printf function, + except for the addition of the first two parameters. This function may + be called from any non-realtime context, or from any context if `type` + is @ref LV2_LOG__Trace. + */ + LV2_LOG_FUNC(3, 4) + int (*printf)(LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...); + + /** + Log a message, passing format parameters in a va_list. + + The API of this function matches that of the standard C vprintf + function, except for the addition of the first two parameters. This + function may be called from any non-realtime context, or from any + context if `type` is @ref LV2_LOG__Trace. + */ + LV2_LOG_FUNC(3, 0) + int (*vprintf)(LV2_Log_Handle handle, + LV2_URID type, + const char* fmt, + va_list ap); +} LV2_Log_Log; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_LOG_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.meta.ttl new file mode 100644 index 00000000..87cff438 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.meta.ttl @@ -0,0 +1,126 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix log: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Log" ; + doap:shortdesc "A feature for writing log messages." ; + doap:created "2012-01-12" ; + doap:developer ; + doap:release [ + doap:revision "2.4" ; + doap:created "2016-07-30" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2_log_logger_set_map() for changing the URI map of an existing logger." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add missing include string.h to logger.h for memset." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2013-01-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add logger convenience API." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature, log:log, which allows plugins to print log +messages with an API similar to the standard C `printf` function. This allows, +for example, plugin logs to be nicely presented to the user in a graphical user +interface. + +Different log levels are defined by URI and passed as an LV2_URID. This +extensions defines standard levels which are expected to be understood by all +implementations and should be sufficient in most cases, but advanced +implementations may define and use additional levels to suit their needs. + +"""^^lv2:Markdown . + +log:Entry + a rdfs:Class ; + rdfs:label "Log Entry" ; + lv2:documentation """ + +Subclasses of this are passed as the `type` parameter to LV2_Log_Log methods to +describe the nature of the log entry. + +"""^^lv2:Markdown . + +log:Error + lv2:documentation """ + +An error should only be posted when a serious unexpected error occurs, and +should be actively shown to the user by the host. + +"""^^lv2:Markdown . + +log:Note + lv2:documentation """ + +A note records some useful piece of information, but may be ignored. The host +should provide passive access to note entries to the user. + +"""^^lv2:Markdown . + +log:Warning + lv2:documentation """ + +A warning should be posted when an unexpected, but non-critical, error occurs. +The host should provide passive access to warnings entries to the user, but may +also choose to actively show them. + +"""^^lv2:Markdown . + +log:Trace + lv2:documentation """ + +A trace should not be displayed during normal operation, but the host may +implement an option to display them for debugging purposes. + +This entry type is special in that one may be posted in a real-time thread. It +is assumed that if debug tracing is enabled, real-time performance is not a +concern. However, the host MUST guarantee that posting a trace _is_ real-time +safe if debug tracing is not enabled (for example, by simply ignoring the call +as early as possible). + +"""^^lv2:Markdown . + +log:log + lv2:documentation """ + +A feature which plugins may use to log messages. To support this feature, +the host must pass an LV2_Feature to LV2_Descriptor::instantiate() with URI +LV2_LOG__log and data pointed to an instance of LV2_Log_Log. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.ttl new file mode 100644 index 00000000..46cba45e --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/log.ttl @@ -0,0 +1,48 @@ +@prefix log: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Log" ; + rdfs:comment "A feature for writing log messages." ; + rdfs:seeAlso , + . + +log:Entry + a rdfs:Class ; + rdfs:label "Entry" ; + rdfs:comment "A log entry." . + +log:Error + a rdfs:Class ; + rdfs:label "Error" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "An error message." . + +log:Note + a rdfs:Class ; + rdfs:label "Note" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "An informative message." . + +log:Warning + a rdfs:Class ; + rdfs:label "Warning" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "A warning message." . + +log:Trace + a rdfs:Class ; + rdfs:label "Trace" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "A debugging trace message." . + +log:log + a lv2:Feature ; + rdfs:label "log" ; + rdfs:comment "Logging feature." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h new file mode 100644 index 00000000..e12b0eb4 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/logger.h @@ -0,0 +1,157 @@ +/* + Copyright 2012-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_ATOM_LOGGER_H +#define LV2_ATOM_LOGGER_H + +/** + @defgroup logger Logger + @ingroup log + + Convenience API for easy logging in plugin code. This API provides simple + wrappers for logging from a plugin, which automatically fall back to + printing to stderr if host support is unavailabe. + + @{ +*/ + +#include "lv2/log/log.h" +#include "lv2/urid/urid.h" + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Logger convenience API state. +*/ +typedef struct { + LV2_Log_Log* log; + + LV2_URID Error; + LV2_URID Note; + LV2_URID Trace; + LV2_URID Warning; +} LV2_Log_Logger; + +/** + Set `map` as the URI map for `logger`. + + This affects the message type URIDs (Error, Warning, etc) which are passed + to the log's print functions. +*/ +static inline void +lv2_log_logger_set_map(LV2_Log_Logger* logger, LV2_URID_Map* map) +{ + if (map) { + logger->Error = map->map(map->handle, LV2_LOG__Error); + logger->Note = map->map(map->handle, LV2_LOG__Note); + logger->Trace = map->map(map->handle, LV2_LOG__Trace); + logger->Warning = map->map(map->handle, LV2_LOG__Warning); + } else { + logger->Error = logger->Note = logger->Trace = logger->Warning = 0; + } +} + +/** + Initialise `logger`. + + URIs will be mapped using `map` and stored, a reference to `map` itself is + not held. Both `map` and `log` may be NULL when unsupported by the host, + in which case the implementation will fall back to printing to stderr. +*/ +static inline void +lv2_log_logger_init(LV2_Log_Logger* logger, LV2_URID_Map* map, LV2_Log_Log* log) +{ + logger->log = log; + lv2_log_logger_set_map(logger, map); +} + +/** + Log a message to the host, or stderr if support is unavailable. +*/ +LV2_LOG_FUNC(3, 0) +static inline int +lv2_log_vprintf(LV2_Log_Logger* logger, + LV2_URID type, + const char* fmt, + va_list args) +{ + return ((logger && logger->log) + ? logger->log->vprintf(logger->log->handle, type, fmt, args) + : vfprintf(stderr, fmt, args)); +} + +/** Log an error via lv2_log_vprintf(). */ +LV2_LOG_FUNC(2, 3) +static inline int +lv2_log_error(LV2_Log_Logger* logger, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = lv2_log_vprintf(logger, logger->Error, fmt, args); + va_end(args); + return ret; +} + +/** Log a note via lv2_log_vprintf(). */ +LV2_LOG_FUNC(2, 3) +static inline int +lv2_log_note(LV2_Log_Logger* logger, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = lv2_log_vprintf(logger, logger->Note, fmt, args); + va_end(args); + return ret; +} + +/** Log a trace via lv2_log_vprintf(). */ +LV2_LOG_FUNC(2, 3) +static inline int +lv2_log_trace(LV2_Log_Logger* logger, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = lv2_log_vprintf(logger, logger->Trace, fmt, args); + va_end(args); + return ret; +} + +/** Log a warning via lv2_log_vprintf(). */ +LV2_LOG_FUNC(2, 3) +static inline int +lv2_log_warning(LV2_Log_Logger* logger, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = lv2_log_vprintf(logger, logger->Warning, fmt, args); + va_end(args); + return ret; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_LOG_LOGGER_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/manifest.ttl new file mode 100644 index 00000000..bcaeff3d --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/log/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/manifest.ttl new file mode 100644 index 00000000..f1419367 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 10 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h new file mode 100644 index 00000000..2c70f0cc --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.h @@ -0,0 +1,248 @@ +/* + Copyright 2012-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_MIDI_H +#define LV2_MIDI_H + +/** + @defgroup midi MIDI + @ingroup lv2 + + Definitions of standard MIDI messages. + + See for details. + + @{ +*/ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// clang-format off + +#define LV2_MIDI_URI "http://lv2plug.in/ns/ext/midi" ///< http://lv2plug.in/ns/ext/midi +#define LV2_MIDI_PREFIX LV2_MIDI_URI "#" ///< http://lv2plug.in/ns/ext/midi# + +#define LV2_MIDI__ActiveSense LV2_MIDI_PREFIX "ActiveSense" ///< http://lv2plug.in/ns/ext/midi#ActiveSense +#define LV2_MIDI__Aftertouch LV2_MIDI_PREFIX "Aftertouch" ///< http://lv2plug.in/ns/ext/midi#Aftertouch +#define LV2_MIDI__Bender LV2_MIDI_PREFIX "Bender" ///< http://lv2plug.in/ns/ext/midi#Bender +#define LV2_MIDI__ChannelPressure LV2_MIDI_PREFIX "ChannelPressure" ///< http://lv2plug.in/ns/ext/midi#ChannelPressure +#define LV2_MIDI__Chunk LV2_MIDI_PREFIX "Chunk" ///< http://lv2plug.in/ns/ext/midi#Chunk +#define LV2_MIDI__Clock LV2_MIDI_PREFIX "Clock" ///< http://lv2plug.in/ns/ext/midi#Clock +#define LV2_MIDI__Continue LV2_MIDI_PREFIX "Continue" ///< http://lv2plug.in/ns/ext/midi#Continue +#define LV2_MIDI__Controller LV2_MIDI_PREFIX "Controller" ///< http://lv2plug.in/ns/ext/midi#Controller +#define LV2_MIDI__MidiEvent LV2_MIDI_PREFIX "MidiEvent" ///< http://lv2plug.in/ns/ext/midi#MidiEvent +#define LV2_MIDI__NoteOff LV2_MIDI_PREFIX "NoteOff" ///< http://lv2plug.in/ns/ext/midi#NoteOff +#define LV2_MIDI__NoteOn LV2_MIDI_PREFIX "NoteOn" ///< http://lv2plug.in/ns/ext/midi#NoteOn +#define LV2_MIDI__ProgramChange LV2_MIDI_PREFIX "ProgramChange" ///< http://lv2plug.in/ns/ext/midi#ProgramChange +#define LV2_MIDI__QuarterFrame LV2_MIDI_PREFIX "QuarterFrame" ///< http://lv2plug.in/ns/ext/midi#QuarterFrame +#define LV2_MIDI__Reset LV2_MIDI_PREFIX "Reset" ///< http://lv2plug.in/ns/ext/midi#Reset +#define LV2_MIDI__SongPosition LV2_MIDI_PREFIX "SongPosition" ///< http://lv2plug.in/ns/ext/midi#SongPosition +#define LV2_MIDI__SongSelect LV2_MIDI_PREFIX "SongSelect" ///< http://lv2plug.in/ns/ext/midi#SongSelect +#define LV2_MIDI__Start LV2_MIDI_PREFIX "Start" ///< http://lv2plug.in/ns/ext/midi#Start +#define LV2_MIDI__Stop LV2_MIDI_PREFIX "Stop" ///< http://lv2plug.in/ns/ext/midi#Stop +#define LV2_MIDI__SystemCommon LV2_MIDI_PREFIX "SystemCommon" ///< http://lv2plug.in/ns/ext/midi#SystemCommon +#define LV2_MIDI__SystemExclusive LV2_MIDI_PREFIX "SystemExclusive" ///< http://lv2plug.in/ns/ext/midi#SystemExclusive +#define LV2_MIDI__SystemMessage LV2_MIDI_PREFIX "SystemMessage" ///< http://lv2plug.in/ns/ext/midi#SystemMessage +#define LV2_MIDI__SystemRealtime LV2_MIDI_PREFIX "SystemRealtime" ///< http://lv2plug.in/ns/ext/midi#SystemRealtime +#define LV2_MIDI__Tick LV2_MIDI_PREFIX "Tick" ///< http://lv2plug.in/ns/ext/midi#Tick +#define LV2_MIDI__TuneRequest LV2_MIDI_PREFIX "TuneRequest" ///< http://lv2plug.in/ns/ext/midi#TuneRequest +#define LV2_MIDI__VoiceMessage LV2_MIDI_PREFIX "VoiceMessage" ///< http://lv2plug.in/ns/ext/midi#VoiceMessage +#define LV2_MIDI__benderValue LV2_MIDI_PREFIX "benderValue" ///< http://lv2plug.in/ns/ext/midi#benderValue +#define LV2_MIDI__binding LV2_MIDI_PREFIX "binding" ///< http://lv2plug.in/ns/ext/midi#binding +#define LV2_MIDI__byteNumber LV2_MIDI_PREFIX "byteNumber" ///< http://lv2plug.in/ns/ext/midi#byteNumber +#define LV2_MIDI__channel LV2_MIDI_PREFIX "channel" ///< http://lv2plug.in/ns/ext/midi#channel +#define LV2_MIDI__chunk LV2_MIDI_PREFIX "chunk" ///< http://lv2plug.in/ns/ext/midi#chunk +#define LV2_MIDI__controllerNumber LV2_MIDI_PREFIX "controllerNumber" ///< http://lv2plug.in/ns/ext/midi#controllerNumber +#define LV2_MIDI__controllerValue LV2_MIDI_PREFIX "controllerValue" ///< http://lv2plug.in/ns/ext/midi#controllerValue +#define LV2_MIDI__noteNumber LV2_MIDI_PREFIX "noteNumber" ///< http://lv2plug.in/ns/ext/midi#noteNumber +#define LV2_MIDI__pressure LV2_MIDI_PREFIX "pressure" ///< http://lv2plug.in/ns/ext/midi#pressure +#define LV2_MIDI__programNumber LV2_MIDI_PREFIX "programNumber" ///< http://lv2plug.in/ns/ext/midi#programNumber +#define LV2_MIDI__property LV2_MIDI_PREFIX "property" ///< http://lv2plug.in/ns/ext/midi#property +#define LV2_MIDI__songNumber LV2_MIDI_PREFIX "songNumber" ///< http://lv2plug.in/ns/ext/midi#songNumber +#define LV2_MIDI__songPosition LV2_MIDI_PREFIX "songPosition" ///< http://lv2plug.in/ns/ext/midi#songPosition +#define LV2_MIDI__status LV2_MIDI_PREFIX "status" ///< http://lv2plug.in/ns/ext/midi#status +#define LV2_MIDI__statusMask LV2_MIDI_PREFIX "statusMask" ///< http://lv2plug.in/ns/ext/midi#statusMask +#define LV2_MIDI__velocity LV2_MIDI_PREFIX "velocity" ///< http://lv2plug.in/ns/ext/midi#velocity + +// clang-format on + +/** + MIDI Message Type. + + This includes both voice messages (which have a channel) and system messages + (which do not), as well as a sentinel value for invalid messages. To get + the type of a message suitable for use in a switch statement, use + lv2_midi_get_type() on the status byte. +*/ +typedef enum { + LV2_MIDI_MSG_INVALID = 0, /**< Invalid Message */ + LV2_MIDI_MSG_NOTE_OFF = 0x80, /**< Note Off */ + LV2_MIDI_MSG_NOTE_ON = 0x90, /**< Note On */ + LV2_MIDI_MSG_NOTE_PRESSURE = 0xA0, /**< Note Pressure */ + LV2_MIDI_MSG_CONTROLLER = 0xB0, /**< Controller */ + LV2_MIDI_MSG_PGM_CHANGE = 0xC0, /**< Program Change */ + LV2_MIDI_MSG_CHANNEL_PRESSURE = 0xD0, /**< Channel Pressure */ + LV2_MIDI_MSG_BENDER = 0xE0, /**< Pitch Bender */ + LV2_MIDI_MSG_SYSTEM_EXCLUSIVE = 0xF0, /**< System Exclusive Begin */ + LV2_MIDI_MSG_MTC_QUARTER = 0xF1, /**< MTC Quarter Frame */ + LV2_MIDI_MSG_SONG_POS = 0xF2, /**< Song Position */ + LV2_MIDI_MSG_SONG_SELECT = 0xF3, /**< Song Select */ + LV2_MIDI_MSG_TUNE_REQUEST = 0xF6, /**< Tune Request */ + LV2_MIDI_MSG_CLOCK = 0xF8, /**< Clock */ + LV2_MIDI_MSG_START = 0xFA, /**< Start */ + LV2_MIDI_MSG_CONTINUE = 0xFB, /**< Continue */ + LV2_MIDI_MSG_STOP = 0xFC, /**< Stop */ + LV2_MIDI_MSG_ACTIVE_SENSE = 0xFE, /**< Active Sensing */ + LV2_MIDI_MSG_RESET = 0xFF /**< Reset */ +} LV2_Midi_Message_Type; + +/** + Standard MIDI Controller Numbers. +*/ +typedef enum { + LV2_MIDI_CTL_MSB_BANK = 0x00, /**< Bank Selection */ + LV2_MIDI_CTL_MSB_MODWHEEL = 0x01, /**< Modulation */ + LV2_MIDI_CTL_MSB_BREATH = 0x02, /**< Breath */ + LV2_MIDI_CTL_MSB_FOOT = 0x04, /**< Foot */ + LV2_MIDI_CTL_MSB_PORTAMENTO_TIME = 0x05, /**< Portamento Time */ + LV2_MIDI_CTL_MSB_DATA_ENTRY = 0x06, /**< Data Entry */ + LV2_MIDI_CTL_MSB_MAIN_VOLUME = 0x07, /**< Main Volume */ + LV2_MIDI_CTL_MSB_BALANCE = 0x08, /**< Balance */ + LV2_MIDI_CTL_MSB_PAN = 0x0A, /**< Panpot */ + LV2_MIDI_CTL_MSB_EXPRESSION = 0x0B, /**< Expression */ + LV2_MIDI_CTL_MSB_EFFECT1 = 0x0C, /**< Effect1 */ + LV2_MIDI_CTL_MSB_EFFECT2 = 0x0D, /**< Effect2 */ + LV2_MIDI_CTL_MSB_GENERAL_PURPOSE1 = 0x10, /**< General Purpose 1 */ + LV2_MIDI_CTL_MSB_GENERAL_PURPOSE2 = 0x11, /**< General Purpose 2 */ + LV2_MIDI_CTL_MSB_GENERAL_PURPOSE3 = 0x12, /**< General Purpose 3 */ + LV2_MIDI_CTL_MSB_GENERAL_PURPOSE4 = 0x13, /**< General Purpose 4 */ + LV2_MIDI_CTL_LSB_BANK = 0x20, /**< Bank Selection */ + LV2_MIDI_CTL_LSB_MODWHEEL = 0x21, /**< Modulation */ + LV2_MIDI_CTL_LSB_BREATH = 0x22, /**< Breath */ + LV2_MIDI_CTL_LSB_FOOT = 0x24, /**< Foot */ + LV2_MIDI_CTL_LSB_PORTAMENTO_TIME = 0x25, /**< Portamento Time */ + LV2_MIDI_CTL_LSB_DATA_ENTRY = 0x26, /**< Data Entry */ + LV2_MIDI_CTL_LSB_MAIN_VOLUME = 0x27, /**< Main Volume */ + LV2_MIDI_CTL_LSB_BALANCE = 0x28, /**< Balance */ + LV2_MIDI_CTL_LSB_PAN = 0x2A, /**< Panpot */ + LV2_MIDI_CTL_LSB_EXPRESSION = 0x2B, /**< Expression */ + LV2_MIDI_CTL_LSB_EFFECT1 = 0x2C, /**< Effect1 */ + LV2_MIDI_CTL_LSB_EFFECT2 = 0x2D, /**< Effect2 */ + LV2_MIDI_CTL_LSB_GENERAL_PURPOSE1 = 0x30, /**< General Purpose 1 */ + LV2_MIDI_CTL_LSB_GENERAL_PURPOSE2 = 0x31, /**< General Purpose 2 */ + LV2_MIDI_CTL_LSB_GENERAL_PURPOSE3 = 0x32, /**< General Purpose 3 */ + LV2_MIDI_CTL_LSB_GENERAL_PURPOSE4 = 0x33, /**< General Purpose 4 */ + LV2_MIDI_CTL_SUSTAIN = 0x40, /**< Sustain Pedal */ + LV2_MIDI_CTL_PORTAMENTO = 0x41, /**< Portamento */ + LV2_MIDI_CTL_SOSTENUTO = 0x42, /**< Sostenuto */ + LV2_MIDI_CTL_SOFT_PEDAL = 0x43, /**< Soft Pedal */ + LV2_MIDI_CTL_LEGATO_FOOTSWITCH = 0x44, /**< Legato Foot Switch */ + LV2_MIDI_CTL_HOLD2 = 0x45, /**< Hold2 */ + LV2_MIDI_CTL_SC1_SOUND_VARIATION = 0x46, /**< SC1 Sound Variation */ + LV2_MIDI_CTL_SC2_TIMBRE = 0x47, /**< SC2 Timbre */ + LV2_MIDI_CTL_SC3_RELEASE_TIME = 0x48, /**< SC3 Release Time */ + LV2_MIDI_CTL_SC4_ATTACK_TIME = 0x49, /**< SC4 Attack Time */ + LV2_MIDI_CTL_SC5_BRIGHTNESS = 0x4A, /**< SC5 Brightness */ + LV2_MIDI_CTL_SC6 = 0x4B, /**< SC6 */ + LV2_MIDI_CTL_SC7 = 0x4C, /**< SC7 */ + LV2_MIDI_CTL_SC8 = 0x4D, /**< SC8 */ + LV2_MIDI_CTL_SC9 = 0x4E, /**< SC9 */ + LV2_MIDI_CTL_SC10 = 0x4F, /**< SC10 */ + LV2_MIDI_CTL_GENERAL_PURPOSE5 = 0x50, /**< General Purpose 5 */ + LV2_MIDI_CTL_GENERAL_PURPOSE6 = 0x51, /**< General Purpose 6 */ + LV2_MIDI_CTL_GENERAL_PURPOSE7 = 0x52, /**< General Purpose 7 */ + LV2_MIDI_CTL_GENERAL_PURPOSE8 = 0x53, /**< General Purpose 8 */ + LV2_MIDI_CTL_PORTAMENTO_CONTROL = 0x54, /**< Portamento Control */ + LV2_MIDI_CTL_E1_REVERB_DEPTH = 0x5B, /**< E1 Reverb Depth */ + LV2_MIDI_CTL_E2_TREMOLO_DEPTH = 0x5C, /**< E2 Tremolo Depth */ + LV2_MIDI_CTL_E3_CHORUS_DEPTH = 0x5D, /**< E3 Chorus Depth */ + LV2_MIDI_CTL_E4_DETUNE_DEPTH = 0x5E, /**< E4 Detune Depth */ + LV2_MIDI_CTL_E5_PHASER_DEPTH = 0x5F, /**< E5 Phaser Depth */ + LV2_MIDI_CTL_DATA_INCREMENT = 0x60, /**< Data Increment */ + LV2_MIDI_CTL_DATA_DECREMENT = 0x61, /**< Data Decrement */ + LV2_MIDI_CTL_NRPN_LSB = 0x62, /**< Non-registered Parameter Number */ + LV2_MIDI_CTL_NRPN_MSB = 0x63, /**< Non-registered Parameter Number */ + LV2_MIDI_CTL_RPN_LSB = 0x64, /**< Registered Parameter Number */ + LV2_MIDI_CTL_RPN_MSB = 0x65, /**< Registered Parameter Number */ + LV2_MIDI_CTL_ALL_SOUNDS_OFF = 0x78, /**< All Sounds Off */ + LV2_MIDI_CTL_RESET_CONTROLLERS = 0x79, /**< Reset Controllers */ + LV2_MIDI_CTL_LOCAL_CONTROL_SWITCH = 0x7A, /**< Local Control Switch */ + LV2_MIDI_CTL_ALL_NOTES_OFF = 0x7B, /**< All Notes Off */ + LV2_MIDI_CTL_OMNI_OFF = 0x7C, /**< Omni Off */ + LV2_MIDI_CTL_OMNI_ON = 0x7D, /**< Omni On */ + LV2_MIDI_CTL_MONO1 = 0x7E, /**< Mono1 */ + LV2_MIDI_CTL_MONO2 = 0x7F /**< Mono2 */ +} LV2_Midi_Controller; + +/** + Return true iff `msg` is a MIDI voice message (which has a channel). +*/ +static inline bool +lv2_midi_is_voice_message(const uint8_t* msg) +{ + return msg[0] >= 0x80 && msg[0] < 0xF0; +} + +/** + Return true iff `msg` is a MIDI system message (which has no channel). +*/ +static inline bool +lv2_midi_is_system_message(const uint8_t* msg) +{ + switch (msg[0]) { + case 0xF4: + case 0xF5: + case 0xF7: + case 0xF9: + case 0xFD: + return false; + default: + return (msg[0] & 0xF0) == 0xF0; + } +} + +/** + Return the type of a MIDI message. + @param msg Pointer to the start (status byte) of a MIDI message. +*/ +static inline LV2_Midi_Message_Type +lv2_midi_message_type(const uint8_t* msg) +{ + if (lv2_midi_is_voice_message(msg)) { + return (LV2_Midi_Message_Type)(msg[0] & 0xF0); + } + + if (lv2_midi_is_system_message(msg)) { + return (LV2_Midi_Message_Type)msg[0]; + } + + return LV2_MIDI_MSG_INVALID; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_MIDI_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.meta.ttl new file mode 100644 index 00000000..7efdb017 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.meta.ttl @@ -0,0 +1,153 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix midi: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 MIDI" ; + doap:shortdesc "A normalised definition of raw MIDI." ; + doap:maintainer ; + doap:created "2006-00-00" ; + doap:developer , + ; + doap:release [ + doap:revision "1.10" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect range of midi:chunk." + ] + ] + ] , [ + doap:revision "1.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add midi:binding and midi:channel predicates." + ] , [ + rdfs:label "Add midi:HexByte datatype for status bytes and masks." + ] , [ + rdfs:label "Remove non-standard midi:Tick message type." + ] , [ + rdfs:label "Add C definitions for message types and standard controllers." + ] , [ + rdfs:label "Fix definition of SystemExclusive status byte." + ] + ] + ] , [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add class definitions for various message types." + ] , [ + rdfs:label "Document how to serialise a MidiEvent to a string." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This specification defines a data type for a MIDI message, midi:MidiEvent, +which is normalised for fast and convenient real-time processing. MIDI is the +Musical Instrument Digital Interface, a ubiquitous binary standard for +controlling digital music devices. + +For plugins that process MIDI (or other situations where MIDI is sent via a +generic transport) the main type defined here, midi:MidiEvent, can be mapped to +an integer and used as the type of an LV2 [Atom](atom.html#Atom) or +[Event](event.html#Event). + +This specification also defines a complete vocabulary for the MIDI standard, +except for standard controller numbers. These descriptions are detailed enough +to express any MIDI message as properties. + +"""^^lv2:Markdown . + +midi:MidiEvent + lv2:documentation """ + +A single raw MIDI message (a sequence of bytes). + +This is equivalent to a standard MIDI messages, except with the following +restrictions to simplify handling: + + * Running status is not allowed, every message must have its own status byte. + + * Note On messages with velocity 0 are not allowed. These messages are + equivalent to Note Off in standard MIDI streams, but here only proper Note + Off messages are allowed. + + * "Realtime messages" (status bytes 0xF8 to 0xFF) are allowed, but may not + occur inside other messages like they can in standard MIDI streams. + + * All messages are complete valid MIDI messages. This means, for example, + that only the first byte in each event (the status byte) may have the + eighth bit set, that Note On and Note Off events are always 3 bytes long, + etc. + +Where messages are communicated, the writer is responsible for writing valid +messages, and the reader may assume that all events are valid. + +If a midi:MidiEvent is serialised to a string, the format should be +xsd:hexBinary, for example: + + :::turtle + [] eg:someEvent "901A01"^^midi:MidiEvent . + +"""^^lv2:Markdown . + +midi:statusMask + lv2:documentation """ + +This is a status byte with the lower nibble set to zero. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.ttl new file mode 100644 index 00000000..81f34959 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/midi/midi.ttl @@ -0,0 +1,366 @@ +@prefix atom: . +@prefix ev: . +@prefix lv2: . +@prefix midi: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 MIDI" ; + rdfs:comment "A normalised definition of raw MIDI." ; + rdfs:seeAlso , + . + +midi:ActiveSense + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Active Sense" ; + rdfs:comment "MIDI active sense message." ; + midi:status "FE"^^xsd:hexBinary . + +midi:Aftertouch + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Aftertouch" ; + rdfs:comment "MIDI aftertouch message." ; + midi:statusMask "A0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:noteNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:pressure + ] . + +midi:Bender + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Bender" ; + rdfs:comment "MIDI bender message." ; + midi:statusMask "E0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 , + 1 ; + midi:property midi:benderValue + ] . + +midi:ChannelPressure + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Channel Pressure" ; + rdfs:comment "MIDI channel pressure message." ; + midi:statusMask "D0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:pressure + ] . + +midi:Chunk + a rdfs:Class ; + rdfs:label "Chunk" ; + rdfs:comment "A sequence of contiguous bytes in a MIDI message." . + +midi:Clock + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Clock" ; + rdfs:comment "MIDI clock message." ; + midi:status "F8"^^xsd:hexBinary . + +midi:Continue + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Continue" ; + rdfs:comment "MIDI continue message." ; + midi:status "FB"^^xsd:hexBinary . + +midi:Controller + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Controller" ; + rdfs:comment "MIDI controller change message." ; + midi:statusMask "B0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:controllerNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:controllerValue + ] . + +midi:HexByte + a rdfs:Datatype ; + owl:onDatatype xsd:hexBinary ; + owl:withRestrictions ( + [ + xsd:maxInclusive "FF" + ] + ) ; + rdfs:label "Hex Byte" ; + rdfs:comment "A hexadecimal byte, which has a value <= FF." . + +midi:MidiEvent + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf ev:Event , + atom:Atom ; + owl:onDatatype xsd:hexBinary ; + rdfs:label "MIDI Message" ; + rdfs:comment "A single raw MIDI message." . + +midi:NoteOff + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Note Off" ; + rdfs:comment "MIDI note off message." ; + midi:statusMask "80"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:noteNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:velocity + ] . + +midi:NoteOn + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Note On" ; + rdfs:comment "MIDI note on message." ; + midi:statusMask "90"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:noteNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:velocity + ] . + +midi:ProgramChange + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Program Change" ; + rdfs:comment "MIDI program change message." ; + midi:statusMask "C0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:programNumber + ] . + +midi:QuarterFrame + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Quarter Frame" ; + rdfs:comment "MIDI quarter frame message." ; + midi:status "F1"^^xsd:hexBinary . + +midi:Reset + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Reset" ; + rdfs:comment "MIDI reset message." ; + midi:status "FF"^^xsd:hexBinary . + +midi:SongPosition + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Song Position" ; + rdfs:comment "MIDI song position pointer message." ; + midi:status "F2"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 , + 1 ; + midi:property midi:songPosition + ] . + +midi:SongSelect + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Song Select" ; + rdfs:comment "MIDI song select message." ; + midi:status "F3"^^xsd:hexBinary . + +midi:Start + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Start" ; + rdfs:comment "MIDI start message." ; + midi:status "FA"^^xsd:hexBinary . + +midi:Stop + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Stop" ; + rdfs:comment "MIDI stop message." ; + midi:status "FC"^^xsd:hexBinary . + +midi:SystemCommon + a rdfs:Class ; + rdfs:subClassOf midi:SystemMessage ; + rdfs:label "System Common" ; + rdfs:comment "MIDI system common message." . + +midi:SystemExclusive + a rdfs:Class ; + rdfs:subClassOf midi:SystemMessage ; + rdfs:label "System Exclusive" ; + rdfs:comment "MIDI system exclusive message." ; + midi:status "F0"^^xsd:hexBinary . + +midi:SystemMessage + a rdfs:Class ; + rdfs:subClassOf midi:MidiEvent ; + rdfs:label "System Message" ; + rdfs:comment "MIDI system message." ; + midi:statusMask "F0"^^xsd:hexBinary . + +midi:SystemRealtime + a rdfs:Class ; + rdfs:subClassOf midi:SystemMessage ; + rdfs:label "System Realtime" ; + rdfs:comment "MIDI system realtime message." . + +midi:TuneRequest + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Tune Request" ; + rdfs:comment "MIDI tune request message." ; + midi:status "F6"^^xsd:hexBinary . + +midi:VoiceMessage + a rdfs:Class ; + rdfs:subClassOf midi:MidiEvent ; + rdfs:label "Voice Message" ; + rdfs:comment "MIDI voice message." ; + midi:statusMask "F0"^^xsd:hexBinary . + +midi:benderValue + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "bender value" ; + rdfs:range xsd:short ; + rdfs:comment "MIDI pitch bender message (-8192 to 8192)." . + +midi:binding + a rdf:Property , + owl:ObjectProperty ; + rdfs:range midi:MidiEvent ; + rdfs:label "binding" ; + rdfs:comment "The MIDI event to bind a parameter to." . + +midi:byteNumber + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "byte number" ; + rdfs:domain midi:Chunk ; + rdfs:range xsd:unsignedByte ; + rdfs:comment "The 0-based index of a byte which is part of this chunk." . + +midi:channel + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "MIDI channel" ; + rdfs:range xsd:unsignedByte ; + rdfs:comment "The channel number of a MIDI message." . + +midi:chunk + a rdf:Property , + owl:ObjectProperty ; + rdfs:range midi:Chunk ; + rdfs:label "MIDI chunk" ; + rdfs:comment "A chunk of a MIDI message." . + +midi:controllerNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "MIDI controller number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a controller (0 to 127)." . + +midi:controllerValue + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "MIDI controller value" ; + rdfs:range xsd:byte ; + rdfs:comment "The value of a controller (0 to 127)." . + +midi:noteNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "note number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a note (0 to 127)." . + +midi:pressure + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "key pressure" ; + rdfs:range xsd:byte ; + rdfs:comment "Key pressure (0 to 127)." . + +midi:programNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "program number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a program (0 to 127)." . + +midi:property + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:label "property" ; + rdfs:domain midi:Chunk ; + rdfs:range rdf:Property ; + rdfs:comment "The property this chunk represents." . + +midi:songNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "song number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a song (0 to 127)." . + +midi:songPosition + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "song position" ; + rdfs:range xsd:short ; + rdfs:comment "Song position in MIDI beats (16th notes) (-8192 to 8192)." . + +midi:status + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "status byte" ; + rdfs:range midi:HexByte ; + rdfs:comment "The exact status byte for a message of this type." . + +midi:statusMask + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "status mask" ; + rdfs:range midi:HexByte ; + rdfs:comment "The status byte for a message of this type on channel 1." . + +midi:velocity + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "velocity" ; + rdfs:range midi:HexByte ; + rdfs:comment "The velocity of a note message (0 to 127)." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/manifest.ttl new file mode 100644 index 00000000..7c85cfd6 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 0 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h new file mode 100644 index 00000000..370937ae --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.h @@ -0,0 +1,48 @@ +/* + Copyright 2012-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_MORPH_H +#define LV2_MORPH_H + +/** + @defgroup morph Morph + @ingroup lv2 + + Ports that can dynamically change type. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_MORPH_URI "http://lv2plug.in/ns/ext/morph" ///< http://lv2plug.in/ns/ext/morph +#define LV2_MORPH_PREFIX LV2_MORPH_URI "#" ///< http://lv2plug.in/ns/ext/morph# + +#define LV2_MORPH__AutoMorphPort LV2_MORPH_PREFIX "AutoMorphPort" ///< http://lv2plug.in/ns/ext/morph#AutoMorphPort +#define LV2_MORPH__MorphPort LV2_MORPH_PREFIX "MorphPort" ///< http://lv2plug.in/ns/ext/morph#MorphPort +#define LV2_MORPH__interface LV2_MORPH_PREFIX "interface" ///< http://lv2plug.in/ns/ext/morph#interface +#define LV2_MORPH__supportsType LV2_MORPH_PREFIX "supportsType" ///< http://lv2plug.in/ns/ext/morph#supportsType +#define LV2_MORPH__currentType LV2_MORPH_PREFIX "currentType" ///< http://lv2plug.in/ns/ext/morph#currentType + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_MORPH_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.meta.ttl new file mode 100644 index 00000000..c2477831 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.meta.ttl @@ -0,0 +1,90 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix morph: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Morph" ; + doap:shortdesc "Ports that can dynamically change type." ; + doap:created "2012-05-22" ; + doap:developer ; + doap:release [ + doap:revision "1.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines two port types: morph:MorphPort, which has a +host-configurable type, and morph:AutoMorphPort, which may automatically change +type when a MorphPort's type is changed. These ports always have a default +type and work normally work in hosts that are unaware of this extension. Thus, +this extension provides a backwards compatibility mechanism which allows +plugins to use new port types but gracefully fall back to a default type in +hosts that do not support them. + +This extension only defines port types and properties for describing morph +ports. The actual run-time switching is done via the opts:interface API. + +"""^^lv2:Markdown . + +morph:MorphPort + lv2:documentation """ + +Ports of this type MUST have another type which defines the default buffer +format (for example lv2:ControlPort) but can be dynamically changed to a +different type in hosts that support opts:interface. + +The host may change the type of a MorphPort by setting its morph:currentType +with LV2_Options_Interface::set(). If the plugin has any morph:AutoMorphPort +ports, the host MUST check their types after changing any port type since they +may have changed. + +"""^^lv2:Markdown . + +morph:AutoMorphPort + lv2:documentation """ + +Ports of this type MUST have another type which defines the default buffer +format (for example, lv2:ControlPort) but may dynamically change types based on +the configured types of any morph:MorphPort ports on the same plugin instance. + +The type of a port may only change in response to a host call to +LV2_Options_Interface::set(). Whenever any port type on the instance changes, +the host MUST check the type of all morph:AutoMorphPort ports with +LV2_Options_Interface::get() before calling run() again, since they may have +changed. If the type of any port is zero, it means the current configuration +is invalid and the plugin may not be run (unless that port is +lv2:connectionOptional and connected to NULL). + +This is mainly useful for outputs whose type depends on the type of +corresponding inputs. + +"""^^lv2:Markdown . + +morph:supportsType + lv2:documentation """ + +Indicates that a port supports being switched to a certain type. A MorphPort +MUST list each type it supports being switched to in the plugin data using this +property. + +"""^^lv2:Markdown . + +morph:currentType + lv2:documentation """ + +The currently active type of the port. This is for dynamic use as an option +and SHOULD NOT be listed in the static plugin data. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.ttl new file mode 100644 index 00000000..303293da --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/morph/morph.ttl @@ -0,0 +1,46 @@ +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix morph: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Morph" ; + rdfs:comment "Ports that can dynamically change type." ; + rdfs:seeAlso , + . + +morph:MorphPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Morph Port" ; + rdfs:comment "A port which can be switched to another type." . + +morph:AutoMorphPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Auto Morph Port" ; + rdfs:comment "A port that can change its type based on that of another." . + +morph:supportsType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain morph:MorphPort ; + rdfs:label "supports type" ; + rdfs:comment "A type that a port supports being switched to." . + +morph:currentType + a rdf:Property , + opts:Option , + owl:ObjectProperty ; + rdfs:domain morph:MorphPort ; + rdfs:label "current type" ; + rdfs:comment "The currently active type of the port." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/manifest.ttl new file mode 100644 index 00000000..18db4483 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h new file mode 100644 index 00000000..0d0c16dd --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.h @@ -0,0 +1,149 @@ +/* + Copyright 2012-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_OPTIONS_H +#define LV2_OPTIONS_H + +/** + @defgroup options Options + @ingroup lv2 + + Instantiation time options. + + See for details. + + @{ +*/ + +#include "lv2/core/lv2.h" +#include "lv2/urid/urid.h" + +#include + +// clang-format off + +#define LV2_OPTIONS_URI "http://lv2plug.in/ns/ext/options" ///< http://lv2plug.in/ns/ext/options +#define LV2_OPTIONS_PREFIX LV2_OPTIONS_URI "#" ///< http://lv2plug.in/ns/ext/options# + +#define LV2_OPTIONS__Option LV2_OPTIONS_PREFIX "Option" ///< http://lv2plug.in/ns/ext/options#Option +#define LV2_OPTIONS__interface LV2_OPTIONS_PREFIX "interface" ///< http://lv2plug.in/ns/ext/options#interface +#define LV2_OPTIONS__options LV2_OPTIONS_PREFIX "options" ///< http://lv2plug.in/ns/ext/options#options +#define LV2_OPTIONS__requiredOption LV2_OPTIONS_PREFIX "requiredOption" ///< http://lv2plug.in/ns/ext/options#requiredOption +#define LV2_OPTIONS__supportedOption LV2_OPTIONS_PREFIX "supportedOption" ///< http://lv2plug.in/ns/ext/options#supportedOption + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +/** + The context of an Option, which defines the subject it applies to. +*/ +typedef enum { + /** + This option applies to the instance itself. The subject must be + ignored. + */ + LV2_OPTIONS_INSTANCE, + + /** + This option applies to some named resource. The subject is a URI mapped + to an integer (a LV2_URID, like the key) + */ + LV2_OPTIONS_RESOURCE, + + /** + This option applies to some blank node. The subject is a blank node + identifier, which is valid only within the current local scope. + */ + LV2_OPTIONS_BLANK, + + /** + This option applies to a port on the instance. The subject is the + port's index. + */ + LV2_OPTIONS_PORT +} LV2_Options_Context; + +/** + An option. + + This is a property with a subject, also known as a triple or statement. + + This struct is useful anywhere a statement needs to be passed where no + memory ownership issues are present (since the value is a const pointer). + + Options can be passed to an instance via the feature LV2_OPTIONS__options + with data pointed to an array of options terminated by a zeroed option, or + accessed/manipulated using LV2_Options_Interface. +*/ +typedef struct { + LV2_Options_Context context; /**< Context (type of subject). */ + uint32_t subject; /**< Subject. */ + LV2_URID key; /**< Key (property). */ + uint32_t size; /**< Size of value in bytes. */ + LV2_URID type; /**< Type of value (datatype). */ + const void* value; /**< Pointer to value (object). */ +} LV2_Options_Option; + +/** A status code for option functions. */ +typedef enum { + LV2_OPTIONS_SUCCESS = 0, /**< Completed successfully. */ + LV2_OPTIONS_ERR_UNKNOWN = 1, /**< Unknown error. */ + LV2_OPTIONS_ERR_BAD_SUBJECT = 1 << 1, /**< Invalid/unsupported subject. */ + LV2_OPTIONS_ERR_BAD_KEY = 1 << 2, /**< Invalid/unsupported key. */ + LV2_OPTIONS_ERR_BAD_VALUE = 1 << 3 /**< Invalid/unsupported value. */ +} LV2_Options_Status; + +/** + Interface for dynamically setting options (LV2_OPTIONS__interface). +*/ +typedef struct { + /** + Get the given options. + + Each element of the passed options array MUST have type, subject, and + key set. All other fields (size, type, value) MUST be initialised to + zero, and are set to the option value if such an option is found. + + This function is in the "instantiation" LV2 threading class, so no other + instance functions may be called concurrently. + + @return Bitwise OR of LV2_Options_Status values. + */ + uint32_t (*get)(LV2_Handle instance, LV2_Options_Option* options); + + /** + Set the given options. + + This function is in the "instantiation" LV2 threading class, so no other + instance functions may be called concurrently. + + @return Bitwise OR of LV2_Options_Status values. + */ + uint32_t (*set)(LV2_Handle instance, const LV2_Options_Option* options); +} LV2_Options_Interface; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_OPTIONS_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.meta.ttl new file mode 100644 index 00000000..838b0b94 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.meta.ttl @@ -0,0 +1,129 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix opts: . +@prefix rdf: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Options" ; + doap:shortdesc "Runtime options for LV2 plugins and UIs." ; + doap:created "2012-08-20" ; + doap:developer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Relax range of opts:requiredOption and opts:supportedOption" + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2013-01-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Set the range of opts:requiredOption and opts:supportedOption to opts:Option." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a facility for options, which are values the host +passes to a plugin or UI at run time. + +There are two facilities for passing options to an instance: opts:options +allows passing options at instantiation time, and the opts:interface interface +allows options to be dynamically set and retrieved after instantiation. + +Note that this extension is only for allowing hosts to configure plugins, and +is not a live control mechanism. For real-time control, use event-based +control via an atom:AtomPort with an atom:Sequence buffer. + +Instances may indicate they require an option with the opts:requiredOption +property, or that they optionally support an option with the +opts:supportedOption property. + +"""^^lv2:Markdown . + +opts:Option + lv2:documentation """ + +It is not required for a property to explicitly be an Option in order to be +used as such. However, properties which are primarily intended for use as +options, or are at least particularly useful as options, should be explicitly +given this type for documentation purposes, and to assist hosts in discovering +option definitions. + +"""^^lv2:Markdown . + +opts:interface + lv2:documentation """ + +An interface (LV2_Options_Interface) for dynamically setting and getting +options. Note that this is intended for use by the host for configuring +plugins only, and is not a live plugin control mechanism. + +The plugin data file should advertise this interface like so: + + :::turtle + @prefix opts: . + + + a lv2:Plugin ; + lv2:extensionData opts:interface . + +"""^^lv2:Markdown . + +opts:options + lv2:documentation """ + +To implement this feature, hosts MUST pass an LV2_Feature to the appropriate +instantiate method with this URI and data pointed to an array of +LV2_Options_Option terminated by an element with both key and value set to +zero. The instance should cast this data pointer to `const +LV2_Options_Option*` and scan the array for any options of interest. The +instance MUST NOT modify the options array in any way. + +Note that requiring this feature may reduce the number of compatible hosts. +Unless some options are strictly required by the instance, this feature SHOULD +be listed as an lv2:optionalFeature. + +"""^^lv2:Markdown . + +opts:requiredOption + lv2:documentation """ + +The host MUST pass a value for the specified option via opts:options during +instantiation. + +Note that use of this property may reduce the number of compatible hosts. +Wherever possible, it is better to list options with opts:supportedOption and +fall back to a reasonable default value if it is not provided. + +"""^^lv2:Markdown . + +opts:supportedOption + lv2:documentation """ + +The host SHOULD provide a value for the specified option if one is known, or +provide the user an opportunity to specify one if possible. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.ttl new file mode 100644 index 00000000..f8388da8 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/options/options.ttl @@ -0,0 +1,44 @@ +@prefix lv2: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Options" ; + rdfs:comment "Runtime options for LV2 plugins and UIs." ; + rdfs:seeAlso , + . + +opts:Option + a rdfs:Class ; + rdfs:label "Option" ; + rdfs:subClassOf rdf:Property ; + rdfs:comment "A value for a static option passed to an instance." . + +opts:interface + a lv2:ExtensionData ; + rdfs:label "interface" ; + rdfs:comment "An interface for dynamically setting and getting options." . + +opts:options + a lv2:Feature ; + rdfs:label "options" ; + rdfs:comment "The feature used to provide options to an instance." . + +opts:requiredOption + a rdf:Property , + owl:ObjectProperty ; + rdfs:range rdf:Property ; + rdfs:label "required option" ; + rdfs:comment "An option required by the instance to function at all." . + +opts:supportedOption + a rdf:Property , + owl:ObjectProperty ; + rdfs:range rdf:Property ; + rdfs:label "supported option" ; + rdfs:comment "An option supported or by the instance." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/manifest.ttl new file mode 100644 index 00000000..57f5d2e1 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h new file mode 100644 index 00000000..66a75615 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.h @@ -0,0 +1,68 @@ +/* + Copyright 2012-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_PARAMETERS_H +#define LV2_PARAMETERS_H + +/** + @defgroup parameters Parameters + @ingroup lv2 + + Common parameters for audio processing. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_PARAMETERS_URI "http://lv2plug.in/ns/ext/parameters" ///< http://lv2plug.in/ns/ext/parameters +#define LV2_PARAMETERS_PREFIX LV2_PARAMETERS_URI "#" ///< http://lv2plug.in/ns/ext/parameters# + +#define LV2_PARAMETERS__CompressorControls LV2_PARAMETERS_PREFIX "CompressorControls" ///< http://lv2plug.in/ns/ext/parameters#CompressorControls +#define LV2_PARAMETERS__ControlGroup LV2_PARAMETERS_PREFIX "ControlGroup" ///< http://lv2plug.in/ns/ext/parameters#ControlGroup +#define LV2_PARAMETERS__EnvelopeControls LV2_PARAMETERS_PREFIX "EnvelopeControls" ///< http://lv2plug.in/ns/ext/parameters#EnvelopeControls +#define LV2_PARAMETERS__FilterControls LV2_PARAMETERS_PREFIX "FilterControls" ///< http://lv2plug.in/ns/ext/parameters#FilterControls +#define LV2_PARAMETERS__OscillatorControls LV2_PARAMETERS_PREFIX "OscillatorControls" ///< http://lv2plug.in/ns/ext/parameters#OscillatorControls +#define LV2_PARAMETERS__amplitude LV2_PARAMETERS_PREFIX "amplitude" ///< http://lv2plug.in/ns/ext/parameters#amplitude +#define LV2_PARAMETERS__attack LV2_PARAMETERS_PREFIX "attack" ///< http://lv2plug.in/ns/ext/parameters#attack +#define LV2_PARAMETERS__bypass LV2_PARAMETERS_PREFIX "bypass" ///< http://lv2plug.in/ns/ext/parameters#bypass +#define LV2_PARAMETERS__cutoffFrequency LV2_PARAMETERS_PREFIX "cutoffFrequency" ///< http://lv2plug.in/ns/ext/parameters#cutoffFrequency +#define LV2_PARAMETERS__decay LV2_PARAMETERS_PREFIX "decay" ///< http://lv2plug.in/ns/ext/parameters#decay +#define LV2_PARAMETERS__delay LV2_PARAMETERS_PREFIX "delay" ///< http://lv2plug.in/ns/ext/parameters#delay +#define LV2_PARAMETERS__dryLevel LV2_PARAMETERS_PREFIX "dryLevel" ///< http://lv2plug.in/ns/ext/parameters#dryLevel +#define LV2_PARAMETERS__frequency LV2_PARAMETERS_PREFIX "frequency" ///< http://lv2plug.in/ns/ext/parameters#frequency +#define LV2_PARAMETERS__gain LV2_PARAMETERS_PREFIX "gain" ///< http://lv2plug.in/ns/ext/parameters#gain +#define LV2_PARAMETERS__hold LV2_PARAMETERS_PREFIX "hold" ///< http://lv2plug.in/ns/ext/parameters#hold +#define LV2_PARAMETERS__pulseWidth LV2_PARAMETERS_PREFIX "pulseWidth" ///< http://lv2plug.in/ns/ext/parameters#pulseWidth +#define LV2_PARAMETERS__ratio LV2_PARAMETERS_PREFIX "ratio" ///< http://lv2plug.in/ns/ext/parameters#ratio +#define LV2_PARAMETERS__release LV2_PARAMETERS_PREFIX "release" ///< http://lv2plug.in/ns/ext/parameters#release +#define LV2_PARAMETERS__resonance LV2_PARAMETERS_PREFIX "resonance" ///< http://lv2plug.in/ns/ext/parameters#resonance +#define LV2_PARAMETERS__sampleRate LV2_PARAMETERS_PREFIX "sampleRate" ///< http://lv2plug.in/ns/ext/parameters#sampleRate +#define LV2_PARAMETERS__sustain LV2_PARAMETERS_PREFIX "sustain" ///< http://lv2plug.in/ns/ext/parameters#sustain +#define LV2_PARAMETERS__threshold LV2_PARAMETERS_PREFIX "threshold" ///< http://lv2plug.in/ns/ext/parameters#threshold +#define LV2_PARAMETERS__waveform LV2_PARAMETERS_PREFIX "waveform" ///< http://lv2plug.in/ns/ext/parameters#waveform +#define LV2_PARAMETERS__wetDryRatio LV2_PARAMETERS_PREFIX "wetDryRatio" ///< http://lv2plug.in/ns/ext/parameters#wetDryRatio +#define LV2_PARAMETERS__wetLevel LV2_PARAMETERS_PREFIX "wetLevel" ///< http://lv2plug.in/ns/ext/parameters#wetLevel + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_PARAMETERS_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.meta.ttl new file mode 100644 index 00000000..9d7c623f --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.meta.ttl @@ -0,0 +1,75 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix param: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Parameters" ; + doap:release [ + doap:revision "1.4" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add range to parameters so hosts know how to control them." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add param:sampleRate." + ] , [ + rdfs:label "Add parameters.h of URI defines for convenience." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + doap:created "2009-00-00" ; + doap:shortdesc "Common parameters for audio processing." ; + doap:maintainer ; + doap:developer ; + lv2:documentation """ + +This is a vocabulary for parameters that are common in audio processing +software. A parameter is purely a metadata concept, unrelated to any +particular code mechanism. Parameters are used to assign meaning to controls +(for example, using lv2:designation for ports) so they can be used more +intelligently or presented to the user more efficiently. + +"""^^lv2:Markdown . + +param:wetDryRatio + a lv2:Parameter ; + rdfs:label "wet/dry ratio" ; + lv2:documentation """ + +The ratio between processed and bypass components in output signal. The dry +and wet percentages can be calculated from the following equations: + + :::c + dry = (wetDryRatio.maximum - wetDryRatio.value) / wetDryRatio.maximum + wet = wetDryRatio.value / wetDryRatio.maximum + +Typically, maximum value of 1 or 100 and minimum value of 0 should be used. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.ttl new file mode 100644 index 00000000..5c3dadf9 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/parameters/parameters.ttl @@ -0,0 +1,202 @@ +@prefix atom: . +@prefix lv2: . +@prefix owl: . +@prefix param: . +@prefix pg: . +@prefix rdf: . +@prefix rdfs: . +@prefix units: . + + + a owl:Ontology ; + rdfs:label "LV2 Parameters" ; + rdfs:comment "Common parameters for audio processing." ; + rdfs:seeAlso . + +param:ControlGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Control Group" ; + rdfs:comment "A group representing a set of associated controls." . + +param:amplitude + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "amplitude" ; + rdfs:comment "An amplitude as a factor, where 0 is silent and 1 is unity." . + +param:attack + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "attack" ; + rdfs:comment "The duration of an envelope attack stage." . + +param:cutoffFrequency + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "cutoff frequency" ; + rdfs:comment "The cutoff frequency, typically in Hz, for a filter." . + +param:decay + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "decay" ; + rdfs:comment "The duration of an envelope decay stage." . + +param:delay + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "delay" ; + rdfs:comment "The duration of an envelope delay stage." . + +param:frequency + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "frequency" ; + rdfs:comment "A frequency, typically in Hz." . + +param:hold + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "hold" ; + rdfs:comment "The duration of an envelope hold stage." . + +param:pulseWidth + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "pulse width" ; + rdfs:comment "The width of a pulse of a rectangular waveform." . + +param:ratio + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "ratio" ; + rdfs:comment "Compression ratio." . + +param:release + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "release" ; + rdfs:comment "The duration of an envelope release stage." . + +param:resonance + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "resonance" ; + rdfs:comment "The resonance of a filter." . + +param:sustain + a lv2:Parameter ; + rdfs:label "sustain" ; + rdfs:range atom:Float ; + rdfs:comment "The level of an envelope sustain stage as a factor." . + +param:threshold + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "threshold" ; + rdfs:comment "Compression threshold." . + +param:waveform + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "waveform" ; + rdfs:comment """The waveform "fader" for oscillators or modulators that have several.""" . + +param:gain + a lv2:Parameter ; + rdfs:range atom:Float ; + lv2:default 0.0 ; + lv2:minimum -20.0 ; + lv2:maximum 20.0 ; + units:unit units:db ; + rdfs:label "gain" ; + rdfs:comment "Gain in decibels." . + +param:wetDryRatio + a lv2:Parameter ; + rdfs:label "wet/dry ratio" ; + rdfs:comment "The ratio between processed and bypassed levels in the output." . + +param:wetLevel + a lv2:Parameter ; + rdfs:label "wet level" ; + rdfs:comment "The level of the processed component of a signal." . + +param:dryLevel + a lv2:Parameter ; + rdfs:label "dry level" ; + rdfs:comment "The level of the unprocessed component of a signal." . + +param:bypass + a lv2:Parameter ; + rdfs:label "bypass" ; + rdfs:comment "A boolean parameter that disables processing if true." . + +param:sampleRate + a lv2:Parameter ; + rdfs:label "sample rate" ; + rdfs:comment "A sample rate in Hz." . + +param:EnvelopeControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Envelope Controls" ; + rdfs:comment "Typical controls for a DAHDSR envelope." ; + pg:element [ + lv2:index 0 ; + lv2:designation param:delay + ] , [ + lv2:index 1 ; + lv2:designation param:attack + ] , [ + lv2:index 2 ; + lv2:designation param:hold + ] , [ + lv2:index 3 ; + lv2:designation param:decay + ] , [ + lv2:index 4 ; + lv2:designation param:sustain + ] , [ + lv2:index 5 ; + lv2:designation param:release + ] . + +param:OscillatorControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Oscillator Controls" ; + rdfs:comment "Typical controls for an oscillator." ; + pg:element [ + lv2:designation param:frequency + ] , [ + lv2:designation param:amplitude + ] , [ + lv2:designation param:waveform + ] , [ + lv2:designation param:pulseWidth + ] . + +param:FilterControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Filter Controls" ; + rdfs:comment "Typical controls for a filter." ; + pg:element [ + lv2:designation param:cutoffFrequency + ] , [ + lv2:designation param:resonance + ] . + +param:CompressorControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Compressor Controls" ; + rdfs:comment "Typical controls for a compressor." ; + pg:element [ + lv2:designation param:threshold + ] , [ + lv2:designation param:ratio + ] . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/manifest.ttl new file mode 100644 index 00000000..25150bdd --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 8 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h new file mode 100644 index 00000000..4db2abbd --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.h @@ -0,0 +1,73 @@ +/* + Copyright 2012-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_PATCH_H +#define LV2_PATCH_H + +/** + @defgroup patch Patch + @ingroup lv2 + + Messages for accessing and manipulating properties. + + Note the patch extension is purely data, this header merely defines URIs for + convenience. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_PATCH_URI "http://lv2plug.in/ns/ext/patch" ///< http://lv2plug.in/ns/ext/patch +#define LV2_PATCH_PREFIX LV2_PATCH_URI "#" ///< http://lv2plug.in/ns/ext/patch# + +#define LV2_PATCH__Ack LV2_PATCH_PREFIX "Ack" ///< http://lv2plug.in/ns/ext/patch#Ack +#define LV2_PATCH__Delete LV2_PATCH_PREFIX "Delete" ///< http://lv2plug.in/ns/ext/patch#Delete +#define LV2_PATCH__Copy LV2_PATCH_PREFIX "Copy" ///< http://lv2plug.in/ns/ext/patch#Copy +#define LV2_PATCH__Error LV2_PATCH_PREFIX "Error" ///< http://lv2plug.in/ns/ext/patch#Error +#define LV2_PATCH__Get LV2_PATCH_PREFIX "Get" ///< http://lv2plug.in/ns/ext/patch#Get +#define LV2_PATCH__Message LV2_PATCH_PREFIX "Message" ///< http://lv2plug.in/ns/ext/patch#Message +#define LV2_PATCH__Move LV2_PATCH_PREFIX "Move" ///< http://lv2plug.in/ns/ext/patch#Move +#define LV2_PATCH__Patch LV2_PATCH_PREFIX "Patch" ///< http://lv2plug.in/ns/ext/patch#Patch +#define LV2_PATCH__Post LV2_PATCH_PREFIX "Post" ///< http://lv2plug.in/ns/ext/patch#Post +#define LV2_PATCH__Put LV2_PATCH_PREFIX "Put" ///< http://lv2plug.in/ns/ext/patch#Put +#define LV2_PATCH__Request LV2_PATCH_PREFIX "Request" ///< http://lv2plug.in/ns/ext/patch#Request +#define LV2_PATCH__Response LV2_PATCH_PREFIX "Response" ///< http://lv2plug.in/ns/ext/patch#Response +#define LV2_PATCH__Set LV2_PATCH_PREFIX "Set" ///< http://lv2plug.in/ns/ext/patch#Set +#define LV2_PATCH__accept LV2_PATCH_PREFIX "accept" ///< http://lv2plug.in/ns/ext/patch#accept +#define LV2_PATCH__add LV2_PATCH_PREFIX "add" ///< http://lv2plug.in/ns/ext/patch#add +#define LV2_PATCH__body LV2_PATCH_PREFIX "body" ///< http://lv2plug.in/ns/ext/patch#body +#define LV2_PATCH__context LV2_PATCH_PREFIX "context" ///< http://lv2plug.in/ns/ext/patch#context +#define LV2_PATCH__destination LV2_PATCH_PREFIX "destination" ///< http://lv2plug.in/ns/ext/patch#destination +#define LV2_PATCH__property LV2_PATCH_PREFIX "property" ///< http://lv2plug.in/ns/ext/patch#property +#define LV2_PATCH__readable LV2_PATCH_PREFIX "readable" ///< http://lv2plug.in/ns/ext/patch#readable +#define LV2_PATCH__remove LV2_PATCH_PREFIX "remove" ///< http://lv2plug.in/ns/ext/patch#remove +#define LV2_PATCH__request LV2_PATCH_PREFIX "request" ///< http://lv2plug.in/ns/ext/patch#request +#define LV2_PATCH__subject LV2_PATCH_PREFIX "subject" ///< http://lv2plug.in/ns/ext/patch#subject +#define LV2_PATCH__sequenceNumber LV2_PATCH_PREFIX "sequenceNumber" ///< http://lv2plug.in/ns/ext/patch#sequenceNumber +#define LV2_PATCH__value LV2_PATCH_PREFIX "value" ///< http://lv2plug.in/ns/ext/patch#value +#define LV2_PATCH__wildcard LV2_PATCH_PREFIX "wildcard" ///< http://lv2plug.in/ns/ext/patch#wildcard +#define LV2_PATCH__writable LV2_PATCH_PREFIX "writable" ///< http://lv2plug.in/ns/ext/patch#writable + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_PATCH_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.meta.ttl new file mode 100644 index 00000000..ebe08071 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.meta.ttl @@ -0,0 +1,374 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix patch: . +@prefix rdfs: . + + + a doap:Project ; + doap:created "2012-02-09" ; + doap:license ; + doap:developer ; + doap:name "LV2 Patch" ; + doap:shortdesc "A protocol for accessing and manipulating properties." ; + doap:release [ + doap:revision "2.8" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect type of patch:sequenceNumber." + ] + ] + ] , [ + doap:revision "2.6" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add patch:accept property." + ] , [ + rdfs:label "Add patch:context property." + ] + ] + ] , [ + doap:revision "2.4" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Define patch:Get with no subject to implicitly apply to reciever. This can be used by UIs to get an initial description of a plugin." + ] , [ + rdfs:label "Add patch:Copy method." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add patch:sequenceNumber for associating replies with requests." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2013-01-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make patch:Set a compact message for setting one property." + ] , [ + rdfs:label "Add patch:readable and patch:writable for describing available properties." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This is a vocabulary for messages that access and manipulate properties. +It can be used as a dynamic control interface for plugins, +or anything else with a property-based model. + +The key underlying concept here is to control things by manipulating arbitrary properties, +rather than by calling application-specific methods. +This allows implementations to understand what messages do +(at least in a mechanical sense), +which makes things like caching, proxying, or undo relatively straightforward to implement. +Note, however, that this is only conceptual: +there is no requirement to implement a general property store. +Typically, a plugin will understand a fixed set of properties that represent its parameters or other internal state, and ignore everything else. + +This protocol is syntax-agnostic, +and [homoiconic](https://en.wikipedia.org/wiki/Homoiconicity) +in the sense that the messages use the same format as the data they manipulate. +In particular, messages can be serialised as a binary [Object](atom.html#Object) for realtime plugin control, +or as Turtle for saving to a file, +sending over a network, +printing for debugging purposes, +and so on. + +This specification only defines a semantic protocol, +there is no corresponding API. +It can be used with the [Atom](atom.html) extension to control plugins which support message-based parameters as defined by the [Parameters](parameters.html) extension. + +For example, if a plugin defines a `eg:volume` parameter, it can be controlled by the host by sending a patch:Set message to the plugin instance: + + :::turtle + [ + a patch:Set ; + patch:property eg:volume ; + patch:value 11.0 ; + ] + +Similarly, the host could get the current value for this parameter by sending a patch:Get message: + + :::turtle + [ + a patch:Get ; + patch:property eg:volume ; + ] + +The plugin would then respond with the same patch:Set message as above. +In this case, the plugin instance is implicitly the patch:subject, +but a specific subject can also be given for deeper control. + +"""^^lv2:Markdown . + +patch:Copy + lv2:documentation """ + +After this, the destination has the same description as the subject, +and the subject is unchanged. + +It is an error if the subject does not exist, +or if the destination already exists. + +Multiple subjects may be given if the destination is a container, +but the semantics of this case are application-defined. + +"""^^lv2:Markdown . + +patch:Get + lv2:documentation """ + +If a patch:property is given, +then the receiver should respond with a patch:Set message that gives only that property. + +Otherwise, it should respond with a [concise bounded description](http://www.w3.org/Submission/CBD/) in a patch:Put message, +that is, a description that recursively includes any blank node values. + +If a patch:subject is given, then the response should have the same subject. +If no subject is given, then the receiver is implicitly the subject. + +If a patch:request node or a patch:sequenceNumber is given, +then the response should be a patch:Response and have the same property. +If neither is given, then the receiver can respond with a simple patch:Put message. +For example: + + :::turtle + [] + a patch:Get ; + patch:subject eg:something . + +Could result in: + + :::turtle + [] + a patch:Put ; + patch:subject eg:something ; + patch:body [ + eg:name "Something" ; + eg:ratio 1.6180339887 ; + ] . + +"""^^lv2:Markdown . + +patch:Insert + lv2:documentation """ + +If the subject does not exist, it is created. If the subject does already +exist, it is added to. + +This request only adds properties, it never removes them. The user must take +care that multiple values are not set for properties which should only have +one. + +"""^^lv2:Markdown . + +patch:Message + lv2:documentation """ + +This is an abstract base class for all patch messages. Concrete messages are +either a patch:Request or a patch:Response. + +"""^^lv2:Markdown . + +patch:Move + lv2:documentation """ + +After this, the destination has the description that the subject had, and the +subject no longer exists. + +It is an error if the subject does not exist, or if the destination already +exists. + +"""^^lv2:Markdown . + +patch:Patch + lv2:documentation """ + +This method always has at least one subject, and exactly one patch:add and +patch:remove property. The value of patch:add and patch:remove are nodes which +have the properties to add or remove from the subject(s), respectively. The +special value patch:wildcard may be used as the value of a remove property to +remove all properties with the given predicate. For example: + + :::turtle + [] + a patch:Patch ; + patch:subject ; + patch:add [ + eg:name "New name" ; + eg:age 42 ; + ] ; + patch:remove [ + eg:name "Old name" ; + eg:age patch:wildcard ; # Remove all old eg:age properties + ] . + +"""^^lv2:Markdown . + +patch:Put + lv2:documentation """ + +If the subject does not already exist, it is created. If the subject does +already exist, the patch:body is considered an updated version of it, and the +previous version is replaced. + + :::turtle + [] + a patch:Put ; + patch:subject ; + patch:body [ + eg:name "New name" ; + eg:age 42 ; + ] . + +"""^^lv2:Markdown . + +patch:Request + a rdfs:Class ; + rdfs:label "Request" ; + rdfs:subClassOf patch:Message ; + lv2:documentation """ + +A request may have a patch:subject property, which specifies the resource that +the request applies to. The subject may be omitted in contexts where it is +implicit, for example if the recipient is the subject. + +"""^^lv2:Markdown . + +patch:Set + lv2:documentation """ + +This is equivalent to a patch:Patch which removes _all_ pre-existing values for +the property before setting the new value. For example: + + :::turtle + [] + a patch:Set ; + patch:subject ; + patch:property eg:name ; + patch:value "New name" . + +Which is equivalent to: + + :::turtle + [] + a patch:Patch ; + patch:subject ; + patch:add [ + eg:name "New name" ; + ] ; + patch:remove [ + eg:name patch:wildcard ; + ] . + +"""^^lv2:Markdown . + +patch:body + lv2:documentation """ + +The details of this property's value depend on the type of message it is a part +of. + +"""^^lv2:Markdown . + +patch:context + lv2:documentation """ + +For example, a plugin may have a special context for ephemeral properties which +are only relevant during the lifetime of the instance and should not be saved +in state. + +The specific uses for contexts are application specific. However, the context +MUST be a URI, and can be interpreted as the ID of a data model where +properties should be stored. Implementations MAY have special support for +contexts, for example by storing in a quad store or serializing to a format +that supports multiple RDF graphs such as TriG. + +"""^^lv2:Markdown . + +patch:readable + lv2:documentation """ + +See the similar patch:writable property for details. + +"""^^lv2:Markdown . + +patch:request + lv2:documentation """ + +This can be used if referring directly to the URI or blank node ID of the +request is possible. Otherwise, use patch:sequenceNumber. + +"""^^lv2:Markdown . + +patch:sequenceNumber + lv2:documentation """ + +This property is used to associate replies with requests when it is not +feasible to refer to request URIs with patch:request. A patch:Response with a +given sequence number is the reply to the previously send patch:Request with +the same sequence number. + +The special sequence number 0 means that no reply is desired. + +"""^^lv2:Markdown . + +patch:wildcard + lv2:documentation """ + +This makes it possible to describe the removal of all values for a given +property. + +"""^^lv2:Markdown . + +patch:writable + lv2:documentation """ + +This is used to list properties that can be changed, for example to allow user +interfaces to present appropriate controls. For example: + + :::turtle + @prefix eg: . + @prefix rdf: . + @prefix rdfs: . + @prefix xsd: . + + eg:title + a rdf:Property ; + rdfs:label "title" ; + rdfs:range xsd:string . + + eg:plugin + patch:writable eg:title . + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.ttl new file mode 100644 index 00000000..78040094 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/patch/patch.ttl @@ -0,0 +1,251 @@ +@prefix foaf: . +@prefix owl: . +@prefix patch: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:seeAlso , + ; + rdfs:label "LV2 Patch" ; + rdfs:comment "A protocol for accessing and manipulating properties." . + +patch:Ack + a rdfs:Class ; + rdfs:subClassOf patch:Response ; + rdfs:label "Ack" ; + rdfs:comment "An acknowledgement that a request was successful." . + +patch:Copy + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Copy" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty patch:subject + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:destination + ] ; + rdfs:comment "A request to copy the patch:subject to the patch:destination." . + +patch:Delete + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Delete" ; + rdfs:comment "Request that the patch:subject or subjects be deleted." . + +patch:Error + a rdfs:Class ; + rdfs:subClassOf patch:Response ; + rdfs:label "Error" ; + rdfs:comment "A response indicating an error processing a request." . + +patch:Get + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Get" ; + rdfs:comment "A request for a description of the patch:subject." . + +patch:Insert + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Insert" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:subject + ] ; + rdfs:comment "A request to insert a patch:body into the patch:subject." . + +patch:Message + a rdfs:Class ; + rdfs:label "Patch Message" ; + rdfs:comment "A patch message." . + +patch:Move + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Move" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:subject + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:destination + ] ; + rdfs:comment "A request to move the patch:subject to the patch:destination." . + +patch:Patch + a rdfs:Class ; + rdfs:subClassOf patch:Request , + [ + a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty patch:subject + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:add + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:remove + ] ; + rdfs:label "Patch" ; + rdfs:comment "A request to add and/or remove properties of the patch:subject." . + +patch:Put + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Put" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:subject + ] ; + rdfs:comment "A request to put the patch:body as the patch:subject." . + +patch:Request + a rdfs:Class ; + rdfs:label "Request" ; + rdfs:subClassOf patch:Message ; + rdfs:comment "A patch request message." . + +patch:Response + a rdfs:Class ; + rdfs:subClassOf patch:Message ; + rdfs:label "Response" ; + rdfs:comment "A response to a patch:Request." . + +patch:Set + a rdfs:Class ; + rdfs:label "Set" ; + rdfs:subClassOf patch:Request , + [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:property + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:value + ] ; + rdfs:comment "A compact request to set a property to a value." . + +patch:accept + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "accept" ; + rdfs:domain patch:Request ; + rdfs:range rdfs:Class ; + rdfs:comment "An accepted type for a response." . + +patch:add + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Patch ; + rdfs:range rdfs:Resource ; + rdfs:label "add" ; + rdfs:comment "The properties to add to the subject." . + +patch:body + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Message ; + rdfs:label "body" ; + rdfs:comment "The body of a message." . + +patch:context + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain patch:Message ; + rdfs:label "context" ; + rdfs:comment "The context of properties in this message." . + +patch:destination + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Message ; + rdfs:label "destination" ; + rdfs:comment "The destination to move the patch:subject to." . + +patch:property + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "property" ; + rdfs:domain patch:Message ; + rdfs:range rdf:Property ; + rdfs:comment "The property for a patch:Set or patch:Get message." . + +patch:readable + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "readable" ; + rdfs:range rdf:Property ; + rdfs:comment "A property that can be read with a patch:Get message." . + +patch:remove + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:label "remove" ; + rdfs:domain patch:Patch ; + rdfs:range rdfs:Resource ; + rdfs:comment "The properties to remove from the subject." . + +patch:request + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:label "request" ; + rdfs:domain patch:Response ; + rdfs:range patch:Request ; + rdfs:comment "The request this is a response to." . + +patch:sequenceNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "sequence number" ; + rdfs:domain patch:Message ; + rdfs:range xsd:int ; + rdfs:comment "The sequence number of a request or response." . + +patch:subject + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Message ; + rdfs:label "subject" ; + rdfs:comment "The subject this message applies to." . + +patch:value + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "value" ; + rdfs:domain patch:Set ; + rdfs:range rdf:Property ; + rdfs:comment "The value of a property in a patch:Set message." . + +patch:wildcard + a rdfs:Resource ; + rdfs:label "wildcard" ; + rdfs:comment "A wildcard that matches any resource." . + +patch:writable + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "writable" ; + rdfs:range rdf:Property ; + rdfs:comment "A property that can be set with a patch:Set or patch:Patch message." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/manifest.ttl new file mode 100644 index 00000000..a887cb0f --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h new file mode 100644 index 00000000..0ff25c7f --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.h @@ -0,0 +1,77 @@ +/* + Copyright 2012-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_PORT_GROUPS_H +#define LV2_PORT_GROUPS_H + +/** + @defgroup port-groups Port Groups + @ingroup lv2 + + Multi-channel groups of LV2 ports. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_PORT_GROUPS_URI "http://lv2plug.in/ns/ext/port-groups" ///< http://lv2plug.in/ns/ext/port-groups +#define LV2_PORT_GROUPS_PREFIX LV2_PORT_GROUPS_URI "#" ///< http://lv2plug.in/ns/ext/port-groups# + +#define LV2_PORT_GROUPS__DiscreteGroup LV2_PORT_GROUPS_PREFIX "DiscreteGroup" ///< http://lv2plug.in/ns/ext/port-groups#DiscreteGroup +#define LV2_PORT_GROUPS__Element LV2_PORT_GROUPS_PREFIX "Element" ///< http://lv2plug.in/ns/ext/port-groups#Element +#define LV2_PORT_GROUPS__FivePointOneGroup LV2_PORT_GROUPS_PREFIX "FivePointOneGroup" ///< http://lv2plug.in/ns/ext/port-groups#FivePointOneGroup +#define LV2_PORT_GROUPS__FivePointZeroGroup LV2_PORT_GROUPS_PREFIX "FivePointZeroGroup" ///< http://lv2plug.in/ns/ext/port-groups#FivePointZeroGroup +#define LV2_PORT_GROUPS__FourPointZeroGroup LV2_PORT_GROUPS_PREFIX "FourPointZeroGroup" ///< http://lv2plug.in/ns/ext/port-groups#FourPointZeroGroup +#define LV2_PORT_GROUPS__Group LV2_PORT_GROUPS_PREFIX "Group" ///< http://lv2plug.in/ns/ext/port-groups#Group +#define LV2_PORT_GROUPS__InputGroup LV2_PORT_GROUPS_PREFIX "InputGroup" ///< http://lv2plug.in/ns/ext/port-groups#InputGroup +#define LV2_PORT_GROUPS__MidSideGroup LV2_PORT_GROUPS_PREFIX "MidSideGroup" ///< http://lv2plug.in/ns/ext/port-groups#MidSideGroup +#define LV2_PORT_GROUPS__MonoGroup LV2_PORT_GROUPS_PREFIX "MonoGroup" ///< http://lv2plug.in/ns/ext/port-groups#MonoGroup +#define LV2_PORT_GROUPS__OutputGroup LV2_PORT_GROUPS_PREFIX "OutputGroup" ///< http://lv2plug.in/ns/ext/port-groups#OutputGroup +#define LV2_PORT_GROUPS__SevenPointOneGroup LV2_PORT_GROUPS_PREFIX "SevenPointOneGroup" ///< http://lv2plug.in/ns/ext/port-groups#SevenPointOneGroup +#define LV2_PORT_GROUPS__SevenPointOneWideGroup LV2_PORT_GROUPS_PREFIX "SevenPointOneWideGroup" ///< http://lv2plug.in/ns/ext/port-groups#SevenPointOneWideGroup +#define LV2_PORT_GROUPS__SixPointOneGroup LV2_PORT_GROUPS_PREFIX "SixPointOneGroup" ///< http://lv2plug.in/ns/ext/port-groups#SixPointOneGroup +#define LV2_PORT_GROUPS__StereoGroup LV2_PORT_GROUPS_PREFIX "StereoGroup" ///< http://lv2plug.in/ns/ext/port-groups#StereoGroup +#define LV2_PORT_GROUPS__ThreePointZeroGroup LV2_PORT_GROUPS_PREFIX "ThreePointZeroGroup" ///< http://lv2plug.in/ns/ext/port-groups#ThreePointZeroGroup +#define LV2_PORT_GROUPS__center LV2_PORT_GROUPS_PREFIX "center" ///< http://lv2plug.in/ns/ext/port-groups#center +#define LV2_PORT_GROUPS__centerLeft LV2_PORT_GROUPS_PREFIX "centerLeft" ///< http://lv2plug.in/ns/ext/port-groups#centerLeft +#define LV2_PORT_GROUPS__centerRight LV2_PORT_GROUPS_PREFIX "centerRight" ///< http://lv2plug.in/ns/ext/port-groups#centerRight +#define LV2_PORT_GROUPS__element LV2_PORT_GROUPS_PREFIX "element" ///< http://lv2plug.in/ns/ext/port-groups#element +#define LV2_PORT_GROUPS__group LV2_PORT_GROUPS_PREFIX "group" ///< http://lv2plug.in/ns/ext/port-groups#group +#define LV2_PORT_GROUPS__left LV2_PORT_GROUPS_PREFIX "left" ///< http://lv2plug.in/ns/ext/port-groups#left +#define LV2_PORT_GROUPS__lowFrequencyEffects LV2_PORT_GROUPS_PREFIX "lowFrequencyEffects" ///< http://lv2plug.in/ns/ext/port-groups#lowFrequencyEffects +#define LV2_PORT_GROUPS__mainInput LV2_PORT_GROUPS_PREFIX "mainInput" ///< http://lv2plug.in/ns/ext/port-groups#mainInput +#define LV2_PORT_GROUPS__mainOutput LV2_PORT_GROUPS_PREFIX "mainOutput" ///< http://lv2plug.in/ns/ext/port-groups#mainOutput +#define LV2_PORT_GROUPS__rearCenter LV2_PORT_GROUPS_PREFIX "rearCenter" ///< http://lv2plug.in/ns/ext/port-groups#rearCenter +#define LV2_PORT_GROUPS__rearLeft LV2_PORT_GROUPS_PREFIX "rearLeft" ///< http://lv2plug.in/ns/ext/port-groups#rearLeft +#define LV2_PORT_GROUPS__rearRight LV2_PORT_GROUPS_PREFIX "rearRight" ///< http://lv2plug.in/ns/ext/port-groups#rearRight +#define LV2_PORT_GROUPS__right LV2_PORT_GROUPS_PREFIX "right" ///< http://lv2plug.in/ns/ext/port-groups#right +#define LV2_PORT_GROUPS__side LV2_PORT_GROUPS_PREFIX "side" ///< http://lv2plug.in/ns/ext/port-groups#side +#define LV2_PORT_GROUPS__sideChainOf LV2_PORT_GROUPS_PREFIX "sideChainOf" ///< http://lv2plug.in/ns/ext/port-groups#sideChainOf +#define LV2_PORT_GROUPS__sideLeft LV2_PORT_GROUPS_PREFIX "sideLeft" ///< http://lv2plug.in/ns/ext/port-groups#sideLeft +#define LV2_PORT_GROUPS__sideRight LV2_PORT_GROUPS_PREFIX "sideRight" ///< http://lv2plug.in/ns/ext/port-groups#sideRight +#define LV2_PORT_GROUPS__source LV2_PORT_GROUPS_PREFIX "source" ///< http://lv2plug.in/ns/ext/port-groups#source +#define LV2_PORT_GROUPS__subGroupOf LV2_PORT_GROUPS_PREFIX "subGroupOf" ///< http://lv2plug.in/ns/ext/port-groups#subGroupOf + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_PORT_GROUPS_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.meta.ttl new file mode 100644 index 00000000..67408ec2 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.meta.ttl @@ -0,0 +1,144 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix pg: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Port Groups" ; + doap:shortdesc "Multi-channel groups of LV2 ports." ; + doap:created "2008-00-00" ; + doap:developer , + ; + doap:release [ + doap:revision "1.4" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Replace broken links with detailed Ambisonic channel descriptions." + ] , [ + rdfs:label "Remove incorrect type of pg:letterCode." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] . + +pg:Group + lv2:documentation """ + +A group logically combines ports which should be considered part of the same +stream. For example, two audio ports in a group may form a stereo stream. + +Like ports, groups have a lv2:symbol that is unique within the context of the +plugin, where group symbols and port symbols reside in the same namespace. In +other words, a group on a plugin MUST NOT have the same symbol as any other +group or port on that plugin. This makes it possible to uniquely reference a +port or group on a plugin with a single identifier and no context. + +Group definitions may be shared across plugins for brevity. For example, a +plugin collection may define a single URI for a pg:StereoGroup with the symbol +"input" and use it in many plugins. + +"""^^lv2:Markdown . + +pg:sideChainOf + lv2:documentation """ + +Indicates that this port or group should be considered a "side chain" of some +other port or group. The precise definition of "side chain" depends on the +plugin, but in general this group should be considered a modifier to some other +group, rather than an independent input itself. + +"""^^lv2:Markdown . + +pg:subGroupOf + lv2:documentation """ + +Indicates that this group is a child of another group. This property has no +meaning with respect to plugin execution, but the host may find this +information useful to provide a better user interface. Note that being a +sub-group does not relax the restriction that the group MUST have a unique +symbol with respect to the plugin. + +"""^^lv2:Markdown . + +pg:source + lv2:documentation """ + +Indicates that this port or group should be considered the "result" of some +other port or group. This property only makes sense on groups with outputs +when the source is a group with inputs. This can be used to convey a +relationship between corresponding input and output groups with different +types, for example in a mono to stereo plugin. + +"""^^lv2:Markdown . + +pg:mainInput + lv2:documentation """ + +Indicates that this group should be considered the "main" input, i.e. the +primary task is processing the signal in this group. A plugin MUST NOT have +more than one pg:mainInput property. + +"""^^lv2:Markdown . + +pg:mainOutput + lv2:documentation """ + +Indicates that this group should be considered the "main" output. The main +output group SHOULD have the main input group as a pg:source. + +"""^^lv2:Markdown . + +pg:group + lv2:documentation """ + +Indicates that this port is a part of a group of ports on the plugin. The port +should also have an lv2:designation property to define its designation within +that group. + +"""^^lv2:Markdown . + +pg:DiscreteGroup + lv2:documentation """ + +These groups are divided into channels where each represents a particular +speaker location. The position of sound in one of these groups depends on a +particular speaker configuration. + +"""^^lv2:Markdown . + +pg:AmbisonicGroup + lv2:documentation """ + +These groups are divided into channels which together represent a position in +an abstract n-dimensional space. The position of sound in one of these groups +does not depend on a particular speaker configuration; a decoder can be used to +convert an ambisonic stream for any speaker configuration. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.ttl new file mode 100644 index 00000000..d248f28b --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-groups/port-groups.ttl @@ -0,0 +1,807 @@ +@prefix lv2: . +@prefix owl: . +@prefix pg: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Port Groups" ; + rdfs:comment "Multi-channel groups of LV2 ports." ; + rdfs:seeAlso . + +pg:Group + a rdfs:Class ; + rdfs:label "Port Group" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:symbol ; + owl:cardinality 1 ; + rdfs:comment "A Group MUST have exactly one string lv2:symbol." + ] ; + rdfs:comment "A set of ports that are logicaly grouped together." . + +pg:InputGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Input Group" ; + rdfs:comment "A group which contains exclusively inputs." . + +pg:OutputGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Output Group" ; + rdfs:comment "A group which contains exclusively outputs." . + +pg:Element + a rdfs:Class ; + rdfs:label "Element" ; + rdfs:comment "An ordered element of a group." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:designation ; + owl:cardinality 1 ; + rdfs:comment "An element MUST have exactly one lv2:designation." + ] ; + rdfs:comment "An element of a group, with a designation and optional index." . + +pg:element + a rdf:Property , + owl:ObjectProperty ; + rdfs:range pg:Element ; + rdfs:label "element" ; + rdfs:comment "An element within a port group." . + +pg:sideChainOf + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "side-chain of" ; + rdfs:comment "Port or group is a side chain of another." . + +pg:subGroupOf + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain pg:Group ; + rdfs:range pg:Group ; + rdfs:label "sub-group of" ; + rdfs:comment "Group is a child of another group." . + +pg:source + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain pg:OutputGroup ; + rdfs:range pg:InputGroup ; + rdfs:label "source" ; + rdfs:comment "Port or group that this group is the output of." . + +pg:mainInput + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Plugin ; + rdfs:range pg:InputGroup ; + rdfs:label "main input" ; + rdfs:comment "Input group that is the primary input of the plugin." . + +pg:mainOutput + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Plugin ; + rdfs:range pg:OutputGroup ; + rdfs:label "main output" ; + rdfs:comment "Output group that is the primary output of the plugin." . + +pg:group + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Port ; + rdfs:range pg:Group ; + rdfs:label "group" ; + rdfs:comment "Group that this port is a part of." . + +pg:DiscreteGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Discrete Group" ; + rdfs:comment "A group of discrete channels." . + +pg:left + a lv2:Channel ; + rdfs:label "left" ; + rdfs:comment "The left channel of a stereo audio group." . + +pg:right + a lv2:Channel ; + rdfs:label "right" ; + rdfs:comment "The right channel of a stereo audio group." . + +pg:center + a lv2:Channel ; + rdfs:label "center" ; + rdfs:comment "The center channel of a discrete audio group." . + +pg:side + a lv2:Channel ; + rdfs:label "side" ; + rdfs:comment "The side channel of a mid-side audio group." . + +pg:centerLeft + a lv2:Channel ; + rdfs:label "center left" ; + rdfs:comment "The center-left channel of a 7.1 wide surround sound group." . + +pg:centerRight + a lv2:Channel ; + rdfs:label "center right" ; + rdfs:comment "The center-right channel of a 7.1 wide surround sound group." . + +pg:sideLeft + a lv2:Channel ; + rdfs:label "side left" ; + rdfs:comment "The side-left channel of a 6.1 or 7.1 surround sound group." . + +pg:sideRight + a lv2:Channel ; + rdfs:label "side right" ; + rdfs:comment "The side-right channel of a 6.1 or 7.1 surround sound group." . + +pg:rearLeft + a lv2:Channel ; + rdfs:label "rear left" ; + rdfs:comment "The rear-left channel of a surround sound group." . + +pg:rearRight + a lv2:Channel ; + rdfs:label "rear right" ; + rdfs:comment "The rear-right channel of a surround sound group." . + +pg:rearCenter + a lv2:Channel ; + rdfs:label "rear center" ; + rdfs:comment "The rear-center channel of a surround sound group." . + +pg:lowFrequencyEffects + a lv2:Channel ; + rdfs:label "low-frequency effects" ; + rdfs:comment "The LFE channel of a *.1 surround sound group." . + +pg:MonoGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Mono" ; + rdfs:comment "A single channel audio group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:center + ] . + +pg:StereoGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Stereo" ; + rdfs:comment "A 2-channel discrete stereo audio group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:right + ] . + +pg:MidSideGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Mid-Side Stereo" ; + rdfs:comment "A 2-channel mid-side stereo audio group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:center + ] , [ + lv2:index 1 ; + lv2:designation pg:side + ] . + +pg:ThreePointZeroGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "3.0 Surround" ; + rdfs:comment "A 3.0 discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:right + ] , [ + lv2:index 2 ; + lv2:designation pg:rearCenter + ] . + +pg:FourPointZeroGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "4.0 Surround" ; + rdfs:comment "A 4.0 (Quadraphonic) discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:rearCenter + ] . + +pg:FivePointZeroGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "5.0 Surround" ; + rdfs:comment "A 5.0 (3-2 stereo) discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:rearRight + ] . + +pg:FivePointOneGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "5.1 Surround" ; + rdfs:comment "A 5.1 (3-2 stereo with sub) discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:rearRight + ] , [ + lv2:index 5 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:SixPointOneGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "6.1 Surround" ; + rdfs:comment "A 6.1 discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:sideLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:sideRight + ] , [ + lv2:index 5 ; + lv2:designation pg:rearCenter + ] , [ + lv2:index 6 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:SevenPointOneGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "7.1 Surround" ; + rdfs:comment "A 7.1 discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:sideLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:sideRight + ] , [ + lv2:index 5 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 6 ; + lv2:designation pg:rearRight + ] , [ + lv2:index 7 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:SevenPointOneWideGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "7.1 Surround (Wide)" ; + rdfs:comment "A 7.1 wide discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:centerLeft + ] , [ + lv2:index 2 ; + lv2:designation pg:center + ] , [ + lv2:index 3 ; + lv2:designation pg:centerRight + ] , [ + lv2:index 4 ; + lv2:designation pg:right + ] , [ + lv2:index 5 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 6 ; + lv2:designation pg:rearRight + ] , [ + lv2:index 7 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:letterCode + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Channel ; + rdfs:range rdf:PlainLiteral ; + rdfs:label "ambisonic letter code" ; + rdfs:comment "The YuMa letter code for an Ambisonic channel." . + +pg:harmonicDegree + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Channel ; + rdfs:range xsd:integer ; + rdfs:label "harmonic degree" ; + rdfs:comment "The degree coefficient (l) of the spherical harmonic for an Ambisonic channel." . + +pg:harmonicIndex + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Channel ; + rdfs:range xsd:integer ; + rdfs:label "harmonic index" ; + rdfs:comment "The index coefficient (m) of the spherical harmonic for an Ambisonic channel." . + +pg:ACN0 + a lv2:Channel ; + pg:letterCode "W" ; + pg:harmonicDegree 0 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN0" ; + rdfs:comment "Ambisonic channel 0 (W): degree 0, index 0." . + +pg:ACN1 + a lv2:Channel ; + pg:letterCode "Y" ; + pg:harmonicDegree 1 ; + pg:harmonicIndex -1 ; + rdfs:label "ACN1" ; + rdfs:comment "Ambisonic channel 1 (Y): degree 1, index -1." . + +pg:ACN2 + a lv2:Channel ; + pg:letterCode "Z" ; + pg:harmonicDegree 1 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN2" ; + rdfs:comment "Ambisonic channel 2 (Z): degree 1, index 0." . + +pg:ACN3 + a lv2:Channel ; + pg:letterCode "X" ; + pg:harmonicDegree 1 ; + pg:harmonicIndex 1 ; + rdfs:label "ACN3" ; + rdfs:comment "Ambisonic channel 3 (X): degree 1, index 1." . + +pg:ACN4 + a lv2:Channel ; + pg:letterCode "V" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex -2 ; + rdfs:label "ACN4" ; + rdfs:comment "Ambisonic channel 4 (V): degree 2, index -2." . + +pg:ACN5 + a lv2:Channel ; + pg:letterCode "T" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex -1 ; + rdfs:label "ACN5" ; + rdfs:comment "Ambisonic channel 5 (T): degree 2, index -1." . + +pg:ACN6 + a lv2:Channel ; + pg:letterCode "R" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN6" ; + rdfs:comment "Ambisonic channel 6 (R): degree 2, index 0." . + +pg:ACN7 + a lv2:Channel ; + pg:letterCode "S" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex 1 ; + rdfs:label "ACN7" ; + rdfs:comment "Ambisonic channel 7 (S): degree 2, index 1." . + +pg:ACN8 + a lv2:Channel ; + pg:letterCode "U" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex 2 ; + rdfs:label "ACN8" ; + rdfs:comment "Ambisonic channel 8 (U): degree 2, index 2." . + +pg:ACN9 + a lv2:Channel ; + pg:letterCode "Q" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex -3 ; + rdfs:label "ACN9" ; + rdfs:comment "Ambisonic channel 9 (Q): degree 3, index -3." . + +pg:ACN10 + a lv2:Channel ; + pg:letterCode "O" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex -2 ; + rdfs:label "ACN10" ; + rdfs:comment "Ambisonic channel 10 (O): degree 3, index -2." . + +pg:ACN11 + a lv2:Channel ; + pg:letterCode "M" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex -1 ; + rdfs:label "ACN11" ; + rdfs:comment "Ambisonic channel 11 (M): degree 3, index -1." . + +pg:ACN12 + a lv2:Channel ; + pg:letterCode "K" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN12" ; + rdfs:comment "Ambisonic channel 12 (K): degree 3, index 0." . + +pg:ACN13 + a lv2:Channel ; + pg:letterCode "L" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 1 ; + rdfs:label "ACN13" ; + rdfs:comment "Ambisonic channel 13 (L): degree 3, index 1." . + +pg:ACN14 + a lv2:Channel ; + pg:letterCode "N" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 2 ; + rdfs:label "ACN14" ; + rdfs:comment "Ambisonic channel 14 (N): degree 3, index 2." . + +pg:ACN15 + a lv2:Channel ; + pg:letterCode "P" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 3 ; + rdfs:label "ACN15" ; + rdfs:comment "Ambisonic channel 15 (P): degree 3, index 3." . + +pg:AmbisonicGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Ambisonic Group" ; + rdfs:comment "A group of Ambisonic channels." . + +pg:AmbisonicBH1P0Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH1P0" ; + rdfs:comment "Ambisonic B stream of horizontal order 1 and peripheral order 0." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN3 + ] . + +pg:AmbisonicBH1P1Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH1P1" ; + rdfs:comment "Ambisonic B stream of horizontal order 1 and peripheral order 1." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] . + +pg:AmbisonicBH2P0Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH2P0" ; + rdfs:comment "Ambisonic B stream of horizontal order 2 and peripheral order 0." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN8 + ] . + +pg:AmbisonicBH2P1Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH2P1" ; + rdfs:comment "Ambisonic B stream of horizontal order 2 and peripheral order 1." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN8 + ] . + +pg:AmbisonicBH2P2Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH2P2" ; + rdfs:comment "Ambisonic B stream of horizontal order 2 and peripheral order 2." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN5 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN6 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN7 + ] , [ + lv2:index 8 ; + lv2:designation pg:ACN8 + ] . + +pg:AmbisonicBH3P0Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P0" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 0." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN15 + ] . + +pg:AmbisonicBH3P1Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P1" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 1." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN15 + ] . + +pg:AmbisonicBH3P2Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P2" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 2." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN5 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN6 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN7 + ] , [ + lv2:index 8 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 9 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 10 ; + lv2:designation pg:ACN15 + ] . + +pg:AmbisonicBH3P3Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P3" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 3." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN5 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN6 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN7 + ] , [ + lv2:index 8 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 9 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 10 ; + lv2:designation pg:ACN10 + ] , [ + lv2:index 11 ; + lv2:designation pg:ACN11 + ] , [ + lv2:index 12 ; + lv2:designation pg:ACN12 + ] , [ + lv2:index 13 ; + lv2:designation pg:ACN13 + ] , [ + lv2:index 14 ; + lv2:designation pg:ACN14 + ] , [ + lv2:index 15 ; + lv2:designation pg:ACN15 + ] . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/manifest.ttl new file mode 100644 index 00000000..45f598d7 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 2 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h new file mode 100644 index 00000000..ff4adcd8 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.h @@ -0,0 +1,53 @@ +/* + Copyright 2012-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_PORT_PROPS_H +#define LV2_PORT_PROPS_H + +/** + @defgroup port-props Port Properties + @ingroup lv2 + + Various port properties. + + @{ +*/ + +// clang-format off + +#define LV2_PORT_PROPS_URI "http://lv2plug.in/ns/ext/port-props" ///< http://lv2plug.in/ns/ext/port-props +#define LV2_PORT_PROPS_PREFIX LV2_PORT_PROPS_URI "#" ///< http://lv2plug.in/ns/ext/port-props# + +#define LV2_PORT_PROPS__causesArtifacts LV2_PORT_PROPS_PREFIX "causesArtifacts" ///< http://lv2plug.in/ns/ext/port-props#causesArtifacts +#define LV2_PORT_PROPS__continuousCV LV2_PORT_PROPS_PREFIX "continuousCV" ///< http://lv2plug.in/ns/ext/port-props#continuousCV +#define LV2_PORT_PROPS__discreteCV LV2_PORT_PROPS_PREFIX "discreteCV" ///< http://lv2plug.in/ns/ext/port-props#discreteCV +#define LV2_PORT_PROPS__displayPriority LV2_PORT_PROPS_PREFIX "displayPriority" ///< http://lv2plug.in/ns/ext/port-props#displayPriority +#define LV2_PORT_PROPS__expensive LV2_PORT_PROPS_PREFIX "expensive" ///< http://lv2plug.in/ns/ext/port-props#expensive +#define LV2_PORT_PROPS__hasStrictBounds LV2_PORT_PROPS_PREFIX "hasStrictBounds" ///< http://lv2plug.in/ns/ext/port-props#hasStrictBounds +#define LV2_PORT_PROPS__logarithmic LV2_PORT_PROPS_PREFIX "logarithmic" ///< http://lv2plug.in/ns/ext/port-props#logarithmic +#define LV2_PORT_PROPS__notAutomatic LV2_PORT_PROPS_PREFIX "notAutomatic" ///< http://lv2plug.in/ns/ext/port-props#notAutomatic +#define LV2_PORT_PROPS__notOnGUI LV2_PORT_PROPS_PREFIX "notOnGUI" ///< http://lv2plug.in/ns/ext/port-props#notOnGUI +#define LV2_PORT_PROPS__rangeSteps LV2_PORT_PROPS_PREFIX "rangeSteps" ///< http://lv2plug.in/ns/ext/port-props#rangeSteps +#define LV2_PORT_PROPS__supportsStrictBounds LV2_PORT_PROPS_PREFIX "supportsStrictBounds" ///< http://lv2plug.in/ns/ext/port-props#supportsStrictBounds +#define LV2_PORT_PROPS__trigger LV2_PORT_PROPS_PREFIX "trigger" ///< http://lv2plug.in/ns/ext/port-props#trigger + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_PORT_PROPS_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.meta.ttl new file mode 100644 index 00000000..7077e4b5 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.meta.ttl @@ -0,0 +1,202 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix pprops: . +@prefix rdf: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Port Properties" ; + doap:created "2009-01-01" ; + doap:shortdesc "Various properties for LV2 plugin ports." ; + doap:maintainer ; + doap:developer ; + doap:release [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This vocabulary defines various properties for plugin ports, which can be used +to better describe how a plugin can be controlled. Using this metadata, hosts +can build better UIs for plugins, and provide more advanced automatic +functionality. + +"""^^lv2:Markdown . + +pprops:trigger + lv2:documentation """ + +Indicates that the data item corresponds to a momentary event that has been +detected (control output ports) or is to be triggered (control input ports). +For input ports, the port needs to be reset to lv2:default value after run() +function of the plugin has returned. If the control port is assigned a GUI +widget by the host, the widget should be of auto-off (momentary, one-shot) type +- for example, a push button if the port is also declared as lv2:toggled, or a +series of push button or auto-clear input box with a "Send" button if the port +is also lv2:integer. + +"""^^lv2:Markdown . + +pprops:supportsStrictBounds + lv2:documentation """ + +Indicates use of host support for pprops:hasStrictBounds port property. A +plugin that specifies it as optional feature can omit value clamping for +hasStrictBounds ports, if the feature is supported by the host. When specified +as required feature, it indicates that the plugin does not do any clamping for +input ports that have a pprops:hasStrictBounds property. + +"""^^lv2:Markdown . + +pprops:hasStrictBounds + lv2:documentation """ + +For hosts that support pprops:supportsStrictBounds, this indicates that the +value of the port should never exceed the port's minimum and maximum control +points. For input ports, it moves the responsibility for limiting the range of +values to host, if it supports pprops:supportsStrictBounds. For output ports, +it indicates that values within specified range are to be expected, and +breaking that should be considered by the host as error in plugin +implementation. + +"""^^lv2:Markdown . + +pprops:expensive + lv2:documentation """ + +Input ports only. Indicates that any changes to the port value may trigger +expensive background calculation (for example, regeneration of lookup tables in +a background thread). Any value changes may have not have immediate effect, or +may cause silence or diminished-quality version of the output until background +processing is finished. Ports having this property are typically not well +suited for connection to outputs of other plugins, and should not be offered as +connection targets or for automation by default. + +"""^^lv2:Markdown . + +pprops:causesArtifacts + lv2:documentation """ + +Input ports only. Indicates that any changes to the port value may produce +slight artifacts to produced audio signals (zipper noise and other results of +signal discontinuities). Connecting ports of this type to continuous signals +is not recommended, and when presenting a list of automation targets, those +ports may be marked as artifact-producing. + +"""^^lv2:Markdown . + +pprops:continuousCV + lv2:documentation """ + +Indicates that the port carries a "smooth" modulation signal. Control input +ports of this type are well-suited for being connected to sources of smooth +signals (knobs with smoothing, modulation rate oscillators, output ports with +continuousCV type, etc.). Typically, the plugin with ports which have this +property will implement appropriate smoothing to avoid audio artifacts. For +output ports, this property suggests the value of the port is likely to change +frequently, and describes a smooth signal (so successive values may be +considered points along a curve). + +"""^^lv2:Markdown . + +pprops:discreteCV + lv2:documentation """ + +Indicates that the port carries a "discrete" modulation signal. Input ports of +this type are well-suited for being connected to sources of discrete signals +(switches, buttons, classifiers, event detectors, etc.). May be combined with +pprops:trigger property. For output ports, this property suggests the value of +the port describe discrete values that should be interpreted as steps (and not +points along a curve). + +"""^^lv2:Markdown . + +pprops:logarithmic + lv2:documentation """ + +Indicates that port value behaviour within specified range (bounds) is a value +using logarithmic scale. The lower and upper bounds must be specified, and +must be of the same sign. + +"""^^lv2:Markdown . + +pprops:notAutomatic + lv2:documentation """ + +Indicates that the port is not primarily intended to be fed with modulation +signals from external sources (other plugins, etc.). It is merely a UI hint +and hosts may allow the user to override it. + +"""^^lv2:Markdown . + +pprops:notOnGUI + lv2:documentation """ + +Indicates that the port is not primarily intended to be represented by a +separate control in the user interface window (or any similar mechanism used +for direct, immediate control of control ports). It is merely a UI hint and +hosts may allow the user to override it. + +"""^^lv2:Markdown . + +pprops:displayPriority + lv2:documentation """ + +Indicates how important a port is to controlling the plugin. If a host can +only display some ports of a plugin, it should prefer ports with a higher +display priority. Priorities do not need to be unique, and are only meaningful +when compared to each other. + +"""^^lv2:Markdown . + +pprops:rangeSteps + lv2:documentation """ + +This value indicates into how many evenly-divided points the (control) port +range should be divided for step-wise control. This may be used for changing +the value with step-based controllers like arrow keys, mouse wheel, rotary +encoders, and so on. + +Note that when used with a pprops:logarithmic port, the steps are logarithmic +too, and port value can be calculated as: + + :::c + value = lower * pow(upper / lower, step / (steps - 1)) + +and the step from value is: + + :::c + step = (steps - 1) * log(value / lower) / log(upper / lower) + +where: + + * `value` is the port value. + + * `step` is the step number (0..steps). + + * `steps` is the number of steps (= value of :rangeSteps property). + + * `lower` and upper are the bounds. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.ttl new file mode 100644 index 00000000..1ddeed07 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/port-props/port-props.ttl @@ -0,0 +1,79 @@ +@prefix lv2: . +@prefix owl: . +@prefix pprops: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Port Properties" ; + rdfs:comment "Various properties for LV2 plugin ports." ; + rdfs:seeAlso . + +pprops:trigger + a lv2:PortProperty ; + rdfs:label "trigger" ; + rdfs:comment "Port is a momentary trigger." . + +pprops:supportsStrictBounds + a lv2:Feature ; + rdfs:label "supports strict bounds" ; + rdfs:comment "A feature indicating plugin support for strict port bounds." . + +pprops:hasStrictBounds + a lv2:PortProperty ; + rdfs:label "has strict bounds" ; + rdfs:comment "Port has strict bounds which are not internally clamped." . + +pprops:expensive + a lv2:PortProperty ; + rdfs:label "changes are expensive" ; + rdfs:comment "Input port is expensive to change." . + +pprops:causesArtifacts + a lv2:PortProperty ; + rdfs:label "changes cause artifacts" ; + rdfs:comment "Input port causes audible artifacts when changed." . + +pprops:continuousCV + a lv2:PortProperty ; + rdfs:label "smooth modulation signal" ; + rdfs:comment "Port carries a smooth modulation signal." . + +pprops:discreteCV + a lv2:PortProperty ; + rdfs:label "discrete modulation signal" ; + rdfs:comment "Port carries a discrete modulation signal." . + +pprops:logarithmic + a lv2:PortProperty ; + rdfs:label "logarithmic" ; + rdfs:comment "Port value is logarithmic." . + +pprops:notAutomatic + a lv2:PortProperty ; + rdfs:label "not automatic" ; + rdfs:comment "Port that is not intended to be fed with a modulation signal." . + +pprops:notOnGUI + a lv2:PortProperty ; + rdfs:label "not on GUI" ; + rdfs:comment "Port that should not be displayed on a GUI." . + +pprops:displayPriority + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "display priority" ; + rdfs:comment "A priority ranking this port in importance to its plugin." . + +pprops:rangeSteps + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "range steps" ; + rdfs:comment "The number of even steps the range should be divided into." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/manifest.ttl new file mode 100644 index 00000000..b9cacf57 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 8 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h new file mode 100644 index 00000000..716ab327 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.h @@ -0,0 +1,48 @@ +/* + Copyright 2012-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_PRESETS_H +#define LV2_PRESETS_H + +/** + @defgroup presets Presets + @ingroup lv2 + + Presets for plugins. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_PRESETS_URI "http://lv2plug.in/ns/ext/presets" ///< http://lv2plug.in/ns/ext/presets +#define LV2_PRESETS_PREFIX LV2_PRESETS_URI "#" ///< http://lv2plug.in/ns/ext/presets# + +#define LV2_PRESETS__Bank LV2_PRESETS_PREFIX "Bank" ///< http://lv2plug.in/ns/ext/presets#Bank +#define LV2_PRESETS__Preset LV2_PRESETS_PREFIX "Preset" ///< http://lv2plug.in/ns/ext/presets#Preset +#define LV2_PRESETS__bank LV2_PRESETS_PREFIX "bank" ///< http://lv2plug.in/ns/ext/presets#bank +#define LV2_PRESETS__preset LV2_PRESETS_PREFIX "preset" ///< http://lv2plug.in/ns/ext/presets#preset +#define LV2_PRESETS__value LV2_PRESETS_PREFIX "value" ///< http://lv2plug.in/ns/ext/presets#value + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_PRESETS_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.meta.ttl new file mode 100644 index 00000000..8ff25c15 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.meta.ttl @@ -0,0 +1,132 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix pset: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Presets" ; + doap:shortdesc "Presets for LV2 plugins." ; + doap:created "2009-00-00" ; + doap:developer ; + doap:release [ + doap:revision "2.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add preset banks." + ] + ] + ] , [ + doap:revision "2.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add pset:preset property for describing the preset currently applied to a plugin instance." + ] , [ + rdfs:label "Remove pset:appliesTo property, use lv2:appliesTo instead." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This is a vocabulary for LV2 plugin presets, that is, named sets of control +values and possibly other state. The structure of a pset:Preset is +deliberately identical to that of an lv2:Plugin, and can be thought of as a +plugin template or overlay. + +Presets may be defined in any bundle, including the plugin's bundle, separate +third party preset bundles, or user preset bundles saved by hosts. Since +preset data tends to be large, it is recommended that plugins describe presets +in a separate file(s) to avoid slowing down hosts. The `manifest.ttl` of a +bundle containing presets should list them like so: + + :::turtle + eg:mypreset + a pset:Preset ; + lv2:appliesTo eg:myplugin ; + rdfs:seeAlso . + +"""^^lv2:Markdown . + +pset:Preset + lv2:documentation """ + +The structure of a Preset deliberately mirrors that of a plugin, so existing +predicates can be used to describe any data associated with the preset. For +example: + + :::turtle + @prefix eg: . + + eg:mypreset + a pset:Preset ; + rdfs:label "One louder" ; + lv2:appliesTo eg:myplugin ; + lv2:port [ + lv2:symbol "volume1" ; + pset:value 11.0 + ] , [ + lv2:symbol "volume2" ; + pset:value 11.0 + ] . + +A Preset SHOULD have at least one lv2:appliesTo property. Each Port on a +Preset MUST have at least a lv2:symbol property and a pset:value property. + +Hosts SHOULD save user presets to a bundle in the user-local LV2 directory (for +example `~/.lv2`) with a name like `_.preset.lv2` +(for example `LV2_Amp_At_Eleven.preset.lv2`), where names are transformed to be +valid LV2 symbols for maximum compatibility. + +"""^^lv2:Markdown . + +pset:value + lv2:documentation """ + +This property is used in a similar way to lv2:default. + +"""^^lv2:Markdown . + +pset:preset + lv2:documentation """ + +Specifies the preset currently applied to a plugin instance. This property may +be useful for saving state, or notifying a plugin instance at run-time about a +preset change. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.ttl new file mode 100644 index 00000000..c1caf43c --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/presets/presets.ttl @@ -0,0 +1,60 @@ +@prefix lv2: . +@prefix owl: . +@prefix pset: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Presets" ; + rdfs:comment "Presets for LV2 plugins." ; + rdfs:seeAlso . + +pset:Bank + a rdfs:Class ; + rdfs:label "Bank" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty rdfs:label ; + owl:someValuesFrom xsd:string ; + rdfs:comment "A Bank MUST have at least one string rdfs:label." + ] ; + rdfs:comment "A bank of presets." . + +pset:Preset + a rdfs:Class ; + rdfs:subClassOf lv2:PluginBase ; + rdfs:label "Preset" ; + rdfs:comment "A preset for an LV2 plugin." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty rdfs:label ; + owl:someValuesFrom xsd:string ; + rdfs:comment "A Preset MUST have at least one string rdfs:label." + ] . + +pset:bank + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain pset:Preset ; + rdfs:range pset:Bank ; + rdfs:label "bank" ; + rdfs:comment "The bank this preset belongs to." . + +pset:value + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:PortBase ; + rdfs:label "value" ; + rdfs:comment "The value of a port in a preset." . + +pset:preset + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:PluginBase ; + rdfs:range pset:Preset ; + rdfs:label "preset" ; + rdfs:comment "The preset currently applied to a plugin instance." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/manifest.ttl new file mode 100644 index 00000000..9fae8b85 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 0 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h new file mode 100644 index 00000000..a3a11c4d --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.h @@ -0,0 +1,89 @@ +/* + Copyright 2007-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_RESIZE_PORT_H +#define LV2_RESIZE_PORT_H + +/** + @defgroup resize-port Resize Port + @ingroup lv2 + + Dynamically sized LV2 port buffers. + + @{ +*/ + +#include +#include + +// clang-format off + +#define LV2_RESIZE_PORT_URI "http://lv2plug.in/ns/ext/resize-port" ///< http://lv2plug.in/ns/ext/resize-port +#define LV2_RESIZE_PORT_PREFIX LV2_RESIZE_PORT_URI "#" ///< http://lv2plug.in/ns/ext/resize-port# + +#define LV2_RESIZE_PORT__asLargeAs LV2_RESIZE_PORT_PREFIX "asLargeAs" ///< http://lv2plug.in/ns/ext/resize-port#asLargeAs +#define LV2_RESIZE_PORT__minimumSize LV2_RESIZE_PORT_PREFIX "minimumSize" ///< http://lv2plug.in/ns/ext/resize-port#minimumSize +#define LV2_RESIZE_PORT__resize LV2_RESIZE_PORT_PREFIX "resize" ///< http://lv2plug.in/ns/ext/resize-port#resize + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +/** A status code for state functions. */ +typedef enum { + LV2_RESIZE_PORT_SUCCESS = 0, /**< Completed successfully. */ + LV2_RESIZE_PORT_ERR_UNKNOWN = 1, /**< Unknown error. */ + LV2_RESIZE_PORT_ERR_NO_SPACE = 2 /**< Insufficient space. */ +} LV2_Resize_Port_Status; + +/** Opaque data for resize method. */ +typedef void* LV2_Resize_Port_Feature_Data; + +/** Host feature to allow plugins to resize their port buffers. */ +typedef struct { + /** Opaque data for resize method. */ + LV2_Resize_Port_Feature_Data data; + + /** + Resize a port buffer to at least `size` bytes. + + This function MAY return an error, in which case the port buffer was not + resized and the port is still connected to the same location. Plugins + MUST gracefully handle this situation. + + This function is in the audio threading class. + + The host MUST preserve the contents of the port buffer when resizing. + + Plugins MAY resize a port many times in a single run callback. Hosts + SHOULD make this as inexpensive as possible. + */ + LV2_Resize_Port_Status (*resize)(LV2_Resize_Port_Feature_Data data, + uint32_t index, + size_t size); +} LV2_Resize_Port_Resize; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_RESIZE_PORT_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.meta.ttl new file mode 100644 index 00000000..d44620cc --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.meta.ttl @@ -0,0 +1,74 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix rsz: . + + + a doap:Project ; + doap:name "LV2 Resize Port" ; + doap:shortdesc "Dynamically sized LV2 port buffers." ; + doap:created "2007-00-00" ; + doap:developer ; + doap:release [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature, rsz:resize, which allows plugins to +dynamically resize their output port buffers. + +In addition to the dynamic feature, there are properties which describe the +space required for a particular port buffer which can be used statically in +data files. + +"""^^lv2:Markdown . + +rsz:resize + lv2:documentation """ + +A feature to resize output port buffers in LV2_Plugin_Descriptor::run(). + +To support this feature, the host must pass an LV2_Feature to the plugin's +instantiate method with URI LV2_RESIZE_PORT__resize and a pointer to a +LV2_Resize_Port_Resize structure. This structure provides a resize_port +function which plugins may use to resize output port buffers as necessary. + +"""^^lv2:Markdown . + +rsz:asLargeAs + lv2:documentation """ + +Indicates that a port requires at least as much buffer space as the port with +the given symbol on the same plugin instance. This may be used for any ports, +but is generally most useful to indicate an output port must be at least as +large as some input port (because it will copy from it). If a port is +asLargeAs several ports, it is asLargeAs the largest such port (not the sum of +those ports' sizes). + +The host guarantees that whenever an ObjectPort's run method is called, any +output `O` that is rsz:asLargeAs an input `I` is connected to a buffer large +enough to copy `I`, or `NULL` if the port is lv2:connectionOptional. + +"""^^lv2:Markdown . + +rsz:minimumSize + lv2:documentation """ + +Indicates that a port requires a buffer at least this large, in bytes. Any +host that supports the resize-port feature MUST connect any port with a +minimumSize specified to a buffer at least as large as the value given for this +property. Any host, especially those that do NOT support dynamic port +resizing, SHOULD do so or reduced functionality may result. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.ttl new file mode 100644 index 00000000..29cd18b3 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/resize-port/resize-port.ttl @@ -0,0 +1,36 @@ +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix rsz: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Resize Port" ; + rdfs:comment "Dynamically sized LV2 port buffers." ; + rdfs:seeAlso , + . + +rsz:resize + a lv2:Feature ; + rdfs:label "resize" ; + rdfs:comment "A feature for resizing output port buffers." . + +rsz:asLargeAs + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:range lv2:Symbol ; + rdfs:label "as large as" ; + rdfs:comment "Port that this port must have at least as much buffer space as." . + +rsz:minimumSize + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "minimum size" ; + rdfs:comment "Minimum buffer size required by a port, in bytes." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/manifest.ttl new file mode 100644 index 00000000..02e7aa13 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 8 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h new file mode 100644 index 00000000..70972d84 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.h @@ -0,0 +1,392 @@ +/* + Copyright 2010-2016 David Robillard + Copyright 2010 Leonard Ritter + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_STATE_H +#define LV2_STATE_H + +/** + @defgroup state State + @ingroup lv2 + + An interface for LV2 plugins to save and restore state. + + See for details. + + @{ +*/ + +#include "lv2/core/lv2.h" + +#include +#include + +// clang-format off + +#define LV2_STATE_URI "http://lv2plug.in/ns/ext/state" ///< http://lv2plug.in/ns/ext/state +#define LV2_STATE_PREFIX LV2_STATE_URI "#" ///< http://lv2plug.in/ns/ext/state# + +#define LV2_STATE__State LV2_STATE_PREFIX "State" ///< http://lv2plug.in/ns/ext/state#State +#define LV2_STATE__interface LV2_STATE_PREFIX "interface" ///< http://lv2plug.in/ns/ext/state#interface +#define LV2_STATE__loadDefaultState LV2_STATE_PREFIX "loadDefaultState" ///< http://lv2plug.in/ns/ext/state#loadDefaultState +#define LV2_STATE__freePath LV2_STATE_PREFIX "freePath" ///< http://lv2plug.in/ns/ext/state#freePath +#define LV2_STATE__makePath LV2_STATE_PREFIX "makePath" ///< http://lv2plug.in/ns/ext/state#makePath +#define LV2_STATE__mapPath LV2_STATE_PREFIX "mapPath" ///< http://lv2plug.in/ns/ext/state#mapPath +#define LV2_STATE__state LV2_STATE_PREFIX "state" ///< http://lv2plug.in/ns/ext/state#state +#define LV2_STATE__threadSafeRestore LV2_STATE_PREFIX "threadSafeRestore" ///< http://lv2plug.in/ns/ext/state#threadSafeRestore +#define LV2_STATE__StateChanged LV2_STATE_PREFIX "StateChanged" ///< http://lv2plug.in/ns/ext/state#StateChanged + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void* LV2_State_Handle; ///< Opaque handle for state save/restore +typedef void* + LV2_State_Free_Path_Handle; ///< Opaque handle for state:freePath feature +typedef void* + LV2_State_Map_Path_Handle; ///< Opaque handle for state:mapPath feature +typedef void* + LV2_State_Make_Path_Handle; ///< Opaque handle for state:makePath feature + +/** + Flags describing value characteristics. + + These flags are used along with the value's type URI to determine how to + (de-)serialise the value data, or whether it is even possible to do so. +*/ +typedef enum { + /** + Plain Old Data. + + Values with this flag contain no pointers or references to other areas + of memory. It is safe to copy POD values with a simple memcpy and store + them for the duration of the process. A POD value is not necessarily + safe to trasmit between processes or machines (for example, filenames + are POD), see LV2_STATE_IS_PORTABLE for details. + + Implementations MUST NOT attempt to copy or serialise a non-POD value if + they do not understand its type (and thus know how to correctly do so). + */ + LV2_STATE_IS_POD = 1, + + /** + Portable (architecture independent) data. + + Values with this flag are in a format that is usable on any + architecture. A portable value saved on one machine can be restored on + another machine regardless of architecture. The format of portable + values MUST NOT depend on architecture-specific properties like + endianness or alignment. Portable values MUST NOT contain filenames. + */ + LV2_STATE_IS_PORTABLE = 1 << 1, + + /** + Native data. + + This flag is used by the host to indicate that the saved data is only + going to be used locally in the currently running process (for things + like instance duplication or snapshots), so the plugin should use the + most efficient representation possible and not worry about serialisation + and portability. + */ + LV2_STATE_IS_NATIVE = 1 << 2 +} LV2_State_Flags; + +/** A status code for state functions. */ +typedef enum { + LV2_STATE_SUCCESS = 0, /**< Completed successfully. */ + LV2_STATE_ERR_UNKNOWN = 1, /**< Unknown error. */ + LV2_STATE_ERR_BAD_TYPE = 2, /**< Failed due to unsupported type. */ + LV2_STATE_ERR_BAD_FLAGS = 3, /**< Failed due to unsupported flags. */ + LV2_STATE_ERR_NO_FEATURE = 4, /**< Failed due to missing features. */ + LV2_STATE_ERR_NO_PROPERTY = 5, /**< Failed due to missing property. */ + LV2_STATE_ERR_NO_SPACE = 6 /**< Failed due to insufficient space. */ +} LV2_State_Status; + +/** + A host-provided function to store a property. + @param handle Must be the handle passed to LV2_State_Interface.save(). + @param key The key to store `value` under (URID). + @param value Pointer to the value to be stored. + @param size The size of `value` in bytes. + @param type The type of `value` (URID). + @param flags LV2_State_Flags for `value`. + @return 0 on success, otherwise a non-zero error code. + + The host passes a callback of this type to LV2_State_Interface.save(). This + callback is called repeatedly by the plugin to store all the properties that + describe its current state. + + DO NOT INVENT NONSENSE URI SCHEMES FOR THE KEY. Best is to use keys from + existing vocabularies. If nothing appropriate is available, use http URIs + that point to somewhere you can host documents so documentation can be made + resolvable (typically a child of the plugin or project URI). If this is not + possible, invent a URN scheme, e.g. urn:myproj:whatever. The plugin MUST + NOT pass an invalid URI key. + + The host MAY fail to store a property for whatever reason, but SHOULD + store any property that is LV2_STATE_IS_POD and LV2_STATE_IS_PORTABLE. + Implementations SHOULD use the types from the LV2 Atom extension + (http://lv2plug.in/ns/ext/atom) wherever possible. The plugin SHOULD + attempt to fall-back and avoid the error if possible. + + Note that `size` MUST be > 0, and `value` MUST point to a valid region of + memory `size` bytes long (this is required to make restore unambiguous). + + The plugin MUST NOT attempt to use this function outside of the + LV2_State_Interface.restore() context. +*/ +typedef LV2_State_Status (*LV2_State_Store_Function)(LV2_State_Handle handle, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags); + +/** + A host-provided function to retrieve a property. + @param handle Must be the handle passed to LV2_State_Interface.restore(). + @param key The key of the property to retrieve (URID). + @param size (Output) If non-NULL, set to the size of the restored value. + @param type (Output) If non-NULL, set to the type of the restored value. + @param flags (Output) If non-NULL, set to the flags for the restored value. + @return A pointer to the restored value (object), or NULL if no value + has been stored under `key`. + + A callback of this type is passed by the host to + LV2_State_Interface.restore(). This callback is called repeatedly by the + plugin to retrieve any properties it requires to restore its state. + + The returned value MUST remain valid until LV2_State_Interface.restore() + returns. The plugin MUST NOT attempt to use this function, or any value + returned from it, outside of the LV2_State_Interface.restore() context. +*/ +typedef const void* (*LV2_State_Retrieve_Function)(LV2_State_Handle handle, + uint32_t key, + size_t* size, + uint32_t* type, + uint32_t* flags); + +/** + LV2 Plugin State Interface. + + When the plugin's extension_data is called with argument + LV2_STATE__interface, the plugin MUST return an LV2_State_Interface + structure, which remains valid for the lifetime of the plugin. + + The host can use the contained function pointers to save and restore the + state of a plugin instance at any time, provided the threading restrictions + of the functions are met. + + Stored data is only guaranteed to be compatible between instances of plugins + with the same URI (i.e. if a change to a plugin would cause a fatal error + when restoring state saved by a previous version of that plugin, the plugin + URI MUST change just as it must when ports change incompatibly). Plugin + authors should consider this possibility, and always store sensible data + with meaningful types to avoid such problems in the future. +*/ +typedef struct { + /** + Save plugin state using a host-provided `store` callback. + + @param instance The instance handle of the plugin. + @param store The host-provided store callback. + @param handle An opaque pointer to host data which MUST be passed as the + handle parameter to `store` if it is called. + @param flags Flags describing desired properties of this save. These + flags may be used to determine the most appropriate values to store. + @param features Extensible parameter for passing any additional + features to be used for this save. + + The plugin is expected to store everything necessary to completely + restore its state later. Plugins SHOULD store simple POD data whenever + possible, and consider the possibility of state being restored much + later on a different machine. + + The `handle` pointer and `store` function MUST NOT be used + beyond the scope of save(). + + This function has its own special threading class: it may not be called + concurrently with any "Instantiation" function, but it may be called + concurrently with functions in any other class, unless the definition of + that class prohibits it (for example, it may not be called concurrently + with a "Discovery" function, but it may be called concurrently with an + "Audio" function. The plugin is responsible for any locking or + lock-free techniques necessary to make this possible. + + Note that in the simple case where state is only modified by restore(), + there are no synchronization issues since save() is never called + concurrently with restore() (though run() may read it during a save). + + Plugins that dynamically modify state while running, however, must take + care to do so in such a way that a concurrent call to save() will save a + consistent representation of plugin state for a single instant in time. + */ + LV2_State_Status (*save)(LV2_Handle instance, + LV2_State_Store_Function store, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature* const* features); + + /** + Restore plugin state using a host-provided `retrieve` callback. + + @param instance The instance handle of the plugin. + @param retrieve The host-provided retrieve callback. + @param handle An opaque pointer to host data which MUST be passed as the + handle parameter to `retrieve` if it is called. + @param flags Currently unused. + @param features Extensible parameter for passing any additional + features to be used for this restore. + + The plugin MAY assume a restored value was set by a previous call to + LV2_State_Interface.save() by a plugin with the same URI. + + The plugin MUST gracefully fall back to a default value when a value can + not be retrieved. This allows the host to reset the plugin state with + an empty map. + + The `handle` pointer and `store` function MUST NOT be used + beyond the scope of restore(). + + This function is in the "Instantiation" threading class as defined by + LV2. This means it MUST NOT be called concurrently with any other + function on the same plugin instance. + */ + LV2_State_Status (*restore)(LV2_Handle instance, + LV2_State_Retrieve_Function retrieve, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature* const* features); +} LV2_State_Interface; + +/** + Feature data for state:mapPath (@ref LV2_STATE__mapPath). +*/ +typedef struct { + /** + Opaque host data. + */ + LV2_State_Map_Path_Handle handle; + + /** + Map an absolute path to an abstract path for use in plugin state. + @param handle MUST be the `handle` member of this struct. + @param absolute_path The absolute path of a file. + @return An abstract path suitable for use in plugin state. + + The plugin MUST use this function to map any paths that will be stored + in plugin state. The returned value is an abstract path which MAY not + be an actual file system path; absolute_path() MUST be used to map + it to an actual path in order to use the file. + + Plugins MUST NOT make any assumptions about abstract paths except that + they can be mapped back to the absolute path of the "same" file (though + not necessarily the same original path) using absolute_path(). + + This function may only be called within the context of + LV2_State_Interface methods. The caller must free the returned value + with LV2_State_Free_Path.free_path(). + */ + char* (*abstract_path)(LV2_State_Map_Path_Handle handle, + const char* absolute_path); + + /** + Map an abstract path from plugin state to an absolute path. + @param handle MUST be the `handle` member of this struct. + @param abstract_path An abstract path (typically from plugin state). + @return An absolute file system path. + + The plugin MUST use this function in order to actually open or otherwise + use any paths loaded from plugin state. + + This function may only be called within the context of + LV2_State_Interface methods. The caller must free the returned value + with LV2_State_Free_Path.free_path(). + */ + char* (*absolute_path)(LV2_State_Map_Path_Handle handle, + const char* abstract_path); +} LV2_State_Map_Path; + +/** + Feature data for state:makePath (@ref LV2_STATE__makePath). +*/ +typedef struct { + /** + Opaque host data. + */ + LV2_State_Make_Path_Handle handle; + + /** + Return a path the plugin may use to create a new file. + @param handle MUST be the `handle` member of this struct. + @param path The path of the new file within a namespace unique to this + plugin instance. + @return The absolute path to use for the new file. + + This function can be used by plugins to create files and directories, + either at state saving time (if this feature is passed to + LV2_State_Interface.save()) or any time (if this feature is passed to + LV2_Descriptor.instantiate()). + + The host MUST do whatever is necessary for the plugin to be able to + create a file at the returned path (for example, using fopen()), + including creating any leading directories. + + If this function is passed to LV2_Descriptor.instantiate(), it may be + called from any non-realtime context. If it is passed to + LV2_State_Interface.save(), it may only be called within the dynamic + scope of that function call. + + The caller must free the returned value with + LV2_State_Free_Path.free_path(). + */ + char* (*path)(LV2_State_Make_Path_Handle handle, const char* path); +} LV2_State_Make_Path; + +/** + Feature data for state:freePath (@ref LV2_STATE__freePath). +*/ +typedef struct { + /** + Opaque host data. + */ + LV2_State_Free_Path_Handle handle; + + /** + Free a path returned by a state feature. + + @param handle MUST be the `handle` member of this struct. + @param path The path previously returned by a state feature. + + This function can be used by plugins to free paths allocated by the host + and returned by state features (LV2_State_Map_Path.abstract_path(), + LV2_State_Map_Path.absolute_path(), and LV2_State_Make_Path.path()). + */ + void (*free_path)(LV2_State_Free_Path_Handle handle, char* path); +} LV2_State_Free_Path; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_STATE_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.meta.ttl new file mode 100644 index 00000000..6f54641d --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.meta.ttl @@ -0,0 +1,467 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix state: . + + + a doap:Project ; + doap:created "2010-11-09" ; + doap:name "LV2 State" ; + doap:shortdesc "An interface for LV2 plugins to save and restore state." ; + doap:license ; + doap:developer , + ; + doap:maintainer ; + doap:release [ + doap:revision "2.8" ; + doap:created "2021-01-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix state:StateChanged URI in metadata and documentation." + ] + ] + ] , [ + doap:revision "2.6" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add state:freePath feature." + ] + ] + ] , [ + doap:revision "2.4" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add state:StateChanged for notification events." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2016-07-31" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add LV2_STATE_ERR_NO_SPACE status flag." + ] , [ + rdfs:label "Add state:threadSafeRestore feature for dropout-free state restoration." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2013-01-16" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add state:loadDefaultState feature so plugins can have their default state loaded without hard-coding default state as a special case." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a simple mechanism that allows hosts to save and restore +a plugin instance's state. The goal is for an instance's state to be +completely described by port values and a simple dictionary. + +The state defined here is conceptually a key:value dictionary, with URI keys +and values of any type. For performance reasons the key and value type are +actually a "URID", a URI mapped to an integer. A single key:value pair is +called a "property". + +This state model is simple yet has many benefits: + + * Both fast and extensible thanks to URID keys. + + * No limitations on possible value types. + + * Easy to serialise in almost any format. + + * Easy to store in a typical "map" or "dictionary" data structure. + + * Elegantly described in Turtle, so state can be described in LV2 data files + (including presets). + + * Does not impose any file formats, data structures, or file system + requirements. + + * Suitable for portable persistent state as well as fast in-memory snapshots. + + * Keys _may_ be well-defined and used meaningfully across several + implementations. + + * State _may_ be dynamic, but plugins are not required to have a dynamic + dictionary data structure available. + +To implement state, the plugin provides a state:interface to the host. To save +or restore, the host calls LV2_State_Interface::save() or +LV2_State_Interface::restore(), passing a callback to be used for handling a +single property. The host is free to implement property storage and retrieval +in any way. + +Since value types are defined by URI, any type is possible. However, a set of +standard types is defined by the [LV2 Atom](atom.html) extension. Use of these +types is recommended. Hosts MUST implement at least +[atom:String](atom.html#String), which is simply a C string. + +### Referring to Files + +Plugins may need to refer to existing files (such as loaded samples) in their +state. This is done by storing the file's path as a property just like any +other value. However, there are some rules which MUST be followed when storing +paths, see state:mapPath for details. Plugins MUST use the type +[atom:Path](atom.html#Path) for all paths in their state. + +Plugins are strongly encouraged to avoid creating files, instead storing all +state as properties. However, occasionally the ability to create files is +necessary. To make this possible, the host can provide the feature +state:makePath which allocates paths for plugin-created files. Plugins MUST +NOT create files in any other locations. + +### Plugin Code Example + + :::c + + /* Namespace for this plugin's keys. This SHOULD be something that could be + published as a document, even if that document does not exist right now. + */ + #define NS_MY "http://example.org/myplugin/schema#" + + #define DEFAULT_GREETING "Hello" + + LV2_Handle + my_instantiate(...) + { + MyPlugin* plugin = ...; + plugin->uris.atom_String = map_uri(LV2_ATOM__String); + plugin->uris.my_greeting = map_uri(NS_MY "greeting"); + plugin->state.greeting = strdup(DEFAULT_GREETING); + return plugin; + } + + LV2_State_Status + my_save(LV2_Handle instance, + LV2_State_Store_Function store, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature *const * features) + { + MyPlugin* plugin = (MyPlugin*)instance; + const char* greeting = plugin->state.greeting; + + store(handle, + plugin->uris.my_greeting, + greeting, + strlen(greeting) + 1, // Careful! Need space for terminator + plugin->uris.atom_String, + LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE); + + return LV2_STATE_SUCCESS; + } + + LV2_State_Status + my_restore(LV2_Handle instance, + LV2_State_Retrieve_Function retrieve, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature *const * features) + { + MyPlugin* plugin = (MyPlugin*)instance; + + size_t size; + uint32_t type; + uint32_t flags; + const char* greeting = retrieve( + handle, plugin->uris.my_greeting, &size, &type, &flags); + + if (greeting) { + free(plugin->state->greeting); + plugin->state->greeting = strdup(greeting); + } else { + plugin->state->greeting = strdup(DEFAULT_GREETING); + } + + return LV2_STATE_SUCCESS; + } + + const void* + my_extension_data(const char* uri) + { + static const LV2_State_Interface state_iface = { my_save, my_restore }; + if (!strcmp(uri, LV2_STATE__interface)) { + return &state_iface; + } + } + +### Host Code Example + + :::c + LV2_State_Status + store_callback(LV2_State_Handle handle, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags) + { + if ((flags & LV2_STATE_IS_POD)) { + // We only care about POD since we're keeping state in memory only. + // Disk or network use would also require LV2_STATE_IS_PORTABLE. + Map* state_map = (Map*)handle; + state_map->insert(key, Value(copy(value), size, type)); + return LV2_STATE_SUCCESS;; + } else { + return LV2_STATE_ERR_BAD_FLAGS; // Non-POD events are unsupported + } + } + + Map + get_plugin_state(LV2_Handle instance) + { + LV2_State* state = instance.extension_data(LV2_STATE__interface); + + // Request a fast/native/POD save, since we're just copying in memory + Map state_map; + state.save(instance, store_callback, &state_map, + LV2_STATE_IS_POD|LV2_STATE_IS_NATIVE); + + return state_map; + } + +### Extensions to this Specification + +It is likely that other interfaces for working with plugin state will be +developed as needed. This is encouraged, however everything SHOULD work within +the state _model_ defined here. That is, **do not complicate the state +model**. Implementations can assume the following: + + * The current port values and state dictionary completely describe a plugin + instance, at least well enough that saving and restoring will yield an + "identical" instance from the user's perspective. + + * Hosts are not expected to save and/or restore any other attributes of a + plugin instance. + +### The "Property Principle" + +The main benefit of this meaningful state model is that it can double as a +plugin control/query mechanism. For plugins that require more advanced control +than simple control ports, instead of defining a set of commands, define +properties whose values can be set appropriately. This provides both a way to +control and save that state "for free", since there is no need to define +commands _and_ a set of properties for storing their effects. In particular, +this is a good way for UIs to achieve more advanced control of plugins. + +This "property principle" is summed up in the phrase: "Don't stop; set playing +to false". + +This extension does not define a dynamic mechanism for state access and +manipulation. The [LV2 Patch](patch.html) extension defines a generic set of +messages which can be used to access or manipulate properties, and the [LV2 +Atom](atom.html) extension defines a port type and data container capable of +transmitting those messages. + +"""^^lv2:Markdown . + +state:interface + lv2:documentation """ + +A structure (LV2_State_Interface) which contains functions to be called by the +host to save and restore state. In order to support this extension, the plugin +must return a valid LV2_State_Interface from LV2_Descriptor::extension_data() +when it is called with URI LV2_STATE__interface. + +The plugin data file should describe this like so: + + :::turtle + @prefix state: . + + + a lv2:Plugin ; + lv2:extensionData state:interface . + +"""^^lv2:Markdown . + +state:State + lv2:documentation """ + +This type should be used wherever instance state is described. The properties +of a resource with this type correspond directly to the properties of the state +dictionary (except the property that states it has this type). + +"""^^lv2:Markdown . + +state:loadDefaultState + lv2:documentation """ + +This feature indicates that the plugin has default state listed with the +state:state property which should be loaded by the host before running the +plugin. Requiring this feature allows plugins to implement a single state +loading mechanism which works for initialisation as well as restoration, +without having to hard-code default state. + +To support this feature, the host MUST restore the default state after +instantiating the plugin but before calling run(). + +"""^^lv2:Markdown . + +state:state + lv2:documentation """ + +This property may be used anywhere a state needs to be described, for example: + + :::turtle + @prefix eg: . + + + state:state [ + eg:somekey "some value" ; + eg:someotherkey "some other value" ; + eg:favourite-number 2 + ] . + +"""^^lv2:Markdown . + +state:mapPath + lv2:documentation """ + +This feature maps absolute paths to/from abstract paths which are stored +in state. To support this feature a host must pass an LV2_Feature with URI +LV2_STATE__mapPath and data pointed to an LV2_State_Map_Path to the plugin's +LV2_State_Interface methods. + +The plugin MUST map _all_ paths stored in its state (including those inside any +files). This is necessary so that hosts can handle file system references +correctly, for example to share common files, or bundle state for distribution +or archival. + +For example, a plugin may write a path to a state file like so: + + :::c + void write_path(LV2_State_Map_Path* map_path, FILE* myfile, const char* path) + { + char* abstract_path = map_path->abstract_path(map_path->handle, path); + fprintf(myfile, "%s", abstract_path); + free(abstract_path); + } + +Then, later reload the path like so: + + :::c + char* read_path(LV2_State_Map_Path* map_path, FILE* myfile) + { + /* Obviously this is not production quality code! */ + char abstract_path[1024]; + fscanf(myfile, "%s", abstract_path); + return map_path->absolute_path(map_path->handle, abstract_path); + } + +"""^^lv2:Markdown . + +state:makePath + lv2:documentation """ + +This feature allows plugins to create new files and/or directories. To support +this feature the host passes an LV2_Feature with URI LV2_STATE__makePath and +data pointed to an LV2_State_Make_Path to the plugin. The host may make this +feature available only during save by passing it to +LV2_State_Interface::save(), or available any time by passing it to +LV2_Descriptor::instantiate(). If passed to LV2_State_Interface::save(), the +feature MUST NOT be used beyond the scope of that call. + +The plugin is guaranteed a hierarchical namespace unique to that plugin +instance, and may expect the returned path to have the requested path as a +suffix. There is one such namespace, even if the feature is passed to both +LV2_Descriptor::instantiate() and LV2_State_Interface::save(). Beyond this, +the plugin MUST NOT make any assumptions about the returned paths. + +Like any other paths, the plugin MUST map these paths using state:mapPath +before storing them in state. The plugin MUST NOT assume these paths will be +available across a save/restore otherwise, that is, only mapped paths saved to +state are persistent, any other created paths are temporary. + +For example, a plugin may create a file in a subdirectory like so: + + :::c + char* save_myfile(LV2_State_Make_Path* make_path) + { + char* path = make_path->path(make_path->handle, "foo/bar/myfile.txt"); + FILE* myfile = fopen(path, 'w'); + fprintf(myfile, "I am some data"); + fclose(myfile); + return path; + } + +"""^^lv2:Markdown . + +state:threadSafeRestore + lv2:documentation """ + +If a plugin supports this feature, its LV2_State_Interface::restore method is +thread-safe and may be called concurrently with audio class functions. + +To support this feature, the host MUST pass a +[work:schedule](worker.html#schedule) feature to the restore method, which will +be used to complete the state restoration. The usual mechanics of the worker +apply: the host will call the plugin's work method, which emits a response +which is later applied in the audio thread. + +The host is not required to block audio processing while restore() and work() +load the state, so this feature allows state to be restored without dropouts. + +"""^^lv2:Markdown . + +state:freePath + lv2:documentation """ + +This feature provides a function that can be used by plugins to free paths that +were allocated by the host via other state features (state:mapPath and +state:makePath). + +"""^^lv2:Markdown . + +state:StateChanged + lv2:documentation """ + +A notification that the internal state of the plugin has been changed in a way +that the host can not otherwise know about. + +This is a one-way notification, intended to be used as the type of an +[Object](atom.html#Object) sent from plugins when necessary. + +Plugins SHOULD emit such an event whenever a change has occurred that would +result in a different state being saved, but not when the host explicity makes +a change which it knows is likely to have that effect, such as changing a +parameter. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.ttl new file mode 100644 index 00000000..19ccaa22 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/state/state.ttl @@ -0,0 +1,60 @@ +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix state: . + + + a owl:Ontology ; + rdfs:label "LV2 State" ; + rdfs:comment "An interface for LV2 plugins to save and restore state." ; + rdfs:seeAlso , + . + +state:interface + a lv2:ExtensionData ; + rdfs:label "interface" ; + rdfs:comment "A plugin interface for saving and restoring state." . + +state:State + a rdfs:Class ; + rdfs:label "State" ; + rdfs:comment "LV2 plugin state." . + +state:loadDefaultState + a lv2:Feature ; + rdfs:label "load default state" ; + rdfs:comment "A feature indicating that the plugin has default state." . + +state:state + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "state" ; + rdfs:range state:State ; + rdfs:comment "The state of an LV2 plugin instance." . + +state:mapPath + a lv2:Feature ; + rdfs:label "map path" ; + rdfs:comment "A feature for mapping between absolute and abstract file paths." . + +state:makePath + a lv2:Feature ; + rdfs:label "make path" ; + rdfs:comment "A feature for creating new files and directories." . + +state:threadSafeRestore + a lv2:Feature ; + rdfs:label "thread-safe restore" ; + rdfs:comment "A feature indicating support for thread-safe state restoration." . + +state:freePath + a lv2:Feature ; + rdfs:label "free path" ; + rdfs:comment "A feature for freeing paths allocated by the host." . + +state:StateChanged + a rdfs:Class ; + rdfs:label "State Changed" ; + rdfs:comment "A notification that the internal state of the plugin has changed." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/manifest.ttl new file mode 100644 index 00000000..d80aa752 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h new file mode 100644 index 00000000..1dce2199 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.h @@ -0,0 +1,59 @@ +/* + Copyright 2011-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_TIME_H +#define LV2_TIME_H + +/** + @defgroup time Time + @ingroup lv2 + + Properties for describing time. + + Note the time extension is purely data, this header merely defines URIs for + convenience. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_TIME_URI "http://lv2plug.in/ns/ext/time" ///< http://lv2plug.in/ns/ext/time +#define LV2_TIME_PREFIX LV2_TIME_URI "#" ///< http://lv2plug.in/ns/ext/time# + +#define LV2_TIME__Time LV2_TIME_PREFIX "Time" ///< http://lv2plug.in/ns/ext/time#Time +#define LV2_TIME__Position LV2_TIME_PREFIX "Position" ///< http://lv2plug.in/ns/ext/time#Position +#define LV2_TIME__Rate LV2_TIME_PREFIX "Rate" ///< http://lv2plug.in/ns/ext/time#Rate +#define LV2_TIME__position LV2_TIME_PREFIX "position" ///< http://lv2plug.in/ns/ext/time#position +#define LV2_TIME__barBeat LV2_TIME_PREFIX "barBeat" ///< http://lv2plug.in/ns/ext/time#barBeat +#define LV2_TIME__bar LV2_TIME_PREFIX "bar" ///< http://lv2plug.in/ns/ext/time#bar +#define LV2_TIME__beat LV2_TIME_PREFIX "beat" ///< http://lv2plug.in/ns/ext/time#beat +#define LV2_TIME__beatUnit LV2_TIME_PREFIX "beatUnit" ///< http://lv2plug.in/ns/ext/time#beatUnit +#define LV2_TIME__beatsPerBar LV2_TIME_PREFIX "beatsPerBar" ///< http://lv2plug.in/ns/ext/time#beatsPerBar +#define LV2_TIME__beatsPerMinute LV2_TIME_PREFIX "beatsPerMinute" ///< http://lv2plug.in/ns/ext/time#beatsPerMinute +#define LV2_TIME__frame LV2_TIME_PREFIX "frame" ///< http://lv2plug.in/ns/ext/time#frame +#define LV2_TIME__framesPerSecond LV2_TIME_PREFIX "framesPerSecond" ///< http://lv2plug.in/ns/ext/time#framesPerSecond +#define LV2_TIME__speed LV2_TIME_PREFIX "speed" ///< http://lv2plug.in/ns/ext/time#speed + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_TIME_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.meta.ttl new file mode 100644 index 00000000..2b99cb77 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.meta.ttl @@ -0,0 +1,112 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix time: . + + + a doap:Project ; + doap:name "LV2 Time" ; + doap:shortdesc "A vocabulary for describing musical time." ; + doap:created "2011-10-05" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Clarify time:beat origin." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2016-07-31" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Define LV2_TIME_PREFIX." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This is a vocabulary for describing a position in time and the speed of time +passage, in both real and musical terms. + +In addition to real time (based on seconds), two units of time are used: +_frames_ and _beats_. A frame is a numbered quantum of time. Frame time is +related to real-time by the _frame rate_ or _sample rate_, +time:framesPerSecond. A beat is a single pulse of musical time. Beat time is +related to real-time by the _tempo_, time:beatsPerMinute. + +Musical time additionally has a _meter_ which describes passage of time in +terms of musical _bars_. A bar is a higher level grouping of beats. The meter +describes how many beats are in one bar. + +"""^^lv2:Markdown . + +time:Position + lv2:documentation """ + +A point in time and/or the speed at which time is passing. A position is both +a point and a speed, which precisely defines a time within a timeline. + +"""^^lv2:Markdown . + +time:Rate + lv2:documentation """ + +The rate of passage of time in terms of one unit with respect to another. + +"""^^lv2:Markdown . + +time:beat + lv2:documentation """ + +This is not the beat within a bar like time:barBeat, but relative to the same +origin as time:bar and monotonically increases unless the transport is +repositioned. + +"""^^lv2:Markdown . + +time:beatUnit + lv2:documentation """ + +Beat unit, the note value that counts as one beat. This is the bottom number +in a time signature: 2 for half note, 4 for quarter note, and so on. + +"""^^lv2:Markdown . + +time:speed + lv2:documentation """ + +The rate of the progress of time as a fraction of normal speed. For example, a +rate of 0.0 is stopped, 1.0 is rolling at normal speed, 0.5 is rolling at half +speed, -1.0 is reverse, and so on. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.ttl new file mode 100644 index 00000000..a4085c60 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/time/time.ttl @@ -0,0 +1,122 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix time: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Time" ; + rdfs:comment "A vocabulary for describing musical time." ; + rdfs:seeAlso , + . + +time:Time + a rdfs:Class , + owl:Class ; + rdfs:subClassOf time:Position ; + rdfs:label "Time" ; + rdfs:comment "A point in time in some unit/dimension." . + +time:Position + a rdfs:Class , + owl:Class ; + rdfs:label "Position" ; + rdfs:comment "A point in time and/or the speed at which time is passing." . + +time:Rate + a rdfs:Class , + owl:Class ; + rdfs:subClassOf time:Position ; + rdfs:label "Rate" ; + rdfs:comment "The rate of passage of time." . + +time:position + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:range time:Position ; + rdfs:label "position" ; + rdfs:comment "A musical position." . + +time:barBeat + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:float ; + rdfs:label "beat within bar" ; + rdfs:comment "The beat number within the bar, from 0 to time:beatsPerBar." . + +time:bar + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:long ; + rdfs:label "bar" ; + rdfs:comment "A musical bar or measure." . + +time:beat + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:double ; + rdfs:label "beat" ; + rdfs:comment "The global running beat number." . + +time:beatUnit + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "beat unit" ; + rdfs:comment "The note value that counts as one beat." . + +time:beatsPerBar + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "beats per bar" ; + rdfs:comment "The number of beats in one bar." . + +time:beatsPerMinute + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "beats per minute" ; + rdfs:comment "Tempo in beats per minute." . + +time:frame + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:long ; + rdfs:label "frame" ; + rdfs:comment "A time stamp in audio frames." . + +time:framesPerSecond + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "frames per second" ; + rdfs:comment "Frame rate in frames per second." . + +time:speed + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "speed" ; + rdfs:comment "The rate of the progress of time as a fraction of normal speed." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/manifest.ttl new file mode 100644 index 00000000..9f259adf --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 22 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h new file mode 100644 index 00000000..61b3b54b --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.h @@ -0,0 +1,543 @@ +/* + LV2 UI Extension + Copyright 2009-2016 David Robillard + Copyright 2006-2011 Lars Luthman + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_UI_H +#define LV2_UI_H + +/** + @defgroup ui User Interfaces + @ingroup lv2 + + User interfaces of any type for plugins. + + See for details. + + @{ +*/ + +#include "lv2/core/lv2.h" +#include "lv2/urid/urid.h" + +#include +#include + +// clang-format off + +#define LV2_UI_URI "http://lv2plug.in/ns/extensions/ui" ///< http://lv2plug.in/ns/extensions/ui +#define LV2_UI_PREFIX LV2_UI_URI "#" ///< http://lv2plug.in/ns/extensions/ui# + +#define LV2_UI__CocoaUI LV2_UI_PREFIX "CocoaUI" ///< http://lv2plug.in/ns/extensions/ui#CocoaUI +#define LV2_UI__Gtk3UI LV2_UI_PREFIX "Gtk3UI" ///< http://lv2plug.in/ns/extensions/ui#Gtk3UI +#define LV2_UI__GtkUI LV2_UI_PREFIX "GtkUI" ///< http://lv2plug.in/ns/extensions/ui#GtkUI +#define LV2_UI__PortNotification LV2_UI_PREFIX "PortNotification" ///< http://lv2plug.in/ns/extensions/ui#PortNotification +#define LV2_UI__PortProtocol LV2_UI_PREFIX "PortProtocol" ///< http://lv2plug.in/ns/extensions/ui#PortProtocol +#define LV2_UI__Qt4UI LV2_UI_PREFIX "Qt4UI" ///< http://lv2plug.in/ns/extensions/ui#Qt4UI +#define LV2_UI__Qt5UI LV2_UI_PREFIX "Qt5UI" ///< http://lv2plug.in/ns/extensions/ui#Qt5UI +#define LV2_UI__UI LV2_UI_PREFIX "UI" ///< http://lv2plug.in/ns/extensions/ui#UI +#define LV2_UI__WindowsUI LV2_UI_PREFIX "WindowsUI" ///< http://lv2plug.in/ns/extensions/ui#WindowsUI +#define LV2_UI__X11UI LV2_UI_PREFIX "X11UI" ///< http://lv2plug.in/ns/extensions/ui#X11UI +#define LV2_UI__binary LV2_UI_PREFIX "binary" ///< http://lv2plug.in/ns/extensions/ui#binary +#define LV2_UI__fixedSize LV2_UI_PREFIX "fixedSize" ///< http://lv2plug.in/ns/extensions/ui#fixedSize +#define LV2_UI__idleInterface LV2_UI_PREFIX "idleInterface" ///< http://lv2plug.in/ns/extensions/ui#idleInterface +#define LV2_UI__noUserResize LV2_UI_PREFIX "noUserResize" ///< http://lv2plug.in/ns/extensions/ui#noUserResize +#define LV2_UI__notifyType LV2_UI_PREFIX "notifyType" ///< http://lv2plug.in/ns/extensions/ui#notifyType +#define LV2_UI__parent LV2_UI_PREFIX "parent" ///< http://lv2plug.in/ns/extensions/ui#parent +#define LV2_UI__plugin LV2_UI_PREFIX "plugin" ///< http://lv2plug.in/ns/extensions/ui#plugin +#define LV2_UI__portIndex LV2_UI_PREFIX "portIndex" ///< http://lv2plug.in/ns/extensions/ui#portIndex +#define LV2_UI__portMap LV2_UI_PREFIX "portMap" ///< http://lv2plug.in/ns/extensions/ui#portMap +#define LV2_UI__portNotification LV2_UI_PREFIX "portNotification" ///< http://lv2plug.in/ns/extensions/ui#portNotification +#define LV2_UI__portSubscribe LV2_UI_PREFIX "portSubscribe" ///< http://lv2plug.in/ns/extensions/ui#portSubscribe +#define LV2_UI__protocol LV2_UI_PREFIX "protocol" ///< http://lv2plug.in/ns/extensions/ui#protocol +#define LV2_UI__requestValue LV2_UI_PREFIX "requestValue" ///< http://lv2plug.in/ns/extensions/ui#requestValue +#define LV2_UI__floatProtocol LV2_UI_PREFIX "floatProtocol" ///< http://lv2plug.in/ns/extensions/ui#floatProtocol +#define LV2_UI__peakProtocol LV2_UI_PREFIX "peakProtocol" ///< http://lv2plug.in/ns/extensions/ui#peakProtocol +#define LV2_UI__resize LV2_UI_PREFIX "resize" ///< http://lv2plug.in/ns/extensions/ui#resize +#define LV2_UI__showInterface LV2_UI_PREFIX "showInterface" ///< http://lv2plug.in/ns/extensions/ui#showInterface +#define LV2_UI__touch LV2_UI_PREFIX "touch" ///< http://lv2plug.in/ns/extensions/ui#touch +#define LV2_UI__ui LV2_UI_PREFIX "ui" ///< http://lv2plug.in/ns/extensions/ui#ui +#define LV2_UI__updateRate LV2_UI_PREFIX "updateRate" ///< http://lv2plug.in/ns/extensions/ui#updateRate +#define LV2_UI__windowTitle LV2_UI_PREFIX "windowTitle" ///< http://lv2plug.in/ns/extensions/ui#windowTitle +#define LV2_UI__scaleFactor LV2_UI_PREFIX "scaleFactor" ///< http://lv2plug.in/ns/extensions/ui#scaleFactor +#define LV2_UI__foregroundColor LV2_UI_PREFIX "foregroundColor" ///< http://lv2plug.in/ns/extensions/ui#foregroundColor +#define LV2_UI__backgroundColor LV2_UI_PREFIX "backgroundColor" ///< http://lv2plug.in/ns/extensions/ui#backgroundColor + +// clang-format on + +/** + The index returned by LV2UI_Port_Map::port_index() for unknown ports. +*/ +#define LV2UI_INVALID_PORT_INDEX ((uint32_t)-1) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + A pointer to some widget or other type of UI handle. + + The actual type is defined by the type of the UI. +*/ +typedef void* LV2UI_Widget; + +/** + A pointer to UI instance internals. + + The host may compare this to NULL, but otherwise MUST NOT interpret it. +*/ +typedef void* LV2UI_Handle; + +/** + A pointer to a controller provided by the host. + + The UI may compare this to NULL, but otherwise MUST NOT interpret it. +*/ +typedef void* LV2UI_Controller; + +/** + A pointer to opaque data for a feature. +*/ +typedef void* LV2UI_Feature_Handle; + +/** + A host-provided function that sends data to a plugin's input ports. + + @param controller The opaque controller pointer passed to + LV2UI_Descriptor::instantiate(). + + @param port_index Index of the port to update. + + @param buffer Buffer containing `buffer_size` bytes of data. + + @param buffer_size Size of `buffer` in bytes. + + @param port_protocol Either 0 or the URID for a ui:PortProtocol. If 0, the + protocol is implicitly ui:floatProtocol, the port MUST be an lv2:ControlPort + input, `buffer` MUST point to a single float value, and `buffer_size` MUST + be sizeof(float). The UI SHOULD NOT use a protocol not supported by the + host, but the host MUST gracefully ignore any protocol it does not + understand. +*/ +typedef void (*LV2UI_Write_Function)(LV2UI_Controller controller, + uint32_t port_index, + uint32_t buffer_size, + uint32_t port_protocol, + const void* buffer); + +/** + A plugin UI. + + A pointer to an object of this type is returned by the lv2ui_descriptor() + function. +*/ +typedef struct LV2UI_Descriptor { + /** + The URI for this UI (not for the plugin it controls). + */ + const char* URI; + + /** + Create a new UI and return a handle to it. This function works + similarly to LV2_Descriptor::instantiate(). + + @param descriptor The descriptor for the UI to instantiate. + + @param plugin_uri The URI of the plugin that this UI will control. + + @param bundle_path The path to the bundle containing this UI, including + the trailing directory separator. + + @param write_function A function that the UI can use to send data to the + plugin's input ports. + + @param controller A handle for the UI instance to be passed as the + first parameter of UI methods. + + @param widget (output) widget pointer. The UI points this at its main + widget, which has the type defined by the UI type in the data file. + + @param features An array of LV2_Feature pointers. The host must pass + all feature URIs that it and the UI supports and any additional data, as + in LV2_Descriptor::instantiate(). Note that UI features and plugin + features are not necessarily the same. + + */ + LV2UI_Handle (*instantiate)(const struct LV2UI_Descriptor* descriptor, + const char* plugin_uri, + const char* bundle_path, + LV2UI_Write_Function write_function, + LV2UI_Controller controller, + LV2UI_Widget* widget, + const LV2_Feature* const* features); + + /** + Destroy the UI. The host must not try to access the widget after + calling this function. + */ + void (*cleanup)(LV2UI_Handle ui); + + /** + Tell the UI that something interesting has happened at a plugin port. + + What is "interesting" and how it is written to `buffer` is defined by + `format`, which has the same meaning as in LV2UI_Write_Function(). + Format 0 is a special case for lv2:ControlPort, where this function + should be called when the port value changes (but not necessarily for + every change), `buffer_size` must be sizeof(float), and `buffer` + points to a single IEEE-754 float. + + By default, the host should only call this function for lv2:ControlPort + inputs. However, the UI can request updates for other ports statically + with ui:portNotification or dynamicaly with ui:portSubscribe. + + The UI MUST NOT retain any reference to `buffer` after this function + returns, it is only valid for the duration of the call. + + This member may be NULL if the UI is not interested in any port events. + */ + void (*port_event)(LV2UI_Handle ui, + uint32_t port_index, + uint32_t buffer_size, + uint32_t format, + const void* buffer); + + /** + Return a data structure associated with an extension URI, typically an + interface struct with additional function pointers + + This member may be set to NULL if the UI is not interested in supporting + any extensions. This is similar to LV2_Descriptor::extension_data(). + + */ + const void* (*extension_data)(const char* uri); +} LV2UI_Descriptor; + +/** + Feature/interface for resizable UIs (LV2_UI__resize). + + This structure is used in two ways: as a feature passed by the host via + LV2UI_Descriptor::instantiate(), or as an interface provided by a UI via + LV2UI_Descriptor::extension_data()). +*/ +typedef struct { + /** + Pointer to opaque data which must be passed to ui_resize(). + */ + LV2UI_Feature_Handle handle; + + /** + Request/advertise a size change. + + When provided by the host, the UI may call this function to inform the + host about the size of the UI. + + When provided by the UI, the host may call this function to notify the + UI that it should change its size accordingly. In this case, the host + must pass the LV2UI_Handle to provide access to the UI instance. + + @return 0 on success. + */ + int (*ui_resize)(LV2UI_Feature_Handle handle, int width, int height); +} LV2UI_Resize; + +/** + Feature to map port symbols to UIs. + + This can be used by the UI to get the index for a port with the given + symbol. This makes it possible to implement and distribute a UI separately + from the plugin (since symbol, unlike index, is a stable port identifier). +*/ +typedef struct { + /** + Pointer to opaque data which must be passed to port_index(). + */ + LV2UI_Feature_Handle handle; + + /** + Get the index for the port with the given `symbol`. + + @return The index of the port, or LV2UI_INVALID_PORT_INDEX if no such + port is found. + */ + uint32_t (*port_index)(LV2UI_Feature_Handle handle, const char* symbol); +} LV2UI_Port_Map; + +/** + Feature to subscribe to port updates (LV2_UI__portSubscribe). +*/ +typedef struct { + /** + Pointer to opaque data which must be passed to subscribe() and + unsubscribe(). + */ + LV2UI_Feature_Handle handle; + + /** + Subscribe to updates for a port. + + This means that the host will call the UI's port_event() function when + the port value changes (as defined by protocol). + + Calling this function with the same `port_index` and `port_protocol` + as an already active subscription has no effect. + + @param handle The handle field of this struct. + @param port_index The index of the port. + @param port_protocol The URID of the ui:PortProtocol. + @param features Features for this subscription. + @return 0 on success. + */ + uint32_t (*subscribe)(LV2UI_Feature_Handle handle, + uint32_t port_index, + uint32_t port_protocol, + const LV2_Feature* const* features); + + /** + Unsubscribe from updates for a port. + + This means that the host will cease calling calling port_event() when + the port value changes. + + Calling this function with a `port_index` and `port_protocol` that + does not refer to an active port subscription has no effect. + + @param handle The handle field of this struct. + @param port_index The index of the port. + @param port_protocol The URID of the ui:PortProtocol. + @param features Features for this subscription. + @return 0 on success. + */ + uint32_t (*unsubscribe)(LV2UI_Feature_Handle handle, + uint32_t port_index, + uint32_t port_protocol, + const LV2_Feature* const* features); +} LV2UI_Port_Subscribe; + +/** + A feature to notify the host that the user has grabbed a UI control. +*/ +typedef struct { + /** + Pointer to opaque data which must be passed to touch(). + */ + LV2UI_Feature_Handle handle; + + /** + Notify the host that a control has been grabbed or released. + + The host should cease automating the port or otherwise manipulating the + port value until the control has been ungrabbed. + + @param handle The handle field of this struct. + @param port_index The index of the port associated with the control. + @param grabbed If true, the control has been grabbed, otherwise the + control has been released. + */ + void (*touch)(LV2UI_Feature_Handle handle, uint32_t port_index, bool grabbed); +} LV2UI_Touch; + +/** + A status code for LV2UI_Request_Value::request(). +*/ +typedef enum { + /** + Completed successfully. + + The host will set the parameter later if the user choses a new value. + */ + LV2UI_REQUEST_VALUE_SUCCESS, + + /** + Parameter already being requested. + + The host is already requesting a parameter from the user (for example, a + dialog is visible), or the UI is otherwise busy and can not make this + request. + */ + LV2UI_REQUEST_VALUE_BUSY, + + /** + Unknown parameter. + + The host is not aware of this parameter, and is not able to set a new + value for it. + */ + LV2UI_REQUEST_VALUE_ERR_UNKNOWN, + + /** + Unsupported parameter. + + The host knows about this parameter, but does not support requesting a + new value for it from the user. This is likely because the host does + not have UI support for choosing a value with the appropriate type. + */ + LV2UI_REQUEST_VALUE_ERR_UNSUPPORTED +} LV2UI_Request_Value_Status; + +/** + A feature to request a new parameter value from the host. +*/ +typedef struct { + /** + Pointer to opaque data which must be passed to request(). + */ + LV2UI_Feature_Handle handle; + + /** + Request a value for a parameter from the host. + + This is mainly used by UIs to request values for complex parameters that + don't change often, such as file paths, but it may be used to request + any parameter value. + + This function returns immediately, and the return value indicates + whether the host can fulfill the request. The host may notify the + plugin about the new parameter value, for example when a file is + selected by the user, via the usual mechanism. Typically, the host will + send a message to the plugin that sets the new parameter value, and the + plugin will notify the UI via a message as usual for any other parameter + change. + + To provide an appropriate UI, the host can determine details about the + parameter from the plugin data as usual. The additional parameters of + this function provide support for more advanced use cases, but in the + simple common case, the plugin will simply pass the key of the desired + parameter and zero for everything else. + + @param handle The handle field of this struct. + + @param key The URID of the parameter. + + @param type The optional type of the value to request. This can be used + to request a specific value type for parameters that support several. + If non-zero, it must be the URID of an instance of rdfs:Class or + rdfs:Datatype. + + @param features Additional features for this request, or NULL. + + @return A status code which is 0 on success. + */ + LV2UI_Request_Value_Status (*request)(LV2UI_Feature_Handle handle, + LV2_URID key, + LV2_URID type, + const LV2_Feature* const* features); + +} LV2UI_Request_Value; + +/** + UI Idle Interface (LV2_UI__idleInterface) + + UIs can provide this interface to have an idle() callback called by the host + rapidly to update the UI. +*/ +typedef struct { + /** + Run a single iteration of the UI's idle loop. + + This will be called rapidly in the UI thread at a rate appropriate + for a toolkit main loop. There are no precise timing guarantees, but + the host should attempt to call idle() at a high enough rate for smooth + animation, at least 30Hz. + + @return non-zero if the UI has been closed, in which case the host + should stop calling idle(), and can either completely destroy the UI, or + re-show it and resume calling idle(). + */ + int (*idle)(LV2UI_Handle ui); +} LV2UI_Idle_Interface; + +/** + UI Show Interface (LV2_UI__showInterface) + + UIs can provide this interface to show and hide a window, which allows them + to function in hosts unable to embed their widget. This allows any UI to + provide a fallback for embedding that works in any host. + + If used: + - The host MUST use LV2UI_Idle_Interface to drive the UI. + - The UI MUST return non-zero from LV2UI_Idle_Interface::idle() when it has + been closed. + - If idle() returns non-zero, the host MUST call hide() and stop calling + idle(). It MAY later call show() then resume calling idle(). +*/ +typedef struct { + /** + Show a window for this UI. + + The window title MAY have been passed by the host to + LV2UI_Descriptor::instantiate() as an LV2_Options_Option with key + LV2_UI__windowTitle. + + @return 0 on success, or anything else to stop being called. + */ + int (*show)(LV2UI_Handle ui); + + /** + Hide the window for this UI. + + @return 0 on success, or anything else to stop being called. + */ + int (*hide)(LV2UI_Handle ui); +} LV2UI_Show_Interface; + +/** + Peak data for a slice of time, the update format for ui:peakProtocol. +*/ +typedef struct { + /** + The start of the measurement period. This is just a running counter + that is only meaningful in comparison to previous values and must not be + interpreted as an absolute time. + */ + uint32_t period_start; + + /** + The size of the measurement period, in the same units as period_start. + */ + uint32_t period_size; + + /** + The peak value for the measurement period. This should be the maximal + value for abs(sample) over all the samples in the period. + */ + float peak; +} LV2UI_Peak_Data; + +/** + Prototype for UI accessor function. + + This is the entry point to a UI library, which works in the same way as + lv2_descriptor() but for UIs rather than plugins. +*/ +LV2_SYMBOL_EXPORT +const LV2UI_Descriptor* +lv2ui_descriptor(uint32_t index); + +/** + The type of the lv2ui_descriptor() function. +*/ +typedef const LV2UI_Descriptor* (*LV2UI_DescriptorFunction)(uint32_t index); + +#ifdef __cplusplus +} +#endif + +/** + @} +*/ + +#endif /* LV2_UI_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.meta.ttl new file mode 100644 index 00000000..cb92a865 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.meta.ttl @@ -0,0 +1,627 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix ui: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 UI" ; + doap:shortdesc "User interfaces for LV2 plugins." ; + doap:created "2006-00-00" ; + doap:developer ; + doap:maintainer ; + doap:release [ + doap:revision "2.22" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add ui:requestValue feature." + ] , [ + rdfs:label "Add ui:scaleFactor, ui:foregroundColor, and ui:backgroundColor properties." + ] , [ + rdfs:label "Deprecate ui:binary." + ] + ] + ] , [ + doap:revision "2.20" ; + doap:created "2015-07-25" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] , [ + rdfs:label "Add missing property labels." + ] + ] + ] , [ + doap:revision "2.18" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add show interface so UIs can gracefully degrade to separate windows if hosts can not use their widget directly." + ] , [ + rdfs:label "Fix identifier typos in documentation." + ] + ] + ] , [ + doap:revision "2.16" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix LV2_UI_INVALID_PORT_INDEX identifier in documentation." + ] + ] + ] , [ + doap:revision "2.14" ; + doap:created "2013-03-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add idle interface so native UIs and foreign toolkits can drive their event loops." + ] , [ + rdfs:label "Add ui:updateRate property." + ] + ] + ] , [ + doap:revision "2.12" ; + doap:created "2012-12-01" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect linker flag in ui:makeSONameResident documentation." + ] + ] + ] , [ + doap:revision "2.10" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add types for WindowsUI, CocoaUI, and Gtk3UI." + ] , [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add missing LV2_SYMBOL_EXPORT declaration for lv2ui_descriptor prototype." + ] + ] + ] , [ + doap:revision "2.8" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add ui:parent and ui:resize." + ] , [ + rdfs:label "Add support for referring to ports by symbol." + ] , [ + rdfs:label "Add ui:portMap for accessing ports by symbol, allowing for UIs to be distributed separately from plugins." + ] , [ + rdfs:label "Add port protocols and a dynamic notification subscription mechanism, for more flexible communication, and audio port metering without control port kludges." + ] , [ + rdfs:label "Add touch feature to notify the host that the user has grabbed a control." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "2.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Deprecate ui:makeSONameResident." + ] , [ + rdfs:label "Add Qt4 and X11 widget types." + ] , [ + rdfs:label "Install header to URI-based system path." + ] , [ + rdfs:label "Add pkg-config file." + ] , [ + rdfs:label "Make ui.ttl a valid OWL 2 DL ontology." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Convert documentation to HTML and use lv2:documentation." + ] , [ + rdfs:label "Use lv2:Specification to be discovered as an extension." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2010-10-06" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension makes it possible to create user interfaces for LV2 plugins. + +UIs are implemented as an LV2UI_Descriptor loaded via lv2ui_descriptor() in a +shared library, and are distributed in bundles just like plugins. + +UIs are associated with plugins in data: + + :::turtle + @prefix ui: . + + ui:ui . + a ui:X11UI ; + lv2:binary . + +where `http://my.plugin` is the URI of the plugin, `http://my.pluginui` is the +URI of the plugin UI and `myui.so` is the relative URI to the shared object +file. + +While it is possible to have the plugin UI and the plugin in the same shared +object file, it is a good idea to keep them separate so that hosts can avoid +loading the UI code if they do not need it. A UI MUST specify its class in the +RDF data (`ui:X11UI` in the above example). The class defines what type the UI +is, for example what graphics toolkit it uses. Any type of UI class can be +defined separately from this extension. + +It is possible to have multiple UIs for the same plugin, or to have the UI for +a plugin in a different bundle from the actual plugin. This allows plugin UIs +to be written independently. + +Note that the process that loads the shared object file containing the UI code +and the process that loads the shared object file containing the actual plugin +implementation are not necessarily the same process (and not even necessarily +on the same machine). This means that plugin and UI code MUST NOT use +singletons and global variables and expect them to refer to the same objects in +the UI and the actual plugin. The function callback interface defined in this +header is the only method of communication between UIs and plugin instances +(extensions may define more, though this is discouraged unless absolutely +necessary since the significant benefits of network transparency and +serialisability are lost). + +UI functionality may be extended via features, much like plugins: + + :::turtle + lv2:requiredFeature . + lv2:optionalFeature . + +The rules for a UI with a required or optional feature are identical to those +of lv2:Plugin instances: if a UI declares a feature as required, the host is +NOT allowed to load it unless it supports that feature; and if it does support +a feature, it MUST pass an appropriate LV2_Feature struct to the UI's +instantiate() method. This extension defines several standard features for +common functionality. + +UIs written to this specification do not need to be thread-safe. All functions +may only be called in the UI thread. There is only one UI thread (for +toolkits, the one the UI main loop runs in). There is no requirement that a +UI actually be a graphical widget. + +Note that UIs are completely separate from plugins. From the plugin's +perspective, control from a UI is indistinguishable from any other control, as +it all occcurs via ports. + +"""^^lv2:Markdown . + +ui:GtkUI + lv2:documentation """ + +The host must guarantee that the Gtk+ 2 library has been initialised and the +Glib main loop is running before the UI is instantiated. Note that this UI +type is not suitable for binary distribution since multiple versions of Gtk can +not be used in the same process. + +"""^^lv2:Markdown . + +ui:Gtk3UI + lv2:documentation """ + +The host must guarantee that the Gtk+ 3 library has been initialised and the +Glib main loop is running before the UI is instantiated. Note that this UI +type is not suitable for binary distribution since multiple versions of Gtk can +not be used in the same process. + +"""^^lv2:Markdown . + +ui:Qt4UI + lv2:documentation """ + +The host must guarantee that the Qt4 library has been initialised and the Qt4 +main loop is running before the UI is instantiated. Note that this UI type is +not suitable for binary distribution since multiple versions of Qt can not be +used in the same process. + +"""^^lv2:Markdown . + +ui:Qt5UI + lv2:documentation """ + +The host must guarantee that the Qt5 library has been initialised and the Qt5 +main loop is running before the UI is instantiated. Note that this UI type is +not suitable for binary distribution since multiple versions of Qt can not be +used in the same process. + +"""^^lv2:Markdown . + +ui:X11UI + lv2:documentation """ + +Note that the LV2UI_Widget for this type of UI is not a pointer, but should be +interpreted directly as an X11 `Window` ID. This is the native UI type on most +POSIX systems. + +"""^^lv2:Markdown . + +ui:WindowsUI + lv2:documentation """ + +Note that the LV2UI_Widget for this type of UI is not a pointer, but should be +interpreted directly as a `HWND`. This is the native UI type on Microsoft +Windows. + +"""^^lv2:Markdown . + +ui:CocoaUI + lv2:documentation """ + +This is the native UI type on Mac OS X. + +"""^^lv2:Markdown . + +ui:binary + lv2:documentation """ + +This property is redundant and deprecated: new UIs should use lv2:binary +instead, however hosts must still support ui:binary. + +"""^^lv2:Markdown . + +ui:makeSONameResident + lv2:documentation """ + +This feature was intended to support UIs that link against toolkit libraries +which may not be unloaded during the lifetime of the host. This is better +achieved by using the appropriate flags when linking the UI, for example `gcc +-Wl,-z,nodelete`. + +"""^^lv2:Markdown . + +ui:noUserResize + lv2:documentation """ + +If a UI has this feature, it indicates that it does not make sense to let the +user resize the main widget, and the host should prevent that. This feature +may not make sense for all UI types. The data pointer for this feature should +always be set to NULL. + +"""^^lv2:Markdown . + +ui:fixedSize + lv2:documentation """ + +If a UI has this feature, it indicates the same thing as ui:noUserResize, and +additionally that the UI will not resize itself on its own. That is, the UI +will always remain the same size. This feature may not make sense for all UI +types. The data pointer for this feature should always be set to NULL. + +"""^^lv2:Markdown . + +ui:scaleFactor + lv2:documentation """ + +HiDPI (High Dots Per Inch) displays have a high resolution on a relatively +small form factor. Many systems use a scale factor to compensate for this, so +for example, a scale factor of 2 means things are drawn twice as large as +normal. + +Hosts can pass this as an option to UIs to communicate this information, so +that the UI can draw at an appropriate scale. + +"""^^lv2:Markdown . + +ui:backgroundColor + lv2:documentation """ + +The background color of the host's UI. The host can pass this as an option so +that UIs can integrate nicely with the host window around it. + +Hosts should pass this as an option to UIs with an integer RGBA32 color value. +If the value is a 32-bit integer, it is guaranteed to be in RGBA32 format, but +the UI must check the value type and not assume this, to allow for other types +of color in the future. + +"""^^lv2:Markdown . + +ui:foregroundColor + lv2:documentation """ + +The foreground color of the host's UI. The host can pass this as an option so +that UIs can integrate nicely with the host window around it. + +Hosts should pass this as an option to UIs with an integer RGBA32 color value. +If the value is a 32-bit integer, it is guaranteed to be in RGBA32 format, but +the UI must check the value type and not assume this, to allow for other types +of color in the future. + +"""^^lv2:Markdown . + +ui:parent + lv2:documentation """ + +This feature can be used to pass a parent that the UI should be a child of. +The format of data pointer of this feature is determined by the UI type, and is +generally the same type as the LV2UI_Widget that the UI would return. For +example, for a ui:X11UI, the parent should be a `Window`. This is particularly +useful for embedding, where the parent often must be known at construction time +for embedding to work correctly. + +UIs should not _require_ this feature unless it is necessary for them to work +at all, but hosts should provide it whenever possible. + +"""^^lv2:Markdown . + +ui:PortNotification + lv2:documentation """ + +This describes which ports the host must send notifications to the UI about. +The port must be specific either by index, using the ui:portIndex property, or +symbol, using the lv2:symbol property. Since port indices are not guaranteed +to be stable, using the symbol is recommended, and the inde MUST NOT be used +except by UIs that are shipped in the same bundle as the corresponding plugin. + +"""^^lv2:Markdown . + +ui:portNotification + lv2:documentation """ + +Specifies that a UI should receive notifications about changes to a particular +port's value via LV2UI_Descriptor::port_event(). + +For example: + + :::turtle + eg:ui + a ui:X11UI ; + ui:portNotification [ + ui:plugin eg:plugin ; + lv2:symbol "gain" ; + ui:protocol ui:floatProtocol + ] . + +"""^^lv2:Markdown . + +ui:notifyType + lv2:documentation """ + +Specifies a particular type that the UI should be notified of. + +This is useful for message-based ports where several types of data can be +present, but only some are interesting to the UI. For example, if UI control +is multiplexed in the same port as MIDI, this property can be used to ensure +that only the relevant events are forwarded to the UI, and not potentially high +frequency MIDI data. + +"""^^lv2:Markdown . + +ui:resize + lv2:documentation """ + +This feature corresponds to the LV2UI_Resize struct, which should be passed +with the URI LV2_UI__resize. This struct may also be provided by the UI as +extension data using the same URI, in which case it is used by the host to +request that the UI change its size. + +"""^^lv2:Markdown . + +ui:portMap + lv2:documentation """ + +This makes it possible to implement and distribute UIs separately from the +plugin binaries they control. + +This feature corresponds to the LV2UI_Port_Index struct, which should be passed +with the URI LV2_UI__portIndex. + +"""^^lv2:Markdown . + +ui:portSubscribe + lv2:documentation """ + +This makes it possible for a UI to explicitly request a particular style of +update from a port at run-time, in a more flexible and powerful way than +listing subscriptions statically allows. + +This feature corresponds to the LV2UI_Port_Subscribe struct, which should be +passed with the URI LV2_UI__portSubscribe. + +"""^^lv2:Markdown . + +ui:touch + lv2:documentation """ + +This is useful for automation, so the host can allow the user to take control +of a port, even if that port would otherwise be automated (much like grabbing a +physical motorised fader). + +It can also be used for MIDI learn or in any other situation where the host +needs to do something with a particular control and it would be convenient for +the user to select it directly from the plugin UI. + +This feature corresponds to the LV2UI_Touch struct, which should be passed with +the URI LV2_UI__touch. + +"""^^lv2:Markdown . + +ui:requestValue + lv2:documentation """ + +This allows a plugin UI to request a new parameter value using the host's UI, +for example by showing a dialog or integrating with the host's built-in content +browser. This should only be used for complex parameter types where the plugin +UI is not capable of showing the expected native platform or host interface to +choose a value, such as file path parameters. + +This feature corresponds to the LV2UI_Request_Value struct, which should be +passed with the URI LV2_UI__requestValue. + +"""^^lv2:Markdown . + +ui:idleInterface + lv2:documentation """ + +To support this feature, the UI should list it as a lv2:optionalFeature or +lv2:requiredFeature in its data, and also as lv2:extensionData. When the UI's +extension_data() is called with this URI (LV2_UI__idleInterface), it should +return a pointer to an LV2UI_Idle_Interface. + +To indicate support, the host should pass a feature to instantiate() with this +URI, with NULL for data. + +"""^^lv2:Markdown . + +ui:showInterface + lv2:documentation """ + +This allows UIs to gracefully degrade to separate windows when the host is +unable to embed the UI widget for whatever reason. When the UI's +extension_data() is called with this URI (LV2_UI__showInterface), it should +return a pointer to an LV2UI_Show_Interface. + +"""^^lv2:Markdown . + +ui:PortProtocol + lv2:documentation """ + +A PortProtocol MUST define: + +Port Type +: Which plugin port types the buffer type is valid for. + +Feature Data +: What data (if any) should be passed in the LV2_Feature. + +A PortProtocol for an output port MUST define: + +Update Frequency +: When the host should call port_event(). + +Update Format +: The format of the data in the buffer passed to port_event(). + +Options +: The format of the options passed to subscribe() and unsubscribe(). + +A PortProtocol for an input port MUST define: + +Write Format +: The format of the data in the buffer passed to write_port(). + +Write Effect +: What happens when the UI calls write_port(). + +For an example, see ui:floatProtocol or ui:peakProtocol. + +PortProtocol is a subclass of lv2:Feature, so UIs use lv2:optionalFeature and +lv2:requiredFeature to specify which PortProtocols they want to use. + +"""^^lv2:Markdown . + +ui:floatProtocol + lv2:documentation """ + +A protocol for transferring single floating point values. The rules for this +protocol are: + +Port Type +: lv2:ControlPort + +Feature Data +: None. + +Update Frequency +: The host SHOULD call port_event() as soon as possible when the port value has + changed, but there are no timing guarantees. + +Update Format +: A single float. + +Options +: None. + +Write Format +: A single float. + +Write Effect +: The host SHOULD set the port to the received value as soon as possible, but + there is no guarantee that run() actually sees this value. + +"""^^lv2:Markdown . + +ui:peakProtocol + lv2:documentation """ + +This port protocol defines a way for the host to send continuous peak +measurements of the audio signal at a certain port to the UI. The intended use +is visualisation, for example an animated meter widget that shows the level of +the audio input or output. + +A contiguous sequence of audio samples for which a peak value has been computed +is called a _measurement period_. + +The rules for this protocol are: + +Port Type +: lv2:AudioPort + +Feature Data +: None. + +Update Frequency +: The host SHOULD call port_event() at regular intervals. The measurement + periods used for calls to port_event() for the same port SHOULD be + contiguous (i.e. the measurement period for one call should begin right + after the end of the measurement period for the previous call ends) unless + the UI has removed and re-added the port subscription between those calls. + However, UIs MUST NOT depend on either the regularity of the calls or the + contiguity of the measurement periods; hosts may change the call rate or + skip calls for performance or other reasons. Measurement periods for + different calls to port_event() for the same port MUST NOT overlap. + +Update Format +: A single LV2UI_Peak_Data object. + +Options +: None. + +Write Format +: None. + +Write Effect +: None. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.ttl new file mode 100644 index 00000000..61f8bcac --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/ui/ui.ttl @@ -0,0 +1,248 @@ +@prefix lv2: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix ui: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 UI" ; + rdfs:comment "User interfaces for LV2 plugins." ; + owl:imports ; + rdfs:seeAlso , + . + +ui:UI + a rdfs:Class , + owl:Class ; + rdfs:label "User Interface" ; + rdfs:comment "A UI for an LV2 plugin." . + +ui:GtkUI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "GTK2 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Gtk+ 2.0 GtkWidget." . + +ui:Gtk3UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "GTK3 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Gtk+ 3.0 GtkWidget." . + +ui:Qt4UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Qt4 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Qt4 QWidget." . + +ui:Qt5UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Qt5 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Qt5 QWidget." . + +ui:X11UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "X11 UI" ; + rdfs:comment "A UI where the widget is an X11 Window window ID." . + +ui:WindowsUI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Windows UI" ; + rdfs:comment "A UI where the widget is a Windows HWND window ID." . + +ui:CocoaUI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Cocoa UI" ; + rdfs:comment "A UI where the widget is a pointer to a NSView." . + +ui:ui + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:Plugin ; + rdfs:range ui:UI ; + rdfs:label "user interface" ; + rdfs:comment "Relates a plugin to a UI that applies to it." . + +ui:binary + a rdf:Property , + owl:ObjectProperty ; + owl:sameAs lv2:binary ; + owl:deprecated "true"^^xsd:boolean ; + rdfs:label "binary" ; + rdfs:comment "The shared library that a UI resides in." . + +ui:makeSONameResident + a lv2:Feature ; + owl:deprecated "true"^^xsd:boolean ; + rdfs:label "make SO name resident" ; + rdfs:comment "UI binary must not be unloaded." . + +ui:noUserResize + a lv2:Feature ; + rdfs:label "no user resize" ; + rdfs:comment "Non-resizable UI." . + +ui:fixedSize + a lv2:Feature ; + rdfs:label "fixed size" ; + rdfs:comment "Non-resizable UI that will never resize itself." . + +ui:scaleFactor + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:range xsd:float ; + rdfs:label "scale factor" ; + rdfs:comment "Scale factor for high resolution screens." . + +ui:backgroundColor + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "background color" ; + rdfs:comment """The background color of the host's UI.""" . + +ui:foregroundColor + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "foreground color" ; + rdfs:comment """The foreground color of the host's UI.""" . + +ui:parent + a lv2:Feature ; + rdfs:label "parent" ; + rdfs:comment "The parent for a UI." . + +ui:PortNotification + a rdfs:Class , + owl:Class ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty ui:plugin ; + owl:cardinality 1 ; + rdfs:comment "A PortNotification MUST have exactly one ui:plugin." + ] ; + rdfs:label "Port Notification" ; + rdfs:comment "A description of port updates that a host must send a UI." . + +ui:portNotification + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:UI ; + rdfs:range ui:PortNotification ; + rdfs:label "port notification" ; + rdfs:comment "Specifies a port notification that is required by a UI." . + +ui:plugin + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range lv2:Plugin ; + rdfs:label "plugin" ; + rdfs:comment "The plugin a portNotification applies to." . + +ui:portIndex + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range xsd:decimal ; + rdfs:label "port index" ; + rdfs:comment "The index of the port a portNotification applies to." . + +ui:notifyType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:PortNotification ; + rdfs:label "notify type" ; + rdfs:comment "A particular type that the UI should be notified of." . + +ui:resize + a lv2:Feature , + lv2:ExtensionData ; + rdfs:label "resize" ; + rdfs:comment """A feature that control of, and notifications about, a UI's size.""" . + +ui:portMap + a lv2:Feature ; + rdfs:label "port map" ; + rdfs:comment "A feature for accessing the index of a port by symbol." . + +ui:portSubscribe + a lv2:Feature ; + rdfs:label "port subscribe" ; + rdfs:comment "A feature for dynamically subscribing to updates from a port." . + +ui:touch + a lv2:Feature ; + rdfs:label "touch" ; + rdfs:comment "A feature to notify that the user has grabbed a port control." . + +ui:requestValue + a lv2:Feature ; + rdfs:label "request value" ; + rdfs:comment "A feature to request a parameter value from the user via the host." . + +ui:idleInterface + a lv2:Feature , + lv2:ExtensionData ; + rdfs:label "idle interface" ; + rdfs:comment "A feature that provides a callback for the host to drive the UI." . + +ui:showInterface + a lv2:ExtensionData ; + rdfs:label "show interface" ; + rdfs:comment "An interface for showing and hiding a window for a UI." . + +ui:windowTitle + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:string ; + rdfs:label "window title" ; + rdfs:comment "The title for the window shown by LV2UI_Show_Interface." . + +ui:updateRate + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:float ; + rdfs:label "update rate" ; + rdfs:comment "The target rate, in Hz, to send updates to the UI." . + +ui:protocol + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range ui:PortProtocol ; + rdfs:label "protocol" ; + rdfs:comment "The protocol to be used for this notification." . + +ui:PortProtocol + a rdfs:Class ; + rdfs:subClassOf lv2:Feature ; + rdfs:label "Port Protocol" ; + rdfs:comment "A method to communicate port data between a UI and plugin." . + +ui:floatProtocol + a ui:PortProtocol ; + rdfs:label "float protocol" ; + rdfs:comment "A protocol for transferring single floating point values." . + +ui:peakProtocol + a ui:PortProtocol ; + rdfs:label "peak protocol" ; + rdfs:comment "A protocol for sending continuous peak measurements of an audio signal." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/manifest.ttl new file mode 100644 index 00000000..c6c9286b --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 5 ; + lv2:microVersion 12 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h new file mode 100644 index 00000000..09ae16be --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.h @@ -0,0 +1,75 @@ +/* + Copyright 2012-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_UNITS_H +#define LV2_UNITS_H + +/** + @defgroup units Units + @ingroup lv2 + + Units for LV2 values. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_UNITS_URI "http://lv2plug.in/ns/extensions/units" ///< http://lv2plug.in/ns/extensions/units +#define LV2_UNITS_PREFIX LV2_UNITS_URI "#" ///< http://lv2plug.in/ns/extensions/units# + +#define LV2_UNITS__Conversion LV2_UNITS_PREFIX "Conversion" ///< http://lv2plug.in/ns/extensions/units#Conversion +#define LV2_UNITS__Unit LV2_UNITS_PREFIX "Unit" ///< http://lv2plug.in/ns/extensions/units#Unit +#define LV2_UNITS__bar LV2_UNITS_PREFIX "bar" ///< http://lv2plug.in/ns/extensions/units#bar +#define LV2_UNITS__beat LV2_UNITS_PREFIX "beat" ///< http://lv2plug.in/ns/extensions/units#beat +#define LV2_UNITS__bpm LV2_UNITS_PREFIX "bpm" ///< http://lv2plug.in/ns/extensions/units#bpm +#define LV2_UNITS__cent LV2_UNITS_PREFIX "cent" ///< http://lv2plug.in/ns/extensions/units#cent +#define LV2_UNITS__cm LV2_UNITS_PREFIX "cm" ///< http://lv2plug.in/ns/extensions/units#cm +#define LV2_UNITS__coef LV2_UNITS_PREFIX "coef" ///< http://lv2plug.in/ns/extensions/units#coef +#define LV2_UNITS__conversion LV2_UNITS_PREFIX "conversion" ///< http://lv2plug.in/ns/extensions/units#conversion +#define LV2_UNITS__db LV2_UNITS_PREFIX "db" ///< http://lv2plug.in/ns/extensions/units#db +#define LV2_UNITS__degree LV2_UNITS_PREFIX "degree" ///< http://lv2plug.in/ns/extensions/units#degree +#define LV2_UNITS__frame LV2_UNITS_PREFIX "frame" ///< http://lv2plug.in/ns/extensions/units#frame +#define LV2_UNITS__hz LV2_UNITS_PREFIX "hz" ///< http://lv2plug.in/ns/extensions/units#hz +#define LV2_UNITS__inch LV2_UNITS_PREFIX "inch" ///< http://lv2plug.in/ns/extensions/units#inch +#define LV2_UNITS__khz LV2_UNITS_PREFIX "khz" ///< http://lv2plug.in/ns/extensions/units#khz +#define LV2_UNITS__km LV2_UNITS_PREFIX "km" ///< http://lv2plug.in/ns/extensions/units#km +#define LV2_UNITS__m LV2_UNITS_PREFIX "m" ///< http://lv2plug.in/ns/extensions/units#m +#define LV2_UNITS__mhz LV2_UNITS_PREFIX "mhz" ///< http://lv2plug.in/ns/extensions/units#mhz +#define LV2_UNITS__midiNote LV2_UNITS_PREFIX "midiNote" ///< http://lv2plug.in/ns/extensions/units#midiNote +#define LV2_UNITS__mile LV2_UNITS_PREFIX "mile" ///< http://lv2plug.in/ns/extensions/units#mile +#define LV2_UNITS__min LV2_UNITS_PREFIX "min" ///< http://lv2plug.in/ns/extensions/units#min +#define LV2_UNITS__mm LV2_UNITS_PREFIX "mm" ///< http://lv2plug.in/ns/extensions/units#mm +#define LV2_UNITS__ms LV2_UNITS_PREFIX "ms" ///< http://lv2plug.in/ns/extensions/units#ms +#define LV2_UNITS__name LV2_UNITS_PREFIX "name" ///< http://lv2plug.in/ns/extensions/units#name +#define LV2_UNITS__oct LV2_UNITS_PREFIX "oct" ///< http://lv2plug.in/ns/extensions/units#oct +#define LV2_UNITS__pc LV2_UNITS_PREFIX "pc" ///< http://lv2plug.in/ns/extensions/units#pc +#define LV2_UNITS__prefixConversion LV2_UNITS_PREFIX "prefixConversion" ///< http://lv2plug.in/ns/extensions/units#prefixConversion +#define LV2_UNITS__render LV2_UNITS_PREFIX "render" ///< http://lv2plug.in/ns/extensions/units#render +#define LV2_UNITS__s LV2_UNITS_PREFIX "s" ///< http://lv2plug.in/ns/extensions/units#s +#define LV2_UNITS__semitone12TET LV2_UNITS_PREFIX "semitone12TET" ///< http://lv2plug.in/ns/extensions/units#semitone12TET +#define LV2_UNITS__symbol LV2_UNITS_PREFIX "symbol" ///< http://lv2plug.in/ns/extensions/units#symbol +#define LV2_UNITS__unit LV2_UNITS_PREFIX "unit" ///< http://lv2plug.in/ns/extensions/units#unit + +// clang-format on + +/** + @} +*/ + +#endif /* LV2_UNITS_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.meta.ttl new file mode 100644 index 00000000..a8570469 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.meta.ttl @@ -0,0 +1,154 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix units: . + + + a doap:Project ; + doap:name "LV2 Units" ; + doap:shortdesc "Units for LV2 values." ; + doap:created "2007-02-06" ; + doap:homepage ; + doap:license ; + doap:release [ + doap:revision "5.12" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix outdated port description in documentation." + ] , [ + rdfs:label "Remove overly restrictive domain from units:unit." + ] + ] + ] , [ + doap:revision "5.10" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix non-existent port type in examples." + ] , [ + rdfs:label "Add lv2:Parameter to domain of units:unit." + ] + ] + ] , [ + doap:revision "5.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Remove units:name in favour of rdfs:label." + ] , [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "5.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add unit for audio frames." + ] , [ + rdfs:label "Add header of URI defines." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "5.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make units.ttl a valid OWL 2 DL ontology." + ] , [ + rdfs:label "Define used but undefined resources (units:name, units:render, units:symbol, units:Conversion, units:conversion, units:prefixConversion, units:to, and units:factor)." + ] , [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "5.2" ; + doap:created "2010-10-05" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Convert documentation to HTML and use lv2:documentation." + ] + ] + ] , [ + doap:revision "5.0" ; + doap:created "2010-10-05" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] , [ + rdfs:label "Define used but undefined resources (units:name, units:render, units:symbol, units:Conversion, units:conversion, units:prefixConversion, units:to, and units:factor)." + ] , [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] ; + doap:developer ; + doap:maintainer ; + lv2:documentation """ + +This is a vocabulary for units typically used for control values in audio +processing. + +For example, to say that a gain control is in decibels: + + :::turtle + @prefix units: . + @prefix eg: . + + eg:plugin lv2:port [ + a lv2:ControlPort , lv2:InputPort ; + lv2:index 0 ; + lv2:symbol "gain" ; + lv2:name "Gain" ; + units:unit units:db + ] . + +Using the same form, plugins may also specify one-off units inline, to give +better display hints to hosts: + + :::turtle + eg:plugin lv2:port [ + a lv2:ControlPort , lv2:InputPort ; + lv2:index 0 ; + lv2:symbol "frob" ; + lv2:name "frob level" ; + units:unit [ + a units:Unit ; + rdfs:label "frobnication" ; + units:symbol "fr" ; + units:render "%f f" + ] + ] . + +It is also possible to define conversions between various units, which makes it +possible for hosts to automatically convert between units where possible. The +units defined in this extension include conversion definitions where it makes +sense to do so. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.ttl new file mode 100644 index 00000000..959c0639 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/units/units.ttl @@ -0,0 +1,379 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix units: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Units" ; + rdfs:comment "Units for LV2 values." ; + rdfs:seeAlso , + . + +units:Unit + a rdfs:Class , + owl:Class ; + rdfs:label "Unit" ; + rdfs:comment "A unit for a control value." . + +units:unit + a rdf:Property , + owl:ObjectProperty ; + rdfs:range units:Unit ; + rdfs:label "unit" ; + rdfs:comment "The unit used by the value of a port or parameter." . + +units:render + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "unit format string" ; + rdfs:domain units:Unit ; + rdfs:range xsd:string ; + rdfs:comment """A printf format string for rendering a value (e.g., "%f dB").""" . + +units:symbol + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "unit symbol" ; + rdfs:domain units:Unit ; + rdfs:range xsd:string ; + rdfs:comment """The abbreviated symbol for this unit (e.g., "dB").""" . + +units:Conversion + a rdfs:Class , + owl:Class ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty units:to ; + owl:cardinality 1 ; + rdfs:comment "A conversion MUST have exactly 1 units:to property." + ] ; + rdfs:label "Conversion" ; + rdfs:comment "A conversion from one unit to another." . + +units:conversion + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain units:Unit ; + rdfs:range units:Conversion ; + rdfs:label "conversion" ; + rdfs:comment "A conversion from this unit to another." . + +units:prefixConversion + a rdf:Property , + owl:ObjectProperty ; + rdfs:subPropertyOf units:conversion ; + rdfs:domain units:Unit ; + rdfs:range units:Conversion ; + rdfs:label "prefix conversion" ; + rdfs:comment "A conversion from this unit to another with the same base but a different prefix." . + +units:to + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain units:Conversion ; + rdfs:range units:Unit ; + rdfs:label "conversion target" ; + rdfs:comment "The target unit this conversion converts to." . + +units:factor + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain units:Conversion ; + rdfs:label "conversion factor" ; + rdfs:comment "The factor to multiply the source value by in order to convert to the target unit." . + +units:s + a units:Unit ; + units:conversion [ + units:factor 0.0166666666 ; + units:to units:min + ] ; + rdfs:label "seconds" ; + rdfs:comment "Seconds, the SI base unit for time." ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:ms + ] ; + units:render "%f s" ; + units:symbol "s" . + +units:ms + a units:Unit ; + rdfs:label "milliseconds" ; + rdfs:comment "Milliseconds (thousandths of seconds)." ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:s + ] ; + units:render "%f ms" ; + units:symbol "ms" . + +units:min + a units:Unit ; + units:conversion [ + units:factor 60.0 ; + units:to units:s + ] ; + rdfs:label "minutes" ; + rdfs:comment "Minutes (60s of seconds and 60ths of an hour)." ; + units:render "%f mins" ; + units:symbol "min" . + +units:bar + a units:Unit ; + rdfs:label "bars" ; + rdfs:comment "Musical bars or measures." ; + units:render "%f bars" ; + units:symbol "bars" . + +units:beat + a units:Unit ; + rdfs:label "beats" ; + rdfs:comment "Musical beats." ; + units:render "%f beats" ; + units:symbol "beats" . + +units:frame + a units:Unit ; + rdfs:label "audio frames" ; + rdfs:comment "Audio frames or samples." ; + units:render "%f frames" ; + units:symbol "frames" . + +units:m + a units:Unit ; + units:conversion [ + units:factor 39.37 ; + units:to units:inch + ] ; + rdfs:label "metres" ; + rdfs:comment "Metres, the SI base unit for length." ; + units:prefixConversion [ + units:factor 100 ; + units:to units:cm + ] , [ + units:factor 1000 ; + units:to units:mm + ] , [ + units:factor 0.001 ; + units:to units:km + ] ; + units:render "%f m" ; + units:symbol "m" . + +units:cm + a units:Unit ; + units:conversion [ + units:factor 0.3937 ; + units:to units:inch + ] ; + rdfs:label "centimetres" ; + rdfs:comment "Centimetres (hundredths of metres)." ; + units:prefixConversion [ + units:factor 0.01 ; + units:to units:m + ] , [ + units:factor 10 ; + units:to units:mm + ] , [ + units:factor 0.00001 ; + units:to units:km + ] ; + units:render "%f cm" ; + units:symbol "cm" . + +units:mm + a units:Unit ; + units:conversion [ + units:factor 0.03937 ; + units:to units:inch + ] ; + rdfs:label "millimetres" ; + rdfs:comment "Millimetres (thousandths of metres)." ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:m + ] , [ + units:factor 0.1 ; + units:to units:cm + ] , [ + units:factor 0.000001 ; + units:to units:km + ] ; + units:render "%f mm" ; + units:symbol "mm" . + +units:km + a units:Unit ; + units:conversion [ + units:factor 0.62138818 ; + units:to units:mile + ] ; + rdfs:label "kilometres" ; + rdfs:comment "Kilometres (thousands of metres)." ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:m + ] , [ + units:factor 100000 ; + units:to units:cm + ] , [ + units:factor 1000000 ; + units:to units:mm + ] ; + units:render "%f km" ; + units:symbol "km" . + +units:inch + a units:Unit ; + units:conversion [ + units:factor 0.0254 ; + units:to units:m + ] ; + rdfs:label "inches" ; + rdfs:comment "An inch, defined as exactly 0.0254 metres." ; + units:render "%f\"" ; + units:symbol "in" . + +units:mile + a units:Unit ; + units:conversion [ + units:factor 1609.344 ; + units:to units:m + ] ; + rdfs:label "miles" ; + rdfs:comment "A mile, defined as exactly 1609.344 metres." ; + units:render "%f mi" ; + units:symbol "mi" . + +units:db + a units:Unit ; + rdfs:label "decibels" ; + rdfs:comment "Decibels, a logarithmic relative unit where 0 is unity." ; + units:render "%f dB" ; + units:symbol "dB" . + +units:pc + a units:Unit ; + units:conversion [ + units:factor 0.01 ; + units:to units:coef + ] ; + rdfs:label "percent" ; + rdfs:comment "Percentage, a ratio as a fraction of 100." ; + units:render "%f%%" ; + units:symbol "%" . + +units:coef + a units:Unit ; + units:conversion [ + units:factor 100 ; + units:to units:pc + ] ; + rdfs:label "coefficient" ; + rdfs:comment "A scale coefficient where 1 is unity, or 100 percent." ; + units:render "* %f" ; + units:symbol "" . + +units:hz + a units:Unit ; + rdfs:label "hertz" ; + rdfs:comment "Hertz, or inverse seconds, the SI derived unit for frequency." ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:khz + ] , [ + units:factor 0.000001 ; + units:to units:mhz + ] ; + units:render "%f Hz" ; + units:symbol "Hz" . + +units:khz + a units:Unit ; + rdfs:label "kilohertz" ; + rdfs:comment "Kilohertz (thousands of Hertz)." ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:hz + ] , [ + units:factor 0.001 ; + units:to units:mhz + ] ; + units:render "%f kHz" ; + units:symbol "kHz" . + +units:mhz + a units:Unit ; + rdfs:label "megahertz" ; + rdfs:comment "Megahertz (millions of Hertz)." ; + units:prefixConversion [ + units:factor 1000000 ; + units:to units:hz + ] , [ + units:factor 0.001 ; + units:to units:khz + ] ; + units:render "%f MHz" ; + units:symbol "MHz" . + +units:bpm + a units:Unit ; + rdfs:label "beats per minute" ; + rdfs:comment "Beats Per Minute (BPM), the standard unit for musical tempo." ; + units:prefixConversion [ + units:factor 0.0166666666 ; + units:to units:hz + ] ; + units:render "%f BPM" ; + units:symbol "BPM" . + +units:oct + a units:Unit ; + units:conversion [ + units:factor 12.0 ; + units:to units:semitone12TET + ] ; + rdfs:label "octaves" ; + rdfs:comment "Octaves, relative musical pitch where +1 octave doubles the frequency." ; + units:render "%f octaves" ; + units:symbol "oct" . + +units:cent + a units:Unit ; + units:conversion [ + units:factor 0.01 ; + units:to units:semitone12TET + ] ; + rdfs:label "cents" ; + rdfs:comment "Cents (hundredths of semitones)." ; + units:render "%f ct" ; + units:symbol "ct" . + +units:semitone12TET + a units:Unit ; + units:conversion [ + units:factor 0.083333333 ; + units:to units:oct + ] ; + rdfs:label "semitones" ; + rdfs:comment "A semitone in the 12-tone equal temperament scale." ; + units:render "%f semi" ; + units:symbol "semi" . + +units:degree + a units:Unit ; + rdfs:label "degrees" ; + rdfs:comment "An angle where 360 degrees is one full rotation." ; + units:render "%f deg" ; + units:symbol "deg" . + +units:midiNote + a units:Unit ; + rdfs:label "MIDI note" ; + rdfs:comment "A MIDI note number." ; + units:render "MIDI note %d" ; + units:symbol "note" . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/manifest.ttl new file mode 100644 index 00000000..a64e4fbd --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h new file mode 100644 index 00000000..47cde1cd --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.h @@ -0,0 +1,121 @@ +/* + Copyright 2008-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_URI_MAP_H +#define LV2_URI_MAP_H + +/** + @defgroup uri-map URI Map + @ingroup lv2 + + A feature for mapping URIs to integers. + + This extension defines a simple mechanism for plugins to map URIs to + integers, usually for performance reasons (e.g. processing events typed by + URIs in real time). The expected use case is for plugins to map URIs to + integers for things they 'understand' at instantiation time, and store those + values for use in the audio thread without doing any string comparison. + This allows the extensibility of RDF with the performance of integers (or + centrally defined enumerations). + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_URI_MAP_URI "http://lv2plug.in/ns/ext/uri-map" ///< http://lv2plug.in/ns/ext/uri-map +#define LV2_URI_MAP_PREFIX LV2_URI_MAP_URI "#" ///< http://lv2plug.in/ns/ext/uri-map# + +// clang-format on + +#include "lv2/core/attributes.h" + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +LV2_DISABLE_DEPRECATION_WARNINGS + +/** + Opaque pointer to host data. +*/ +LV2_DEPRECATED +typedef void* LV2_URI_Map_Callback_Data; + +/** + URI Map Feature. + + To support this feature the host must pass an LV2_Feature struct to the + plugin's instantiate method with URI "http://lv2plug.in/ns/ext/uri-map" + and data pointed to an instance of this struct. +*/ +LV2_DEPRECATED +typedef struct { + /** + Opaque pointer to host data. + + The plugin MUST pass this to any call to functions in this struct. + Otherwise, it must not be interpreted in any way. + */ + LV2_URI_Map_Callback_Data callback_data; + + /** + Get the numeric ID of a URI from the host. + + @param callback_data Must be the callback_data member of this struct. + @param map The 'context' of this URI. Certain extensions may define a + URI that must be passed here with certain restrictions on the return + value (e.g. limited range). This value may be NULL if the plugin needs + an ID for a URI in general. Extensions SHOULD NOT define a context + unless there is a specific need to do so, e.g. to restrict the range of + the returned value. + @param uri The URI to be mapped to an integer ID. + + This function is referentially transparent; any number of calls with the + same arguments is guaranteed to return the same value over the life of a + plugin instance (though the same URI may return different values with a + different map parameter). However, this function is not necessarily very + fast: plugins SHOULD cache any IDs they might need in performance + critical situations. + + The return value 0 is reserved and indicates that an ID for that URI + could not be created for whatever reason. Extensions MAY define more + precisely what this means in a certain context, but in general plugins + SHOULD handle this situation as gracefully as possible. However, hosts + SHOULD NOT return 0 from this function in non-exceptional circumstances + (e.g. the URI map SHOULD be dynamic). Hosts that statically support only + a fixed set of URIs should not expect plugins to function correctly. + */ + uint32_t (*uri_to_id)(LV2_URI_Map_Callback_Data callback_data, + const char* map, + const char* uri); +} LV2_URI_Map_Feature; + +LV2_RESTORE_WARNINGS + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_URI_MAP_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.meta.ttl new file mode 100644 index 00000000..acd1c267 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.meta.ttl @@ -0,0 +1,72 @@ +@prefix lv2: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix rdfs: . + + + a doap:Project ; + doap:maintainer ; + doap:created "2008-00-00" ; + doap:developer , + ; + doap:license ; + doap:name "LV2 URI Map" ; + doap:shortdesc "A feature for mapping URIs to integers." ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Deprecate uri-map in favour of urid." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Mark up documentation in HTML using lv2:documentation." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-18" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension is deprecated. New implementations +should use [LV2 URID](urid.html) instead. + +This extension defines a simple mechanism for plugins to map URIs to integers, +usually for performance reasons (e.g. processing events typed by URIs in real +time). The expected use case is for plugins to map URIs to integers for things +they 'understand' at instantiation time, and store those values for use in the +audio thread without doing any string comparison. This allows the +extensibility of RDF with the performance of integers (or centrally defined +enumerations). + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.ttl new file mode 100644 index 00000000..bfb0d0b6 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/uri-map/uri-map.ttl @@ -0,0 +1,14 @@ +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix umap: . + + + a lv2:Feature ; + owl:deprecated true ; + rdfs:label "LV2 URI Map" ; + rdfs:comment "A feature for mapping URIs to integers." ; + rdfs:seeAlso , + . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/manifest.ttl new file mode 100644 index 00000000..772e2b6c --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h new file mode 100644 index 00000000..b537d14e --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.h @@ -0,0 +1,140 @@ +/* + Copyright 2008-2016 David Robillard + Copyright 2011 Gabriel M. Beddingfield + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_URID_H +#define LV2_URID_H + +/** + @defgroup urid URID + @ingroup lv2 + + Features for mapping URIs to and from integers. + + See for details. + + @{ +*/ + +// clang-format off + +#define LV2_URID_URI "http://lv2plug.in/ns/ext/urid" ///< http://lv2plug.in/ns/ext/urid +#define LV2_URID_PREFIX LV2_URID_URI "#" ///< http://lv2plug.in/ns/ext/urid# + +#define LV2_URID__map LV2_URID_PREFIX "map" ///< http://lv2plug.in/ns/ext/urid#map +#define LV2_URID__unmap LV2_URID_PREFIX "unmap" ///< http://lv2plug.in/ns/ext/urid#unmap + +#define LV2_URID_MAP_URI LV2_URID__map ///< Legacy +#define LV2_URID_UNMAP_URI LV2_URID__unmap ///< Legacy + +// clang-format on + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Opaque pointer to host data for LV2_URID_Map. +*/ +typedef void* LV2_URID_Map_Handle; + +/** + Opaque pointer to host data for LV2_URID_Unmap. +*/ +typedef void* LV2_URID_Unmap_Handle; + +/** + URI mapped to an integer. +*/ +typedef uint32_t LV2_URID; + +/** + URID Map Feature (LV2_URID__map) +*/ +typedef struct { + /** + Opaque pointer to host data. + + This MUST be passed to map_uri() whenever it is called. + Otherwise, it must not be interpreted in any way. + */ + LV2_URID_Map_Handle handle; + + /** + Get the numeric ID of a URI. + + If the ID does not already exist, it will be created. + + This function is referentially transparent; any number of calls with the + same arguments is guaranteed to return the same value over the life of a + plugin instance. Note, however, that several URIs MAY resolve to the + same ID if the host considers those URIs equivalent. + + This function is not necessarily very fast or RT-safe: plugins SHOULD + cache any IDs they might need in performance critical situations. + + The return value 0 is reserved and indicates that an ID for that URI + could not be created for whatever reason. However, hosts SHOULD NOT + return 0 from this function in non-exceptional circumstances (i.e. the + URI map SHOULD be dynamic). + + @param handle Must be the callback_data member of this struct. + @param uri The URI to be mapped to an integer ID. + */ + LV2_URID (*map)(LV2_URID_Map_Handle handle, const char* uri); +} LV2_URID_Map; + +/** + URI Unmap Feature (LV2_URID__unmap) +*/ +typedef struct { + /** + Opaque pointer to host data. + + This MUST be passed to unmap() whenever it is called. + Otherwise, it must not be interpreted in any way. + */ + LV2_URID_Unmap_Handle handle; + + /** + Get the URI for a previously mapped numeric ID. + + Returns NULL if `urid` is not yet mapped. Otherwise, the corresponding + URI is returned in a canonical form. This MAY not be the exact same + string that was originally passed to LV2_URID_Map::map(), but it MUST be + an identical URI according to the URI syntax specification (RFC3986). A + non-NULL return for a given `urid` will always be the same for the life + of the plugin. Plugins that intend to perform string comparison on + unmapped URIs SHOULD first canonicalise URI strings with a call to + map_uri() followed by a call to unmap_uri(). + + @param handle Must be the callback_data member of this struct. + @param urid The ID to be mapped back to the URI string. + */ + const char* (*unmap)(LV2_URID_Unmap_Handle handle, LV2_URID urid); +} LV2_URID_Unmap; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_URID_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.meta.ttl new file mode 100644 index 00000000..b2a74fa0 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.meta.ttl @@ -0,0 +1,84 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix urid: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 URID" ; + doap:shortdesc "Features for mapping URIs to and from integers." ; + doap:created "2011-07-22" ; + doap:developer ; + doap:maintainer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix typo in urid:unmap documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add feature struct names." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a simple mechanism for plugins to map URIs to and from +integers. This is usually used for performance reasons, for example for +processing events with URI types in real-time audio code). Typically, plugins +map URIs to integers for things they "understand" at instantiation time, and +store those values for use in the audio thread without doing any string +comparison. This allows for the extensibility of RDF but with the performance +of integers. + +This extension is intended as an improved and simplified replacement for the +[uri-map](uri-map.html) extension, since the `map` context parameter there has +proven problematic. This extension is functionally equivalent to the uri-map +extension with a NULL context. New implementations are encouraged to use this +extension for URI mapping. + +"""^^lv2:Markdown . + +urid:map + lv2:documentation """ + +To support this feature, the host must pass an LV2_Feature to +LV2_Descriptor::instantiate() with URI LV2_URID__map and data pointed to an +instance of LV2_URID_Map. + +"""^^lv2:Markdown . + +urid:unmap + lv2:documentation """ + +To support this feature, the host must pass an LV2_Feature to +LV2_Descriptor::instantiate() with URI LV2_URID__unmap and data pointed to an +instance of LV2_URID_Unmap. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.ttl new file mode 100644 index 00000000..2c44b561 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/urid/urid.ttl @@ -0,0 +1,22 @@ +@prefix lv2: . +@prefix owl: . +@prefix rdfs: . +@prefix urid: . + + + a owl:Ontology ; + rdfs:label "LV2 URID" ; + rdfs:comment "Features for mapping URIs to and from integers." ; + rdfs:seeAlso , + . + +urid:map + a lv2:Feature ; + rdfs:label "map" ; + rdfs:comment "A feature to map URI strings to integer URIDs." . + +urid:unmap + a lv2:Feature ; + rdfs:label "unmap" ; + rdfs:comment "A feature to unmap URIDs back to strings." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/manifest.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/manifest.ttl new file mode 100644 index 00000000..692720db --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/manifest.ttl @@ -0,0 +1,9 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 2 ; + rdfs:seeAlso . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h new file mode 100644 index 00000000..4fd89f9f --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.h @@ -0,0 +1,183 @@ +/* + Copyright 2012-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_WORKER_H +#define LV2_WORKER_H + +/** + @defgroup worker Worker + @ingroup lv2 + + Support for non-realtime plugin operations. + + See for details. + + @{ +*/ + +#include "lv2/core/lv2.h" + +#include + +// clang-format off + +#define LV2_WORKER_URI "http://lv2plug.in/ns/ext/worker" ///< http://lv2plug.in/ns/ext/worker +#define LV2_WORKER_PREFIX LV2_WORKER_URI "#" ///< http://lv2plug.in/ns/ext/worker# + +#define LV2_WORKER__interface LV2_WORKER_PREFIX "interface" ///< http://lv2plug.in/ns/ext/worker#interface +#define LV2_WORKER__schedule LV2_WORKER_PREFIX "schedule" ///< http://lv2plug.in/ns/ext/worker#schedule + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Status code for worker functions. +*/ +typedef enum { + LV2_WORKER_SUCCESS = 0, /**< Completed successfully. */ + LV2_WORKER_ERR_UNKNOWN = 1, /**< Unknown error. */ + LV2_WORKER_ERR_NO_SPACE = 2 /**< Failed due to lack of space. */ +} LV2_Worker_Status; + +/** Opaque handle for LV2_Worker_Interface::work(). */ +typedef void* LV2_Worker_Respond_Handle; + +/** + A function to respond to run() from the worker method. + + The `data` MUST be safe for the host to copy and later pass to + work_response(), and the host MUST guarantee that it will be eventually + passed to work_response() if this function returns LV2_WORKER_SUCCESS. +*/ +typedef LV2_Worker_Status (*LV2_Worker_Respond_Function)( + LV2_Worker_Respond_Handle handle, + uint32_t size, + const void* data); + +/** + Plugin Worker Interface. + + This is the interface provided by the plugin to implement a worker method. + The plugin's extension_data() method should return an LV2_Worker_Interface + when called with LV2_WORKER__interface as its argument. +*/ +typedef struct { + /** + The worker method. This is called by the host in a non-realtime context + as requested, possibly with an arbitrary message to handle. + + A response can be sent to run() using `respond`. The plugin MUST NOT + make any assumptions about which thread calls this method, except that + there are no real-time requirements and only one call may be executed at + a time. That is, the host MAY call this method from any non-real-time + thread, but MUST NOT make concurrent calls to this method from several + threads. + + @param instance The LV2 instance this is a method on. + @param respond A function for sending a response to run(). + @param handle Must be passed to `respond` if it is called. + @param size The size of `data`. + @param data Data from run(), or NULL. + */ + LV2_Worker_Status (*work)(LV2_Handle instance, + LV2_Worker_Respond_Function respond, + LV2_Worker_Respond_Handle handle, + uint32_t size, + const void* data); + + /** + Handle a response from the worker. This is called by the host in the + run() context when a response from the worker is ready. + + @param instance The LV2 instance this is a method on. + @param size The size of `body`. + @param body Message body, or NULL. + */ + LV2_Worker_Status (*work_response)(LV2_Handle instance, + uint32_t size, + const void* body); + + /** + Called when all responses for this cycle have been delivered. + + Since work_response() may be called after run() finished, this provides + a hook for code that must run after the cycle is completed. + + This field may be NULL if the plugin has no use for it. Otherwise, the + host MUST call it after every run(), regardless of whether or not any + responses were sent that cycle. + */ + LV2_Worker_Status (*end_run)(LV2_Handle instance); +} LV2_Worker_Interface; + +/** Opaque handle for LV2_Worker_Schedule. */ +typedef void* LV2_Worker_Schedule_Handle; + +/** + Schedule Worker Host Feature. + + The host passes this feature to provide a schedule_work() function, which + the plugin can use to schedule a worker call from run(). +*/ +typedef struct { + /** + Opaque host data. + */ + LV2_Worker_Schedule_Handle handle; + + /** + Request from run() that the host call the worker. + + This function is in the audio threading class. It should be called from + run() to request that the host call the work() method in a non-realtime + context with the given arguments. + + This function is always safe to call from run(), but it is not + guaranteed that the worker is actually called from a different thread. + In particular, when free-wheeling (for example, during offline + rendering), the worker may be executed immediately. This allows + single-threaded processing with sample accuracy and avoids timing + problems when run() is executing much faster or slower than real-time. + + Plugins SHOULD be written in such a way that if the worker runs + immediately, and responses from the worker are delivered immediately, + the effect of the work takes place immediately with sample accuracy. + + The `data` MUST be safe for the host to copy and later pass to work(), + and the host MUST guarantee that it will be eventually passed to work() + if this function returns LV2_WORKER_SUCCESS. + + @param handle The handle field of this struct. + @param size The size of `data`. + @param data Message to pass to work(), or NULL. + */ + LV2_Worker_Status (*schedule_work)(LV2_Worker_Schedule_Handle handle, + uint32_t size, + const void* data); +} LV2_Worker_Schedule; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} +*/ + +#endif /* LV2_WORKER_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.meta.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.meta.ttl new file mode 100644 index 00000000..2fc51bc8 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.meta.ttl @@ -0,0 +1,82 @@ +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix work: . + + + a doap:Project ; + doap:name "LV2 Worker" ; + doap:shortdesc "Support for doing non-realtime work in plugins." ; + doap:created "2012-03-22" ; + doap:developer ; + doap:release [ + doap:revision "1.2" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension allows plugins to schedule work that must be performed in +another thread. Plugins can use this interface to safely perform work that is +not real-time safe, and receive the result in the run context. The details of +threading are managed by the host, allowing plugins to be simple and portable +while using resources more efficiently. + +This interface is designed to gracefully support single-threaded synchronous +execution, which allows the same code to work with sample accuracy for offline +rendering. For example, a sampler plugin may schedule a sample to be loaded +from disk in another thread. During live execution, the host will call the +plugin's work method from another thread, and deliver the result to the audio +thread when it is finished. However, during offline export, the +scheduled load would be executed immediately in the same thread. This +enables reproducible offline rendering, where any changes affect the output +immediately regardless of how long the work takes to execute. + +"""^^lv2:Markdown . + +work:interface + lv2:documentation """ + +The work interface provided by a plugin, LV2_Worker_Interface. + + :::turtle + + @prefix work: . + + + a lv2:Plugin ; + lv2:extensionData work:interface . + +"""^^lv2:Markdown . + +work:schedule + lv2:documentation """ + +The work scheduling feature provided by a host, LV2_Worker_Schedule. + +If the host passes this feature to LV2_Descriptor::instantiate, the plugin MAY +use it to schedule work in the audio thread, and MUST NOT call it in any other +context. Hosts MAY pass this feature to other functions as well, in which case +the plugin MAY use it to schedule work in the calling context. The plugin MUST +NOT assume any relationship between different schedule features. + +"""^^lv2:Markdown . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.ttl b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.ttl new file mode 100644 index 00000000..cb8a81a7 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/worker/worker.ttl @@ -0,0 +1,25 @@ +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix work: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Worker" ; + rdfs:comment "Support for doing non-realtime work in plugins." ; + owl:imports ; + rdfs:seeAlso , + . + +work:interface + a lv2:ExtensionData ; + rdfs:label "work interface" ; + rdfs:comment "The work interface provided by a plugin." . + +work:schedule + a lv2:Feature ; + rdfs:label "work schedule" ; + rdfs:comment "The work scheduling feature provided by a host." . + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/COPYING b/modules/juce_audio_processors/format_types/LV2_SDK/serd/COPYING new file mode 100644 index 00000000..9748bb93 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/COPYING @@ -0,0 +1,13 @@ +Copyright 2011-2021 David Robillard + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h new file mode 100644 index 00000000..32488e18 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/serd/serd.h @@ -0,0 +1,1059 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/// @file serd.h API for Serd, a lightweight RDF syntax library + +#ifndef SERD_SERD_H +#define SERD_SERD_H + +#include +#include +#include +#include +#include + +#if defined(_WIN32) && !defined(SERD_STATIC) && defined(SERD_INTERNAL) +# define SERD_API __declspec(dllexport) +#elif defined(_WIN32) && !defined(SERD_STATIC) +# define SERD_API __declspec(dllimport) +#elif defined(__GNUC__) +# define SERD_API __attribute__((visibility("default"))) +#else +# define SERD_API +#endif + +#ifdef __GNUC__ +# define SERD_PURE_FUNC __attribute__((pure)) +# define SERD_CONST_FUNC __attribute__((const)) +#else +# define SERD_PURE_FUNC +# define SERD_CONST_FUNC +#endif + +#if defined(__clang__) && __clang_major__ >= 7 +# define SERD_NONNULL _Nonnull +# define SERD_NULLABLE _Nullable +# define SERD_ALLOCATED _Null_unspecified +#else +# define SERD_NONNULL +# define SERD_NULLABLE +# define SERD_ALLOCATED +#endif + +#define SERD_PURE_API \ + SERD_API \ + SERD_PURE_FUNC + +#define SERD_CONST_API \ + SERD_API \ + SERD_CONST_FUNC + +#ifndef SERD_DISABLE_DEPRECATED +# if defined(__clang__) && __clang_major__ >= 7 +# define SERD_DEPRECATED_BY(rep) __attribute__((deprecated("", rep))) +# elif defined(__GNUC__) && __GNUC__ > 4 +# define SERD_DEPRECATED_BY(rep) __attribute__((deprecated("Use " rep))) +# elif defined(__GNUC__) +# define SERD_DEPRECATED_BY(rep) __attribute__((deprecated)) +# else +# define SERD_DEPRECATED_BY(rep) +# endif +#endif + +#ifdef __cplusplus +extern "C" { +# if defined(__GNUC__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" +# endif +#endif + +/** + @defgroup serd Serd C API + This is the complete public C API of serd. + @{ +*/ + +/// Lexical environment for relative URIs or CURIEs (base URI and namespaces) +typedef struct SerdEnvImpl SerdEnv; + +/// Streaming parser that reads a text stream and writes to a statement sink +typedef struct SerdReaderImpl SerdReader; + +/// Streaming serialiser that writes a text stream as statements are pushed +typedef struct SerdWriterImpl SerdWriter; + +/// Return status code +typedef enum { + SERD_SUCCESS, ///< No error + SERD_FAILURE, ///< Non-fatal failure + SERD_ERR_UNKNOWN, ///< Unknown error + SERD_ERR_BAD_SYNTAX, ///< Invalid syntax + SERD_ERR_BAD_ARG, ///< Invalid argument + SERD_ERR_NOT_FOUND, ///< Not found + SERD_ERR_ID_CLASH, ///< Encountered clashing blank node IDs + SERD_ERR_BAD_CURIE, ///< Invalid CURIE (e.g. prefix does not exist) + SERD_ERR_INTERNAL ///< Unexpected internal error (should not happen) +} SerdStatus; + +/// RDF syntax type +typedef enum { + SERD_TURTLE = 1, ///< Terse triples http://www.w3.org/TR/turtle + SERD_NTRIPLES = 2, ///< Line-based triples http://www.w3.org/TR/n-triples/ + SERD_NQUADS = 3, ///< Line-based quads http://www.w3.org/TR/n-quads/ + SERD_TRIG = 4 ///< Terse quads http://www.w3.org/TR/trig/ +} SerdSyntax; + +/// Flags indicating inline abbreviation information for a statement +typedef enum { + SERD_EMPTY_S = 1u << 1u, ///< Empty blank node subject + SERD_EMPTY_O = 1u << 2u, ///< Empty blank node object + SERD_ANON_S_BEGIN = 1u << 3u, ///< Start of anonymous subject + SERD_ANON_O_BEGIN = 1u << 4u, ///< Start of anonymous object + SERD_ANON_CONT = 1u << 5u, ///< Continuation of anonymous node + SERD_LIST_S_BEGIN = 1u << 6u, ///< Start of list subject + SERD_LIST_O_BEGIN = 1u << 7u, ///< Start of list object + SERD_LIST_CONT = 1u << 8u ///< Continuation of list +} SerdStatementFlag; + +/// Bitwise OR of SerdStatementFlag values +typedef uint32_t SerdStatementFlags; + +/** + Type of a node. + + An RDF node, in the abstract sense, can be either a resource, literal, or a + blank. This type is more precise, because syntactically there are two ways + to refer to a resource (by URI or CURIE). + + There are also two ways to refer to a blank node in syntax (by ID or + anonymously), but this is handled by statement flags rather than distinct + node types. +*/ +typedef enum { + /** + The type of a nonexistent node. + + This type is useful as a sentinel, but is never emitted by the reader. + */ + SERD_NOTHING = 0, + + /** + Literal value. + + A literal optionally has either a language, or a datatype (not both). + */ + SERD_LITERAL = 1, + + /** + URI (absolute or relative). + + Value is an unquoted URI string, which is either a relative reference + with respect to the current base URI (e.g. "foo/bar"), or an absolute + URI (e.g. "http://example.org/foo"). + @see [RFC3986](http://tools.ietf.org/html/rfc3986) + */ + SERD_URI = 2, + + /** + CURIE, a shortened URI. + + Value is an unquoted CURIE string relative to the current environment, + e.g. "rdf:type". @see [CURIE Syntax 1.0](http://www.w3.org/TR/curie) + */ + SERD_CURIE = 3, + + /** + A blank node. + + Value is a blank node ID without any syntactic prefix, like "id3", which + is meaningful only within this serialisation. @see [RDF 1.1 + Turtle](http://www.w3.org/TR/turtle/#grammar-production-BLANK_NODE_LABEL) + */ + SERD_BLANK = 4 +} SerdType; + +/// Flags indicating certain string properties relevant to serialisation +typedef enum { + SERD_HAS_NEWLINE = 1u << 0u, ///< Contains line breaks ('\\n' or '\\r') + SERD_HAS_QUOTE = 1u << 1u ///< Contains quotes ('"') +} SerdNodeFlag; + +/// Bitwise OR of SerdNodeFlag values +typedef uint32_t SerdNodeFlags; + +/// A syntactic RDF node +typedef struct { + const uint8_t* SERD_NULLABLE buf; ///< Value string + size_t n_bytes; ///< Size in bytes (excluding null) + size_t n_chars; ///< String length (excluding null) + SerdNodeFlags flags; ///< Node flags (string properties) + SerdType type; ///< Node type +} SerdNode; + +/// An unterminated string fragment +typedef struct { + const uint8_t* SERD_NULLABLE buf; ///< Start of chunk + size_t len; ///< Length of chunk in bytes +} SerdChunk; + +/// An error description +typedef struct { + SerdStatus status; ///< Error code + const uint8_t* SERD_NULLABLE filename; ///< File with error + unsigned line; ///< Line in file with error or 0 + unsigned col; ///< Column in file with error + const char* SERD_NONNULL fmt; ///< Printf-style format string + va_list* SERD_NONNULL args; ///< Arguments for fmt +} SerdError; + +/** + A parsed URI + + This struct directly refers to chunks in other strings, it does not own any + memory itself. Thus, URIs can be parsed and/or resolved against a base URI + in-place without allocating memory. +*/ +typedef struct { + SerdChunk scheme; ///< Scheme + SerdChunk authority; ///< Authority + SerdChunk path_base; ///< Path prefix if relative + SerdChunk path; ///< Path suffix + SerdChunk query; ///< Query + SerdChunk fragment; ///< Fragment +} SerdURI; + +/** + Syntax style options. + + These flags allow more precise control of writer output style. Note that + some options are only supported for some syntaxes, for example, NTriples + does not support abbreviation and is always ASCII. +*/ +typedef enum { + SERD_STYLE_ABBREVIATED = 1u << 0u, ///< Abbreviate triples when possible. + SERD_STYLE_ASCII = 1u << 1u, ///< Escape all non-ASCII characters. + SERD_STYLE_RESOLVED = 1u << 2u, ///< Resolve URIs against base URI. + SERD_STYLE_CURIED = 1u << 3u, ///< Shorten URIs into CURIEs. + SERD_STYLE_BULK = 1u << 4u, ///< Write output in pages. +} SerdStyle; + +/** + Free memory allocated by Serd + + This function exists because some systems require memory allocated by a + library to be freed by code in the same library. It is otherwise equivalent + to the standard C free() function. +*/ +SERD_API +void +serd_free(void* SERD_NULLABLE ptr); + +/** + @defgroup serd_string String Utilities + @{ +*/ + +/// Return a string describing a status code +SERD_CONST_API +const uint8_t* SERD_NONNULL +serd_strerror(SerdStatus status); + +/** + Measure a UTF-8 string. + + @return Length of `str` in characters (except NULL). + @param str A null-terminated UTF-8 string. + @param n_bytes (Output) Set to the size of `str` in bytes (except NULL). + @param flags (Output) Set to the applicable flags. +*/ +SERD_API +size_t +serd_strlen(const uint8_t* SERD_NONNULL str, + size_t* SERD_NULLABLE n_bytes, + SerdNodeFlags* SERD_NULLABLE flags); + +/** + Parse a string to a double. + + The API of this function is identical to the standard C strtod function, + except this function is locale-independent and always matches the lexical + format used in the Turtle grammar (the decimal point is always "."). +*/ +SERD_API +double +serd_strtod(const char* SERD_NONNULL str, + char* SERD_NONNULL* SERD_NULLABLE endptr); + +/** + Decode a base64 string. + + This function can be used to deserialise a blob node created with + serd_node_new_blob(). + + @param str Base64 string to decode. + @param len The length of `str`. + @param size Set to the size of the returned blob in bytes. + @return A newly allocated blob which must be freed with serd_free(). +*/ +SERD_API +void* SERD_ALLOCATED +serd_base64_decode(const uint8_t* SERD_NONNULL str, + size_t len, + size_t* SERD_NONNULL size); + +/** + @} + @defgroup serd_streams Byte Streams + @{ +*/ + +/** + Function to detect I/O stream errors. + + Identical semantics to `ferror`. + + @return Non-zero if `stream` has encountered an error. +*/ +typedef int (*SerdStreamErrorFunc)(void* SERD_NONNULL stream); + +/** + Source function for raw string input. + + Identical semantics to `fread`, but may set errno for more informative error + reporting than supported by SerdStreamErrorFunc. + + @param buf Output buffer. + @param size Size of a single element of data in bytes (always 1). + @param nmemb Number of elements to read. + @param stream Stream to read from (FILE* for fread). + @return Number of elements (bytes) read. +*/ +typedef size_t (*SerdSource)(void* SERD_NONNULL buf, + size_t size, + size_t nmemb, + void* SERD_NONNULL stream); + +/// Sink function for raw string output +typedef size_t (*SerdSink)(const void* SERD_NONNULL buf, + size_t len, + void* SERD_NONNULL stream); + +/** + @} + @defgroup serd_uri URI + @{ +*/ + +static const SerdURI SERD_URI_NULL = + {{NULL, 0}, {NULL, 0}, {NULL, 0}, {NULL, 0}, {NULL, 0}, {NULL, 0}}; + +#ifndef SERD_DISABLE_DEPRECATED + +/** + Return the local path for `uri`, or NULL if `uri` is not a file URI. + Note this (inappropriately named) function only removes the file scheme if + necessary, and returns `uri` unmodified if it is an absolute path. Percent + encoding and other issues are not handled, to properly convert a file URI to + a path, use serd_file_uri_parse(). +*/ +SERD_API +SERD_DEPRECATED_BY("serd_file_uri_parse") +const uint8_t* SERD_NULLABLE +serd_uri_to_path(const uint8_t* SERD_NONNULL uri); + +#endif + +/** + Get the unescaped path and hostname from a file URI. + + The returned path and `*hostname` must be freed with serd_free(). + + @param uri A file URI. + @param hostname If non-NULL, set to the hostname, if present. + @return The path component of the URI. +*/ +SERD_API +uint8_t* SERD_NULLABLE +serd_file_uri_parse(const uint8_t* SERD_NONNULL uri, + uint8_t* SERD_NONNULL* SERD_NULLABLE hostname); + +/// Return true iff `utf8` starts with a valid URI scheme +SERD_PURE_API +bool +serd_uri_string_has_scheme(const uint8_t* SERD_NULLABLE utf8); + +/// Parse `utf8`, writing result to `out` +SERD_API +SerdStatus +serd_uri_parse(const uint8_t* SERD_NONNULL utf8, SerdURI* SERD_NONNULL out); + +/** + Set target `t` to reference `r` resolved against `base`. + + @see [RFC3986 5.2.2](http://tools.ietf.org/html/rfc3986#section-5.2.2) +*/ +SERD_API +void +serd_uri_resolve(const SerdURI* SERD_NONNULL r, + const SerdURI* SERD_NONNULL base, + SerdURI* SERD_NONNULL t); + +/// Serialise `uri` with a series of calls to `sink` +SERD_API +size_t +serd_uri_serialise(const SerdURI* SERD_NONNULL uri, + SerdSink SERD_NONNULL sink, + void* SERD_NONNULL stream); + +/** + Serialise `uri` relative to `base` with a series of calls to `sink` + + The `uri` is written as a relative URI iff if it a child of `base` and + `root`. The optional `root` parameter must be a prefix of `base` and can be + used keep up-references ("../") within a certain namespace. +*/ +SERD_API +size_t +serd_uri_serialise_relative(const SerdURI* SERD_NONNULL uri, + const SerdURI* SERD_NULLABLE base, + const SerdURI* SERD_NULLABLE root, + SerdSink SERD_NONNULL sink, + void* SERD_NONNULL stream); + +/** + @} + @defgroup serd_node Node + @{ +*/ + +static const SerdNode SERD_NODE_NULL = {NULL, 0, 0, 0, SERD_NOTHING}; + +/** + Make a (shallow) node from `str`. + + This measures, but does not copy, `str`. No memory is allocated. +*/ +SERD_API +SerdNode +serd_node_from_string(SerdType type, const uint8_t* SERD_NULLABLE str); + +/** + Make a (shallow) node from a prefix of `str`. + + This measures, but does not copy, `str`. No memory is allocated. + Note that the returned node may not be null terminated. +*/ +SERD_API +SerdNode +serd_node_from_substring(SerdType type, + const uint8_t* SERD_NULLABLE str, + size_t len); + +/// Simple wrapper for serd_node_new_uri() to resolve a URI node +SERD_API +SerdNode +serd_node_new_uri_from_node(const SerdNode* SERD_NONNULL uri_node, + const SerdURI* SERD_NULLABLE base, + SerdURI* SERD_NULLABLE out); + +/// Simple wrapper for serd_node_new_uri() to resolve a URI string +SERD_API +SerdNode +serd_node_new_uri_from_string(const uint8_t* SERD_NULLABLE str, + const SerdURI* SERD_NULLABLE base, + SerdURI* SERD_NULLABLE out); + +/** + Create a new file URI node from a file system path and optional hostname. + + Backslashes in Windows paths will be converted and '%' will always be + percent encoded. If `escape` is true, all other invalid characters will be + percent encoded as well. + + If `path` is relative, `hostname` is ignored. + If `out` is not NULL, it will be set to the parsed URI. +*/ +SERD_API +SerdNode +serd_node_new_file_uri(const uint8_t* SERD_NONNULL path, + const uint8_t* SERD_NULLABLE hostname, + SerdURI* SERD_NULLABLE out, + bool escape); + +/** + Create a new node by serialising `uri` into a new string. + + @param uri The URI to serialise. + + @param base Base URI to resolve `uri` against (or NULL for no resolution). + + @param out Set to the parsing of the new URI (i.e. points only to + memory owned by the new returned node). +*/ +SERD_API +SerdNode +serd_node_new_uri(const SerdURI* SERD_NONNULL uri, + const SerdURI* SERD_NULLABLE base, + SerdURI* SERD_NULLABLE out); + +/** + Create a new node by serialising `uri` into a new relative URI. + + @param uri The URI to serialise. + + @param base Base URI to make `uri` relative to, if possible. + + @param root Root URI for resolution (see serd_uri_serialise_relative()). + + @param out Set to the parsing of the new URI (i.e. points only to + memory owned by the new returned node). +*/ +SERD_API +SerdNode +serd_node_new_relative_uri(const SerdURI* SERD_NONNULL uri, + const SerdURI* SERD_NULLABLE base, + const SerdURI* SERD_NULLABLE root, + SerdURI* SERD_NULLABLE out); + +/** + Create a new node by serialising `d` into an xsd:decimal string + + The resulting node will always contain a `.', start with a digit, and end + with a digit (i.e. will have a leading and/or trailing `0' if necessary). + It will never be in scientific notation. A maximum of `frac_digits` digits + will be written after the decimal point, but trailing zeros will + automatically be omitted (except one if `d` is a round integer). + + Note that about 16 and 8 fractional digits are required to precisely + represent a double and float, respectively. + + @param d The value for the new node. + @param frac_digits The maximum number of digits after the decimal place. +*/ +SERD_API +SerdNode +serd_node_new_decimal(double d, unsigned frac_digits); + +/// Create a new node by serialising `i` into an xsd:integer string +SERD_API +SerdNode +serd_node_new_integer(int64_t i); + +/** + Create a node by serialising `buf` into an xsd:base64Binary string + + This function can be used to make a serialisable node out of arbitrary + binary data, which can be decoded using serd_base64_decode(). + + @param buf Raw binary input data. + @param size Size of `buf`. + @param wrap_lines Wrap lines at 76 characters to conform to RFC 2045. +*/ +SERD_API +SerdNode +serd_node_new_blob(const void* SERD_NONNULL buf, size_t size, bool wrap_lines); + +/** + Make a deep copy of `node`. + + @return a node that the caller must free with serd_node_free(). +*/ +SERD_API +SerdNode +serd_node_copy(const SerdNode* SERD_NULLABLE node); + +/// Return true iff `a` is equal to `b` +SERD_PURE_API +bool +serd_node_equals(const SerdNode* SERD_NONNULL a, + const SerdNode* SERD_NONNULL b); + +/** + Free any data owned by `node`. + + Note that if `node` is itself dynamically allocated (which is not the case + for nodes created internally by serd), it will not be freed. +*/ +SERD_API +void +serd_node_free(SerdNode* SERD_NULLABLE node); + +/** + @} + @defgroup serd_event Event Handlers + @{ +*/ + +/** + Sink (callback) for errors. + + @param handle Handle for user data. + @param error Error description. +*/ +typedef SerdStatus (*SerdErrorSink)(void* SERD_NULLABLE handle, + const SerdError* SERD_NONNULL error); + +/** + Sink (callback) for base URI changes + + Called whenever the base URI of the serialisation changes. +*/ +typedef SerdStatus (*SerdBaseSink)(void* SERD_NULLABLE handle, + const SerdNode* SERD_NONNULL uri); + +/** + Sink (callback) for namespace definitions + + Called whenever a prefix is defined in the serialisation. +*/ +typedef SerdStatus (*SerdPrefixSink)(void* SERD_NULLABLE handle, + const SerdNode* SERD_NONNULL name, + const SerdNode* SERD_NONNULL uri); + +/** + Sink (callback) for statements + + Called for every RDF statement in the serialisation. +*/ +typedef SerdStatus (*SerdStatementSink)( + void* SERD_NULLABLE handle, + SerdStatementFlags flags, + const SerdNode* SERD_NULLABLE graph, + const SerdNode* SERD_NONNULL subject, + const SerdNode* SERD_NONNULL predicate, + const SerdNode* SERD_NONNULL object, + const SerdNode* SERD_NULLABLE object_datatype, + const SerdNode* SERD_NULLABLE object_lang); + +/** + Sink (callback) for anonymous node end markers + + This is called to indicate that the anonymous node with the given + `value` will no longer be referred to by any future statements + (i.e. the anonymous serialisation of the node is finished). +*/ +typedef SerdStatus (*SerdEndSink)(void* SERD_NULLABLE handle, + const SerdNode* SERD_NONNULL node); + +/** + @} + @defgroup serd_env Environment + @{ +*/ + +/// Create a new environment +SERD_API +SerdEnv* SERD_ALLOCATED +serd_env_new(const SerdNode* SERD_NULLABLE base_uri); + +/// Free `env` +SERD_API +void +serd_env_free(SerdEnv* SERD_NULLABLE env); + +/// Get the current base URI +SERD_API +const SerdNode* SERD_NONNULL +serd_env_get_base_uri(const SerdEnv* SERD_NONNULL env, + SerdURI* SERD_NULLABLE out); + +/// Set the current base URI +SERD_API +SerdStatus +serd_env_set_base_uri(SerdEnv* SERD_NONNULL env, + const SerdNode* SERD_NULLABLE uri); + +/** + Set a namespace prefix + + A namespace prefix is used to expand CURIE nodes, for example, with the + prefix "xsd" set to "http://www.w3.org/2001/XMLSchema#", "xsd:decimal" will + expand to "http://www.w3.org/2001/XMLSchema#decimal". +*/ +SERD_API +SerdStatus +serd_env_set_prefix(SerdEnv* SERD_NONNULL env, + const SerdNode* SERD_NONNULL name, + const SerdNode* SERD_NONNULL uri); + +/// Set a namespace prefix +SERD_API +SerdStatus +serd_env_set_prefix_from_strings(SerdEnv* SERD_NONNULL env, + const uint8_t* SERD_NONNULL name, + const uint8_t* SERD_NONNULL uri); + +/// Qualify `uri` into a CURIE if possible +SERD_API +bool +serd_env_qualify(const SerdEnv* SERD_NONNULL env, + const SerdNode* SERD_NONNULL uri, + SerdNode* SERD_NONNULL prefix, + SerdChunk* SERD_NONNULL suffix); + +/** + Expand `curie`. + + Errors: SERD_ERR_BAD_ARG if `curie` is not valid, or SERD_ERR_BAD_CURIE if + prefix is not defined in `env`. +*/ +SERD_API +SerdStatus +serd_env_expand(const SerdEnv* SERD_NONNULL env, + const SerdNode* SERD_NONNULL curie, + SerdChunk* SERD_NONNULL uri_prefix, + SerdChunk* SERD_NONNULL uri_suffix); + +/** + Expand `node`, which must be a CURIE or URI, to a full URI. + + Returns null if `node` can not be expanded. +*/ +SERD_API +SerdNode +serd_env_expand_node(const SerdEnv* SERD_NONNULL env, + const SerdNode* SERD_NONNULL node); + +/// Call `func` for each prefix defined in `env` +SERD_API +void +serd_env_foreach(const SerdEnv* SERD_NONNULL env, + SerdPrefixSink SERD_NONNULL func, + void* SERD_NULLABLE handle); + +/** + @} + @defgroup serd_reader Reader + @{ +*/ + +/// Create a new RDF reader +SERD_API +SerdReader* SERD_ALLOCATED +serd_reader_new(SerdSyntax syntax, + void* SERD_NULLABLE handle, + void (*SERD_NULLABLE free_handle)(void* SERD_NULLABLE), + SerdBaseSink SERD_NULLABLE base_sink, + SerdPrefixSink SERD_NULLABLE prefix_sink, + SerdStatementSink SERD_NULLABLE statement_sink, + SerdEndSink SERD_NULLABLE end_sink); + +/** + Enable or disable strict parsing + + The reader is non-strict (lax) by default, which will tolerate URIs with + invalid characters. Setting strict will fail when parsing such files. An + error is printed for invalid input in either case. +*/ +SERD_API +void +serd_reader_set_strict(SerdReader* SERD_NONNULL reader, bool strict); + +/** + Set a function to be called when errors occur during reading. + + The `error_sink` will be called with `handle` as its first argument. If + no error function is set, errors are printed to stderr in GCC style. +*/ +SERD_API +void +serd_reader_set_error_sink(SerdReader* SERD_NONNULL reader, + SerdErrorSink SERD_NULLABLE error_sink, + void* SERD_NULLABLE error_handle); + +/// Return the `handle` passed to serd_reader_new() +SERD_PURE_API +void* SERD_NULLABLE +serd_reader_get_handle(const SerdReader* SERD_NONNULL reader); + +/** + Set a prefix to be added to all blank node identifiers. + + This is useful when multiple files are to be parsed into the same output (a + model or a file). Since Serd preserves blank node IDs, this could cause + conflicts where two non-equivalent blank nodes are merged, resulting in + corrupt data. By setting a unique blank node prefix for each parsed file, + this can be avoided, while preserving blank node names. +*/ +SERD_API +void +serd_reader_add_blank_prefix(SerdReader* SERD_NONNULL reader, + const uint8_t* SERD_NULLABLE prefix); + +/** + Set the URI of the default graph. + + If this is set, the reader will emit quads with the graph set to the given + node for any statements that are not in a named graph (which is currently + all of them since Serd currently does not support any graph syntaxes). +*/ +SERD_API +void +serd_reader_set_default_graph(SerdReader* SERD_NONNULL reader, + const SerdNode* SERD_NULLABLE graph); + +/// Read a file at a given `uri` +SERD_API +SerdStatus +serd_reader_read_file(SerdReader* SERD_NONNULL reader, + const uint8_t* SERD_NONNULL uri); + +/** + Start an incremental read from a file handle. + + Iff `bulk` is true, `file` will be read a page at a time. This is more + efficient, but uses a page of memory and means that an entire page of input + must be ready before any callbacks will fire. To react as soon as input + arrives, set `bulk` to false. +*/ +SERD_API +SerdStatus +serd_reader_start_stream(SerdReader* SERD_NONNULL reader, + FILE* SERD_NONNULL file, + const uint8_t* SERD_NULLABLE name, + bool bulk); + +/** + Start an incremental read from a user-specified source. + + The `read_func` is guaranteed to only be called for `page_size` elements + with size 1 (i.e. `page_size` bytes). +*/ +SERD_API +SerdStatus +serd_reader_start_source_stream(SerdReader* SERD_NONNULL reader, + SerdSource SERD_NONNULL read_func, + SerdStreamErrorFunc SERD_NONNULL error_func, + void* SERD_NONNULL stream, + const uint8_t* SERD_NULLABLE name, + size_t page_size); + +/** + Read a single "chunk" of data during an incremental read + + This function will read a single top level description, and return. This + may be a directive, statement, or several statements; essentially it reads + until a '.' is encountered. This is particularly useful for reading + directly from a pipe or socket. +*/ +SERD_API +SerdStatus +serd_reader_read_chunk(SerdReader* SERD_NONNULL reader); + +/// Finish an incremental read from a file handle +SERD_API +SerdStatus +serd_reader_end_stream(SerdReader* SERD_NONNULL reader); + +/// Read `file` +SERD_API +SerdStatus +serd_reader_read_file_handle(SerdReader* SERD_NONNULL reader, + FILE* SERD_NONNULL file, + const uint8_t* SERD_NULLABLE name); + +/// Read a user-specified byte source +SERD_API +SerdStatus +serd_reader_read_source(SerdReader* SERD_NONNULL reader, + SerdSource SERD_NONNULL source, + SerdStreamErrorFunc SERD_NONNULL error, + void* SERD_NONNULL stream, + const uint8_t* SERD_NULLABLE name, + size_t page_size); + +/// Read `utf8` +SERD_API +SerdStatus +serd_reader_read_string(SerdReader* SERD_NONNULL reader, + const uint8_t* SERD_NONNULL utf8); + +/// Free `reader` +SERD_API +void +serd_reader_free(SerdReader* SERD_NULLABLE reader); + +/** + @} + @defgroup serd_writer Writer + @{ +*/ + +/// Create a new RDF writer +SERD_API +SerdWriter* SERD_ALLOCATED +serd_writer_new(SerdSyntax syntax, + SerdStyle style, + SerdEnv* SERD_NONNULL env, + const SerdURI* SERD_NULLABLE base_uri, + SerdSink SERD_NONNULL ssink, + void* SERD_NULLABLE stream); + +/// Free `writer` +SERD_API +void +serd_writer_free(SerdWriter* SERD_NULLABLE writer); + +/// Return the env used by `writer` +SERD_PURE_API +SerdEnv* SERD_NONNULL +serd_writer_get_env(SerdWriter* SERD_NONNULL writer); + +/** + A convenience sink function for writing to a FILE*. + + This function can be used as a SerdSink when writing to a FILE*. The + `stream` parameter must be a FILE* opened for writing. +*/ +SERD_API +size_t +serd_file_sink(const void* SERD_NONNULL buf, + size_t len, + void* SERD_NONNULL stream); + +/** + A convenience sink function for writing to a string + + This function can be used as a SerdSink to write to a SerdChunk which is + resized as necessary with realloc(). The `stream` parameter must point to + an initialized SerdChunk. When the write is finished, the string should be + retrieved with serd_chunk_sink_finish(). +*/ +SERD_API +size_t +serd_chunk_sink(const void* SERD_NONNULL buf, + size_t len, + void* SERD_NONNULL stream); + +/** + Finish a serialisation to a chunk with serd_chunk_sink(). + + The returned string is the result of the serialisation, which is null + terminated (by this function) and owned by the caller. +*/ +SERD_API +uint8_t* SERD_NULLABLE +serd_chunk_sink_finish(SerdChunk* SERD_NONNULL stream); + +/** + Set a function to be called when errors occur during writing. + + The `error_sink` will be called with `handle` as its first argument. If + no error function is set, errors are printed to stderr. +*/ +SERD_API +void +serd_writer_set_error_sink(SerdWriter* SERD_NONNULL writer, + SerdErrorSink SERD_NONNULL error_sink, + void* SERD_NULLABLE error_handle); + +/** + Set a prefix to be removed from matching blank node identifiers + + This is the counterpart to serd_reader_add_blank_prefix() which can be used + to "undo" added prefixes. +*/ +SERD_API +void +serd_writer_chop_blank_prefix(SerdWriter* SERD_NONNULL writer, + const uint8_t* SERD_NULLABLE prefix); + +/** + Set the current output base URI, and emit a directive if applicable. + + Note this function can be safely casted to SerdBaseSink. +*/ +SERD_API +SerdStatus +serd_writer_set_base_uri(SerdWriter* SERD_NONNULL writer, + const SerdNode* SERD_NULLABLE uri); + +/** + Set the current root URI. + + The root URI should be a prefix of the base URI. The path of the root URI + is the highest path any relative up-reference can refer to. For example, + with root and base , + will be written as <../>, but will be + written non-relatively as . If the root is not explicitly set, + it defaults to the base URI, so no up-references will be created at all. +*/ +SERD_API +SerdStatus +serd_writer_set_root_uri(SerdWriter* SERD_NONNULL writer, + const SerdNode* SERD_NULLABLE uri); + +/** + Set a namespace prefix (and emit directive if applicable). + + Note this function can be safely casted to SerdPrefixSink. +*/ +SERD_API +SerdStatus +serd_writer_set_prefix(SerdWriter* SERD_NONNULL writer, + const SerdNode* SERD_NONNULL name, + const SerdNode* SERD_NONNULL uri); + +/** + Write a statement. + + Note this function can be safely casted to SerdStatementSink. +*/ +SERD_API +SerdStatus +serd_writer_write_statement(SerdWriter* SERD_NONNULL writer, + SerdStatementFlags flags, + const SerdNode* SERD_NULLABLE graph, + const SerdNode* SERD_NONNULL subject, + const SerdNode* SERD_NONNULL predicate, + const SerdNode* SERD_NONNULL object, + const SerdNode* SERD_NULLABLE datatype, + const SerdNode* SERD_NULLABLE lang); + +/** + Mark the end of an anonymous node's description. + + Note this function can be safely casted to SerdEndSink. +*/ +SERD_API +SerdStatus +serd_writer_end_anon(SerdWriter* SERD_NONNULL writer, + const SerdNode* SERD_NULLABLE node); + +/** + Finish a write + + This flushes any pending output, for example terminating punctuation, so + that the output is a complete document. +*/ +SERD_API +SerdStatus +serd_writer_finish(SerdWriter* SERD_NONNULL writer); + +/** + @} + @} +*/ + +#ifdef __cplusplus +# if defined(__GNUC__) +# pragma GCC diagnostic pop +# endif +} /* extern "C" */ +#endif + +#endif /* SERD_SERD_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/.clang-tidy b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/.clang-tidy new file mode 100644 index 00000000..5be37470 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/.clang-tidy @@ -0,0 +1,18 @@ +Checks: > + *, + -*-magic-numbers, + -*-uppercase-literal-suffix, + -bugprone-branch-clone, + -bugprone-reserved-identifier, + -bugprone-suspicious-string-compare, + -cert-dcl37-c, + -cert-dcl51-cpp, + -clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling, + -google-readability-todo, + -hicpp-signed-bitwise, + -llvm-header-guard, + -llvmlibc-*, + -misc-no-recursion, +WarningsAsErrors: '*' +HeaderFilterRegex: '.*' +FormatStyle: file diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h new file mode 100644 index 00000000..8628a868 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/attributes.h @@ -0,0 +1,26 @@ +/* + Copyright 2019-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef SERD_ATTRIBUTES_H +#define SERD_ATTRIBUTES_H + +#ifdef __GNUC__ +# define SERD_MALLOC_FUNC __attribute__((malloc)) +#else +# define SERD_MALLOC_FUNC +#endif + +#endif // SERD_ATTRIBUTES_H diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c new file mode 100644 index 00000000..bca3dfd3 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.c @@ -0,0 +1,132 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "base64.h" + +#include "serd_internal.h" +#include "string_utils.h" + +#include "serd/serd.h" + +#include +#include +#include +#include + +/** + Base64 encoding table. + + @see RFC3548 S3. +*/ +static const uint8_t b64_map[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +/** + Base64 decoding table. + + This is indexed by encoded characters and returns the numeric value used + for decoding, shifted up by 47 to be in the range of printable ASCII. + A '$' is a placeholder for characters not in the base64 alphabet. +*/ +static const char b64_unmap[] = + "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$m$$$ncdefghijkl$$$$$$" + "$/0123456789:;<=>?@ABCDEFGH$$$$$$IJKLMNOPQRSTUVWXYZ[\\]^_`ab$$$$" + "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" + "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"; + +/** Encode 3 raw bytes to 4 base64 characters. */ +static inline void +encode_chunk(uint8_t out[4], const uint8_t in[3], size_t n_in) +{ + out[0] = b64_map[in[0] >> 2]; + out[1] = b64_map[((in[0] & 0x03) << 4) | ((in[1] & 0xF0) >> 4)]; + + out[2] = (n_in > 1) ? (b64_map[((in[1] & 0x0F) << 2) | ((in[2] & 0xC0) >> 6)]) + : (uint8_t)'='; + + out[3] = ((n_in > 2) ? b64_map[in[2] & 0x3F] : (uint8_t)'='); +} + +size_t +serd_base64_get_length(const size_t size, const bool wrap_lines) +{ + return (size + 2) / 3 * 4 + (wrap_lines * ((size - 1) / 57)); +} + +bool +serd_base64_encode(uint8_t* const str, + const void* const buf, + const size_t size, + const bool wrap_lines) +{ + bool has_newline = false; + + for (size_t i = 0, j = 0; i < size; i += 3, j += 4) { + uint8_t in[4] = {0, 0, 0, 0}; + size_t n_in = MIN(3, size - i); + memcpy(in, (const uint8_t*)buf + i, n_in); + + if (wrap_lines && i > 0 && (i % 57) == 0) { + str[j++] = '\n'; + has_newline = true; + } + + encode_chunk(str + j, in, n_in); + } + + return has_newline; +} + +static inline uint8_t +unmap(const uint8_t in) +{ + return (uint8_t)(b64_unmap[in] - 47); +} + +/** Decode 4 base64 characters to 3 raw bytes. */ +static inline size_t +decode_chunk(const uint8_t in[4], uint8_t out[3]) +{ + out[0] = (uint8_t)(((unmap(in[0]) << 2)) | unmap(in[1]) >> 4); + out[1] = (uint8_t)(((unmap(in[1]) << 4) & 0xF0) | unmap(in[2]) >> 2); + out[2] = (uint8_t)(((unmap(in[2]) << 6) & 0xC0) | unmap(in[3])); + return 1 + (in[2] != '=') + ((in[2] != '=') && (in[3] != '=')); +} + +void* +serd_base64_decode(const uint8_t* str, size_t len, size_t* size) +{ + void* buf = malloc((len * 3) / 4 + 2); + + *size = 0; + for (size_t i = 0, j = 0; i < len; j += 3) { + uint8_t in[] = "===="; + size_t n_in = 0; + for (; i < len && n_in < 4; ++n_in) { + for (; i < len && !is_base64(str[i]); ++i) { + // Skip junk + } + + in[n_in] = str[i++]; + } + + if (n_in > 1) { + *size += decode_chunk(in, (uint8_t*)buf + j); + } + } + + return buf; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h new file mode 100644 index 00000000..8ff6acc4 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/base64.h @@ -0,0 +1,48 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef SERD_BASE64_H +#define SERD_BASE64_H + +#include "serd/serd.h" + +#include +#include +#include + +/** + Return the number of bytes required to encode `size` bytes in base64. + + @param size The number of input (binary) bytes to encode. + @param wrap_lines Wrap lines at 76 characters to conform to RFC 2045. + @return The length of the base64 encoding, excluding null terminator. +*/ +SERD_CONST_FUNC size_t +serd_base64_get_length(size_t size, bool wrap_lines); + +/** + Encode `size` bytes of `buf` into `str`, which must be large enough. + + @param str Output string buffer. + @param buf Input binary data. + @param size Number of bytes to encode from `buf`. + @param wrap_lines Wrap lines at 76 characters to conform to RFC 2045. + @return True iff `str` contains newlines. +*/ +bool +serd_base64_encode(uint8_t* str, const void* buf, size_t size, bool wrap_lines); + +#endif // SERD_BASE64_H diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h new file mode 100644 index 00000000..dc55ba1e --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_sink.h @@ -0,0 +1,98 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef SERD_BYTE_SINK_H +#define SERD_BYTE_SINK_H + +#include "serd_internal.h" +#include "system.h" + +#include "serd/serd.h" + +#include +#include +#include + +typedef struct SerdByteSinkImpl { + SerdSink sink; + void* stream; + uint8_t* buf; + size_t size; + size_t block_size; +} SerdByteSink; + +static inline SerdByteSink +serd_byte_sink_new(SerdSink sink, void* stream, size_t block_size) +{ + SerdByteSink bsink = {sink, stream, NULL, 0, block_size}; + + if (block_size > 1) { + bsink.buf = (uint8_t*)serd_allocate_buffer(block_size); + } + + return bsink; +} + +static inline void +serd_byte_sink_flush(SerdByteSink* bsink) +{ + if (bsink->block_size > 1 && bsink->size > 0) { + bsink->sink(bsink->buf, bsink->size, bsink->stream); + bsink->size = 0; + } +} + +static inline void +serd_byte_sink_free(SerdByteSink* bsink) +{ + serd_byte_sink_flush(bsink); + serd_free_aligned(bsink->buf); + bsink->buf = NULL; +} + +static inline size_t +serd_byte_sink_write(const void* buf, size_t len, SerdByteSink* bsink) +{ + if (len == 0) { + return 0; + } + + if (bsink->block_size == 1) { + return bsink->sink(buf, len, bsink->stream); + } + + const size_t orig_len = len; + while (len) { + const size_t space = bsink->block_size - bsink->size; + const size_t n = MIN(space, len); + + // Write as much as possible into the remaining buffer space + memcpy(bsink->buf + bsink->size, buf, n); + bsink->size += n; + buf = (const uint8_t*)buf + n; + len -= n; + + // Flush page if buffer is full + if (bsink->size == bsink->block_size) { + bsink->sink(bsink->buf, bsink->block_size, bsink->stream); + bsink->size = 0; + } + } + + return orig_len; +} + +#endif // SERD_BYTE_SINK_H diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c new file mode 100644 index 00000000..9f7e4e59 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.c @@ -0,0 +1,112 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "byte_source.h" + +#include "system.h" + +#include "serd/serd.h" + +#include +#include +#include + +SerdStatus +serd_byte_source_page(SerdByteSource* source) +{ + source->read_head = 0; + const size_t n_read = + source->read_func(source->file_buf, 1, source->page_size, source->stream); + + if (n_read == 0) { + source->file_buf[0] = '\0'; + source->eof = true; + return (source->error_func(source->stream) ? SERD_ERR_UNKNOWN + : SERD_FAILURE); + } + + if (n_read < source->page_size) { + source->file_buf[n_read] = '\0'; + source->buf_size = n_read; + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_byte_source_open_source(SerdByteSource* source, + SerdSource read_func, + SerdStreamErrorFunc error_func, + void* stream, + const uint8_t* name, + size_t page_size) +{ + const Cursor cur = {name, 1, 1}; + + memset(source, '\0', sizeof(*source)); + source->stream = stream; + source->from_stream = true; + source->page_size = page_size; + source->buf_size = page_size; + source->cur = cur; + source->error_func = error_func; + source->read_func = read_func; + + if (page_size > 1) { + source->file_buf = (uint8_t*)serd_allocate_buffer(page_size); + source->read_buf = source->file_buf; + memset(source->file_buf, '\0', page_size); + } else { + source->read_buf = &source->read_byte; + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_byte_source_prepare(SerdByteSource* source) +{ + source->prepared = true; + + if (source->from_stream) { + return (source->page_size > 1 ? serd_byte_source_page(source) + : serd_byte_source_advance(source)); + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_byte_source_open_string(SerdByteSource* source, const uint8_t* utf8) +{ + const Cursor cur = {(const uint8_t*)"(string)", 1, 1}; + + memset(source, '\0', sizeof(*source)); + source->cur = cur; + source->read_buf = utf8; + return SERD_SUCCESS; +} + +SerdStatus +serd_byte_source_close(SerdByteSource* source) +{ + if (source->page_size > 1) { + serd_free_aligned(source->file_buf); + } + + memset(source, '\0', sizeof(*source)); + return SERD_SUCCESS; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h new file mode 100644 index 00000000..48794a37 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/byte_source.h @@ -0,0 +1,120 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef SERD_BYTE_SOURCE_H +#define SERD_BYTE_SOURCE_H + +#include "serd/serd.h" + +#include +#include +#include +#include +#include + +typedef struct { + const uint8_t* filename; + unsigned line; + unsigned col; +} Cursor; + +typedef struct { + SerdSource read_func; ///< Read function (e.g. fread) + SerdStreamErrorFunc error_func; ///< Error function (e.g. ferror) + void* stream; ///< Stream (e.g. FILE) + size_t page_size; ///< Number of bytes to read at a time + size_t buf_size; ///< Number of bytes in file_buf + Cursor cur; ///< Cursor for error reporting + uint8_t* file_buf; ///< Buffer iff reading pages from a file + const uint8_t* read_buf; ///< Pointer to file_buf or read_byte + size_t read_head; ///< Offset into read_buf + uint8_t read_byte; ///< 1-byte 'buffer' used when not paging + bool from_stream; ///< True iff reading from `stream` + bool prepared; ///< True iff prepared for reading + bool eof; ///< True iff end of file reached +} SerdByteSource; + +SerdStatus +serd_byte_source_open_file(SerdByteSource* source, FILE* file, bool bulk); + +SerdStatus +serd_byte_source_open_string(SerdByteSource* source, const uint8_t* utf8); + +SerdStatus +serd_byte_source_open_source(SerdByteSource* source, + SerdSource read_func, + SerdStreamErrorFunc error_func, + void* stream, + const uint8_t* name, + size_t page_size); + +SerdStatus +serd_byte_source_close(SerdByteSource* source); + +SerdStatus +serd_byte_source_prepare(SerdByteSource* source); + +SerdStatus +serd_byte_source_page(SerdByteSource* source); + +static inline SERD_PURE_FUNC uint8_t +serd_byte_source_peek(SerdByteSource* source) +{ + assert(source->prepared); + return source->read_buf[source->read_head]; +} + +static inline SerdStatus +serd_byte_source_advance(SerdByteSource* source) +{ + SerdStatus st = SERD_SUCCESS; + + switch (serd_byte_source_peek(source)) { + case '\n': + ++source->cur.line; + source->cur.col = 0; + break; + default: + ++source->cur.col; + } + + const bool was_eof = source->eof; + if (source->from_stream) { + source->eof = false; + if (source->page_size > 1) { + if (++source->read_head == source->page_size) { + st = serd_byte_source_page(source); + } else if (source->read_head == source->buf_size) { + source->eof = true; + } + } else { + if (!source->read_func(&source->read_byte, 1, 1, source->stream)) { + source->eof = true; + st = + source->error_func(source->stream) ? SERD_ERR_UNKNOWN : SERD_FAILURE; + } + } + } else if (!source->eof) { + ++source->read_head; // Move to next character in string + if (source->read_buf[source->read_head] == '\0') { + source->eof = true; + } + } + + return (was_eof && source->eof) ? SERD_FAILURE : st; +} + +#endif // SERD_BYTE_SOURCE_H diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c new file mode 100644 index 00000000..67fa9caf --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/env.c @@ -0,0 +1,256 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "serd/serd.h" + +#include +#include +#include +#include +#include + +typedef struct { + SerdNode name; + SerdNode uri; +} SerdPrefix; + +struct SerdEnvImpl { + SerdPrefix* prefixes; + size_t n_prefixes; + SerdNode base_uri_node; + SerdURI base_uri; +}; + +SerdEnv* +serd_env_new(const SerdNode* base_uri) +{ + SerdEnv* env = (SerdEnv*)calloc(1, sizeof(struct SerdEnvImpl)); + if (env && base_uri) { + serd_env_set_base_uri(env, base_uri); + } + + return env; +} + +void +serd_env_free(SerdEnv* env) +{ + if (!env) { + return; + } + + for (size_t i = 0; i < env->n_prefixes; ++i) { + serd_node_free(&env->prefixes[i].name); + serd_node_free(&env->prefixes[i].uri); + } + + free(env->prefixes); + serd_node_free(&env->base_uri_node); + free(env); +} + +const SerdNode* +serd_env_get_base_uri(const SerdEnv* env, SerdURI* out) +{ + if (out) { + *out = env->base_uri; + } + + return &env->base_uri_node; +} + +SerdStatus +serd_env_set_base_uri(SerdEnv* env, const SerdNode* uri) +{ + if (!env || (uri && uri->type != SERD_URI)) { + return SERD_ERR_BAD_ARG; + } + + if (!uri || !uri->buf) { + serd_node_free(&env->base_uri_node); + env->base_uri_node = SERD_NODE_NULL; + env->base_uri = SERD_URI_NULL; + return SERD_SUCCESS; + } + + // Resolve base URI and create a new node and URI for it + SerdURI base_uri; + SerdNode base_uri_node = + serd_node_new_uri_from_node(uri, &env->base_uri, &base_uri); + + // Replace the current base URI + serd_node_free(&env->base_uri_node); + env->base_uri_node = base_uri_node; + env->base_uri = base_uri; + + return SERD_SUCCESS; +} + +static inline SERD_PURE_FUNC SerdPrefix* +serd_env_find(const SerdEnv* env, const uint8_t* name, size_t name_len) +{ + for (size_t i = 0; i < env->n_prefixes; ++i) { + const SerdNode* const prefix_name = &env->prefixes[i].name; + if (prefix_name->n_bytes == name_len) { + if (!memcmp(prefix_name->buf, name, name_len)) { + return &env->prefixes[i]; + } + } + } + + return NULL; +} + +static void +serd_env_add(SerdEnv* env, const SerdNode* name, const SerdNode* uri) +{ + SerdPrefix* const prefix = serd_env_find(env, name->buf, name->n_bytes); + if (prefix) { + if (!serd_node_equals(&prefix->uri, uri)) { + SerdNode old_prefix_uri = prefix->uri; + prefix->uri = serd_node_copy(uri); + serd_node_free(&old_prefix_uri); + } + } else { + env->prefixes = (SerdPrefix*)realloc( + env->prefixes, (++env->n_prefixes) * sizeof(SerdPrefix)); + env->prefixes[env->n_prefixes - 1].name = serd_node_copy(name); + env->prefixes[env->n_prefixes - 1].uri = serd_node_copy(uri); + } +} + +SerdStatus +serd_env_set_prefix(SerdEnv* env, const SerdNode* name, const SerdNode* uri) +{ + if (!name->buf || uri->type != SERD_URI) { + return SERD_ERR_BAD_ARG; + } + + if (serd_uri_string_has_scheme(uri->buf)) { + // Set prefix to absolute URI + serd_env_add(env, name, uri); + } else { + // Resolve relative URI and create a new node and URI for it + SerdURI abs_uri; + SerdNode abs_uri_node = + serd_node_new_uri_from_node(uri, &env->base_uri, &abs_uri); + + // Set prefix to resolved (absolute) URI + serd_env_add(env, name, &abs_uri_node); + serd_node_free(&abs_uri_node); + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_env_set_prefix_from_strings(SerdEnv* env, + const uint8_t* name, + const uint8_t* uri) +{ + const SerdNode name_node = serd_node_from_string(SERD_LITERAL, name); + const SerdNode uri_node = serd_node_from_string(SERD_URI, uri); + + return serd_env_set_prefix(env, &name_node, &uri_node); +} + +bool +serd_env_qualify(const SerdEnv* env, + const SerdNode* uri, + SerdNode* prefix, + SerdChunk* suffix) +{ + for (size_t i = 0; i < env->n_prefixes; ++i) { + const SerdNode* const prefix_uri = &env->prefixes[i].uri; + if (uri->n_bytes >= prefix_uri->n_bytes) { + if (!strncmp((const char*)uri->buf, + (const char*)prefix_uri->buf, + prefix_uri->n_bytes)) { + *prefix = env->prefixes[i].name; + suffix->buf = uri->buf + prefix_uri->n_bytes; + suffix->len = uri->n_bytes - prefix_uri->n_bytes; + return true; + } + } + } + return false; +} + +SerdStatus +serd_env_expand(const SerdEnv* env, + const SerdNode* curie, + SerdChunk* uri_prefix, + SerdChunk* uri_suffix) +{ + const uint8_t* const colon = + (const uint8_t*)memchr(curie->buf, ':', curie->n_bytes + 1); + if (curie->type != SERD_CURIE || !colon) { + return SERD_ERR_BAD_ARG; + } + + const size_t name_len = (size_t)(colon - curie->buf); + const SerdPrefix* const prefix = serd_env_find(env, curie->buf, name_len); + if (prefix) { + uri_prefix->buf = prefix->uri.buf; + uri_prefix->len = prefix->uri.n_bytes; + uri_suffix->buf = colon + 1; + uri_suffix->len = curie->n_bytes - name_len - 1; + return SERD_SUCCESS; + } + return SERD_ERR_BAD_CURIE; +} + +SerdNode +serd_env_expand_node(const SerdEnv* env, const SerdNode* node) +{ + switch (node->type) { + case SERD_NOTHING: + case SERD_LITERAL: + break; + + case SERD_URI: { + SerdURI ignored; + return serd_node_new_uri_from_node(node, &env->base_uri, &ignored); + } + + case SERD_CURIE: { + SerdChunk prefix; + SerdChunk suffix; + if (serd_env_expand(env, node, &prefix, &suffix)) { + return SERD_NODE_NULL; + } + const size_t len = prefix.len + suffix.len; + uint8_t* buf = (uint8_t*)malloc(len + 1); + SerdNode ret = {buf, len, 0, 0, SERD_URI}; + snprintf((char*)buf, len + 1, "%s%s", prefix.buf, suffix.buf); + ret.n_chars = serd_strlen(buf, NULL, NULL); + return ret; + } + + case SERD_BLANK: + break; + } + + return SERD_NODE_NULL; +} + +void +serd_env_foreach(const SerdEnv* env, SerdPrefixSink func, void* handle) +{ + for (size_t i = 0; i < env->n_prefixes; ++i) { + func(handle, &env->prefixes[i].name, &env->prefixes[i].uri); + } +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c new file mode 100644 index 00000000..9aae8a19 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/n3.c @@ -0,0 +1,1720 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "byte_source.h" +#include "reader.h" +#include "serd_internal.h" +#include "stack.h" +#include "string_utils.h" +#include "uri_utils.h" + +#include "serd/serd.h" + +#include +#include +#include +#include +#include +#include + +#define TRY(st, exp) \ + do { \ + if (((st) = (exp))) { \ + return (st); \ + } \ + } while (0) + +static inline bool +fancy_syntax(const SerdReader* reader) +{ + return reader->syntax == SERD_TURTLE || reader->syntax == SERD_TRIG; +} + +static SerdStatus +read_collection(SerdReader* reader, ReadContext ctx, Ref* dest); + +static SerdStatus +read_predicateObjectList(SerdReader* reader, ReadContext ctx, bool* ate_dot); + +static inline uint8_t +read_HEX(SerdReader* reader) +{ + const int c = peek_byte(reader); + if (is_xdigit(c)) { + return (uint8_t)eat_byte_safe(reader, c); + } + + r_err(reader, SERD_ERR_BAD_SYNTAX, "invalid hexadecimal digit `%c'\n", c); + return 0; +} + +// Read UCHAR escape, initial \ is already eaten by caller +static inline SerdStatus +read_UCHAR(SerdReader* reader, Ref dest, uint32_t* char_code) +{ + const int b = peek_byte(reader); + unsigned length = 0; + switch (b) { + case 'U': + length = 8; + break; + case 'u': + length = 4; + break; + default: + return SERD_ERR_BAD_SYNTAX; + } + + eat_byte_safe(reader, b); + + uint8_t buf[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; + for (unsigned i = 0; i < length; ++i) { + if (!(buf[i] = read_HEX(reader))) { + return SERD_ERR_BAD_SYNTAX; + } + } + + char* endptr = NULL; + const uint32_t code = (uint32_t)strtoul((const char*)buf, &endptr, 16); + assert(endptr == (char*)buf + length); + + unsigned size = 0; + if (code < 0x00000080) { + size = 1; + } else if (code < 0x00000800) { + size = 2; + } else if (code < 0x00010000) { + size = 3; + } else if (code < 0x00110000) { + size = 4; + } else { + r_err(reader, + SERD_ERR_BAD_SYNTAX, + "unicode character 0x%X out of range\n", + code); + push_bytes(reader, dest, replacement_char, 3); + *char_code = 0xFFFD; + return SERD_SUCCESS; + } + + // Build output in buf + // (Note # of bytes = # of leading 1 bits in first byte) + uint32_t c = code; + switch (size) { + case 4: + buf[3] = (uint8_t)(0x80u | (c & 0x3Fu)); + c >>= 6; + c |= (16 << 12); // set bit 4 + /* fallthru */ + case 3: + buf[2] = (uint8_t)(0x80u | (c & 0x3Fu)); + c >>= 6; + c |= (32 << 6); // set bit 5 + /* fallthru */ + case 2: + buf[1] = (uint8_t)(0x80u | (c & 0x3Fu)); + c >>= 6; + c |= 0xC0; // set bits 6 and 7 + /* fallthru */ + case 1: + buf[0] = (uint8_t)c; + /* fallthru */ + default: + break; + } + + push_bytes(reader, dest, buf, size); + *char_code = code; + return SERD_SUCCESS; +} + +// Read ECHAR escape, initial \ is already eaten by caller +static inline SerdStatus +read_ECHAR(SerdReader* reader, Ref dest, SerdNodeFlags* flags) +{ + const int c = peek_byte(reader); + switch (c) { + case 't': + eat_byte_safe(reader, 't'); + push_byte(reader, dest, '\t'); + return SERD_SUCCESS; + case 'b': + eat_byte_safe(reader, 'b'); + push_byte(reader, dest, '\b'); + return SERD_SUCCESS; + case 'n': + *flags |= SERD_HAS_NEWLINE; + eat_byte_safe(reader, 'n'); + push_byte(reader, dest, '\n'); + return SERD_SUCCESS; + case 'r': + *flags |= SERD_HAS_NEWLINE; + eat_byte_safe(reader, 'r'); + push_byte(reader, dest, '\r'); + return SERD_SUCCESS; + case 'f': + eat_byte_safe(reader, 'f'); + push_byte(reader, dest, '\f'); + return SERD_SUCCESS; + case '\\': + case '"': + case '\'': + push_byte(reader, dest, eat_byte_safe(reader, c)); + return SERD_SUCCESS; + default: + return SERD_ERR_BAD_SYNTAX; + } +} + +static inline SerdStatus +bad_char(SerdReader* reader, const char* fmt, uint8_t c) +{ + // Skip bytes until the next start byte + for (int b = peek_byte(reader); b != EOF && ((uint8_t)b & 0x80);) { + eat_byte_safe(reader, b); + b = peek_byte(reader); + } + + r_err(reader, SERD_ERR_BAD_SYNTAX, fmt, c); + return reader->strict ? SERD_ERR_BAD_SYNTAX : SERD_FAILURE; +} + +static SerdStatus +read_utf8_bytes(SerdReader* reader, uint8_t bytes[4], uint32_t* size, uint8_t c) +{ + *size = utf8_num_bytes(c); + if (*size <= 1 || *size > 4) { + return bad_char(reader, "invalid UTF-8 start 0x%X\n", c); + } + + bytes[0] = c; + for (unsigned i = 1; i < *size; ++i) { + const int b = peek_byte(reader); + if (b == EOF || ((uint8_t)b & 0x80) == 0) { + return bad_char(reader, "invalid UTF-8 continuation 0x%X\n", (uint8_t)b); + } + + eat_byte_safe(reader, b); + bytes[i] = (uint8_t)b; + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_utf8_character(SerdReader* reader, Ref dest, uint8_t c) +{ + uint32_t size = 0; + uint8_t bytes[4] = {0, 0, 0, 0}; + SerdStatus st = read_utf8_bytes(reader, bytes, &size, c); + if (st) { + push_bytes(reader, dest, replacement_char, 3); + } else { + push_bytes(reader, dest, bytes, size); + } + + return st; +} + +static SerdStatus +read_utf8_code(SerdReader* reader, Ref dest, uint32_t* code, uint8_t c) +{ + uint32_t size = 0; + uint8_t bytes[4] = {0, 0, 0, 0}; + SerdStatus st = read_utf8_bytes(reader, bytes, &size, c); + if (st) { + push_bytes(reader, dest, replacement_char, 3); + return st; + } + + push_bytes(reader, dest, bytes, size); + *code = parse_counted_utf8_char(bytes, size); + return st; +} + +// Read one character (possibly multi-byte) +// The first byte, c, has already been eaten by caller +static inline SerdStatus +read_character(SerdReader* reader, Ref dest, SerdNodeFlags* flags, uint8_t c) +{ + if (!(c & 0x80)) { + switch (c) { + case 0xA: + case 0xD: + *flags |= SERD_HAS_NEWLINE; + break; + case '"': + case '\'': + *flags |= SERD_HAS_QUOTE; + break; + default: + break; + } + return push_byte(reader, dest, c); + } + + return read_utf8_character(reader, dest, c); +} + +// [10] comment ::= '#' ( [^#xA #xD] )* +static void +read_comment(SerdReader* reader) +{ + eat_byte_safe(reader, '#'); + int c = 0; + while (((c = peek_byte(reader)) != 0xA) && c != 0xD && c != EOF && c) { + eat_byte_safe(reader, c); + } +} + +// [24] ws ::= #x9 | #xA | #xD | #x20 | comment +static inline bool +read_ws(SerdReader* reader) +{ + const int c = peek_byte(reader); + switch (c) { + case 0x9: + case 0xA: + case 0xD: + case 0x20: + eat_byte_safe(reader, c); + return true; + case '#': + read_comment(reader); + return true; + default: + return false; + } +} + +static inline bool +read_ws_star(SerdReader* reader) +{ + while (read_ws(reader)) { + } + + return true; +} + +static inline bool +peek_delim(SerdReader* reader, const char delim) +{ + read_ws_star(reader); + return peek_byte(reader) == delim; +} + +static inline bool +eat_delim(SerdReader* reader, const char delim) +{ + if (peek_delim(reader, delim)) { + eat_byte_safe(reader, delim); + return read_ws_star(reader); + } + + return false; +} + +// STRING_LITERAL_LONG_QUOTE and STRING_LITERAL_LONG_SINGLE_QUOTE +// Initial triple quotes are already eaten by caller +static SerdStatus +read_STRING_LITERAL_LONG(SerdReader* reader, + Ref ref, + SerdNodeFlags* flags, + uint8_t q) +{ + SerdStatus st = SERD_SUCCESS; + + while (!(st && reader->strict)) { + const int c = peek_byte(reader); + if (c == '\\') { + eat_byte_safe(reader, c); + uint32_t code = 0; + if ((st = read_ECHAR(reader, ref, flags)) && + (st = read_UCHAR(reader, ref, &code))) { + return r_err(reader, st, "invalid escape `\\%c'\n", peek_byte(reader)); + } + } else if (c == q) { + eat_byte_safe(reader, q); + const int q2 = eat_byte_safe(reader, peek_byte(reader)); + const int q3 = peek_byte(reader); + if (q2 == q && q3 == q) { // End of string + eat_byte_safe(reader, q3); + break; + } + *flags |= SERD_HAS_QUOTE; + push_byte(reader, ref, c); + st = read_character(reader, ref, flags, (uint8_t)q2); + } else if (c == EOF) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "end of file in long string\n"); + } else { + st = + read_character(reader, ref, flags, (uint8_t)eat_byte_safe(reader, c)); + } + } + + return (st && reader->strict) ? st : SERD_SUCCESS; +} + +// STRING_LITERAL_QUOTE and STRING_LITERAL_SINGLE_QUOTE +// Initial quote is already eaten by caller +static SerdStatus +read_STRING_LITERAL(SerdReader* reader, + Ref ref, + SerdNodeFlags* flags, + uint8_t q) +{ + SerdStatus st = SERD_SUCCESS; + + while (!(st && reader->strict)) { + const int c = peek_byte(reader); + uint32_t code = 0; + switch (c) { + case EOF: + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "end of file in short string\n"); + case '\n': + case '\r': + return r_err(reader, SERD_ERR_BAD_SYNTAX, "line end in short string\n"); + case '\\': + eat_byte_safe(reader, c); + if ((st = read_ECHAR(reader, ref, flags)) && + (st = read_UCHAR(reader, ref, &code))) { + return r_err(reader, st, "invalid escape `\\%c'\n", peek_byte(reader)); + } + break; + default: + if (c == q) { + eat_byte_check(reader, q); + return SERD_SUCCESS; + } else { + st = + read_character(reader, ref, flags, (uint8_t)eat_byte_safe(reader, c)); + } + } + } + + return st ? st + : (eat_byte_check(reader, q) ? SERD_SUCCESS : SERD_ERR_BAD_SYNTAX); +} + +static SerdStatus +read_String(SerdReader* reader, Ref node, SerdNodeFlags* flags) +{ + const int q1 = peek_byte(reader); + eat_byte_safe(reader, q1); + + const int q2 = peek_byte(reader); + if (q2 == EOF) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "unexpected end of file\n"); + } + + if (q2 != q1) { // Short string (not triple quoted) + return read_STRING_LITERAL(reader, node, flags, (uint8_t)q1); + } + + eat_byte_safe(reader, q2); + const int q3 = peek_byte(reader); + if (q3 == EOF) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "unexpected end of file\n"); + } + + if (q3 != q1) { // Empty short string ("" or '') + return SERD_SUCCESS; + } + + if (!fancy_syntax(reader)) { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "syntax does not support long literals\n"); + } + + eat_byte_safe(reader, q3); + return read_STRING_LITERAL_LONG(reader, node, flags, (uint8_t)q1); +} + +static inline bool +is_PN_CHARS_BASE(const uint32_t c) +{ + return ((c >= 0x00C0 && c <= 0x00D6) || (c >= 0x00D8 && c <= 0x00F6) || + (c >= 0x00F8 && c <= 0x02FF) || (c >= 0x0370 && c <= 0x037D) || + (c >= 0x037F && c <= 0x1FFF) || (c >= 0x200C && c <= 0x200D) || + (c >= 0x2070 && c <= 0x218F) || (c >= 0x2C00 && c <= 0x2FEF) || + (c >= 0x3001 && c <= 0xD7FF) || (c >= 0xF900 && c <= 0xFDCF) || + (c >= 0xFDF0 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0xEFFFF)); +} + +static SerdStatus +read_PN_CHARS_BASE(SerdReader* reader, Ref dest) +{ + uint32_t code = 0; + const int c = peek_byte(reader); + SerdStatus st = SERD_SUCCESS; + if (is_alpha(c)) { + push_byte(reader, dest, eat_byte_safe(reader, c)); + } else if (c == EOF || !(c & 0x80)) { + return SERD_FAILURE; + } else if ((st = read_utf8_code( + reader, dest, &code, (uint8_t)eat_byte_safe(reader, c)))) { + return st; + } else if (!is_PN_CHARS_BASE(code)) { + r_err( + reader, SERD_ERR_BAD_SYNTAX, "invalid character U+%04X in name\n", code); + if (reader->strict) { + return SERD_ERR_BAD_SYNTAX; + } + } + return st; +} + +static inline bool +is_PN_CHARS(const uint32_t c) +{ + return (is_PN_CHARS_BASE(c) || c == 0xB7 || (c >= 0x0300 && c <= 0x036F) || + (c >= 0x203F && c <= 0x2040)); +} + +static SerdStatus +read_PN_CHARS(SerdReader* reader, Ref dest) +{ + uint32_t code = 0; + const int c = peek_byte(reader); + SerdStatus st = SERD_SUCCESS; + if (is_alpha(c) || is_digit(c) || c == '_' || c == '-') { + push_byte(reader, dest, eat_byte_safe(reader, c)); + } else if (c == EOF || !(c & 0x80)) { + return SERD_FAILURE; + } else if ((st = read_utf8_code( + reader, dest, &code, (uint8_t)eat_byte_safe(reader, c)))) { + return st; + } else if (!is_PN_CHARS(code)) { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "invalid character U+%04X in name\n", code); + } + return st; +} + +static SerdStatus +read_PERCENT(SerdReader* reader, Ref dest) +{ + push_byte(reader, dest, eat_byte_safe(reader, '%')); + const uint8_t h1 = read_HEX(reader); + const uint8_t h2 = read_HEX(reader); + if (h1 && h2) { + push_byte(reader, dest, h1); + return push_byte(reader, dest, h2); + } + + return SERD_ERR_BAD_SYNTAX; +} + +static SerdStatus +read_PN_LOCAL_ESC(SerdReader* reader, Ref dest) +{ + eat_byte_safe(reader, '\\'); + + const int c = peek_byte(reader); + switch (c) { + case '!': + case '#': + case '$': + case '%': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case ';': + case '=': + case '?': + case '@': + case '_': + case '~': + push_byte(reader, dest, eat_byte_safe(reader, c)); + break; + default: + return r_err(reader, SERD_ERR_BAD_SYNTAX, "invalid escape\n"); + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_PLX(SerdReader* reader, Ref dest) +{ + const int c = peek_byte(reader); + switch (c) { + case '%': + return read_PERCENT(reader, dest); + case '\\': + return read_PN_LOCAL_ESC(reader, dest); + default: + return SERD_FAILURE; + } +} + +static SerdStatus +read_PN_LOCAL(SerdReader* reader, Ref dest, bool* ate_dot) +{ + int c = peek_byte(reader); + SerdStatus st = SERD_SUCCESS; + bool trailing_unescaped_dot = false; + switch (c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case '_': + push_byte(reader, dest, eat_byte_safe(reader, c)); + break; + default: + if ((st = read_PLX(reader, dest)) > SERD_FAILURE) { + return r_err(reader, st, "bad escape\n"); + } else if (st != SERD_SUCCESS && read_PN_CHARS_BASE(reader, dest)) { + return SERD_FAILURE; + } + } + + while ((c = peek_byte(reader))) { // Middle: (PN_CHARS | '.' | ':')* + if (c == '.' || c == ':') { + push_byte(reader, dest, eat_byte_safe(reader, c)); + } else if ((st = read_PLX(reader, dest)) > SERD_FAILURE) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "bad escape\n"); + } else if (st != SERD_SUCCESS && (st = read_PN_CHARS(reader, dest))) { + break; + } + trailing_unescaped_dot = (c == '.'); + } + + SerdNode* const n = deref(reader, dest); + if (trailing_unescaped_dot) { + // Ate trailing dot, pop it from stack/node and inform caller + --n->n_bytes; + serd_stack_pop(&reader->stack, 1); + *ate_dot = true; + } + + return (st > SERD_FAILURE) ? st : SERD_SUCCESS; +} + +// Read the remainder of a PN_PREFIX after some initial characters +static SerdStatus +read_PN_PREFIX_tail(SerdReader* reader, Ref dest) +{ + int c = 0; + while ((c = peek_byte(reader))) { // Middle: (PN_CHARS | '.')* + if (c == '.') { + push_byte(reader, dest, eat_byte_safe(reader, c)); + } else if (read_PN_CHARS(reader, dest)) { + break; + } + } + + const SerdNode* const n = deref(reader, dest); + if (n->buf[n->n_bytes - 1] == '.' && read_PN_CHARS(reader, dest)) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "prefix ends with `.'\n"); + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_PN_PREFIX(SerdReader* reader, Ref dest) +{ + if (!read_PN_CHARS_BASE(reader, dest)) { + return read_PN_PREFIX_tail(reader, dest); + } + + return SERD_FAILURE; +} + +static SerdStatus +read_LANGTAG(SerdReader* reader, Ref* dest) +{ + int c = peek_byte(reader); + if (!is_alpha(c)) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "unexpected `%c'\n", c); + } + + *dest = push_node(reader, SERD_LITERAL, "", 0); + + SerdStatus st = SERD_SUCCESS; + TRY(st, push_byte(reader, *dest, eat_byte_safe(reader, c))); + while ((c = peek_byte(reader)) && is_alpha(c)) { + TRY(st, push_byte(reader, *dest, eat_byte_safe(reader, c))); + } + + while (peek_byte(reader) == '-') { + TRY(st, push_byte(reader, *dest, eat_byte_safe(reader, '-'))); + while ((c = peek_byte(reader)) && (is_alpha(c) || is_digit(c))) { + TRY(st, push_byte(reader, *dest, eat_byte_safe(reader, c))); + } + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_IRIREF_scheme(SerdReader* reader, Ref dest) +{ + int c = peek_byte(reader); + if (!is_alpha(c)) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "bad IRI scheme start `%c'\n", c); + } + + while ((c = peek_byte(reader)) != EOF) { + if (c == '>') { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "missing IRI scheme\n"); + } + + if (!is_uri_scheme_char(c)) { + return r_err(reader, + SERD_ERR_BAD_SYNTAX, + "bad IRI scheme char U+%04X (%c)\n", + (unsigned)c, + (char)c); + } + + push_byte(reader, dest, eat_byte_safe(reader, c)); + if (c == ':') { + return SERD_SUCCESS; // End of scheme + } + } + + return r_err(reader, SERD_ERR_BAD_SYNTAX, "unexpected end of file\n"); +} + +static SerdStatus +read_IRIREF(SerdReader* reader, Ref* dest) +{ + if (!eat_byte_check(reader, '<')) { + return SERD_ERR_BAD_SYNTAX; + } + + *dest = push_node(reader, SERD_URI, "", 0); + + if (!fancy_syntax(reader) && read_IRIREF_scheme(reader, *dest)) { + *dest = pop_node(reader, *dest); + return r_err(reader, SERD_ERR_BAD_SYNTAX, "expected IRI scheme\n"); + } + + SerdStatus st = SERD_SUCCESS; + uint32_t code = 0; + while (!st) { + const int c = eat_byte_safe(reader, peek_byte(reader)); + switch (c) { + case '"': + case '<': + *dest = pop_node(reader, *dest); + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "invalid IRI character `%c'\n", c); + + case '>': + return SERD_SUCCESS; + + case '\\': + if (read_UCHAR(reader, *dest, &code)) { + *dest = pop_node(reader, *dest); + return r_err(reader, SERD_ERR_BAD_SYNTAX, "invalid IRI escape\n"); + } + + switch (code) { + case 0: + case ' ': + case '<': + case '>': + *dest = pop_node(reader, *dest); + return r_err(reader, + SERD_ERR_BAD_SYNTAX, + "invalid escaped IRI character U+%04X\n", + code); + default: + break; + } + break; + + case '^': + case '`': + case '{': + case '|': + case '}': + *dest = pop_node(reader, *dest); + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "invalid IRI character `%c'\n", c); + + default: + if (c <= 0x20) { + r_err(reader, + SERD_ERR_BAD_SYNTAX, + "invalid IRI character (escape %%%02X)\n", + (unsigned)c); + if (reader->strict) { + *dest = pop_node(reader, *dest); + return SERD_ERR_BAD_SYNTAX; + } + st = SERD_FAILURE; + push_byte(reader, *dest, c); + } else if (!(c & 0x80)) { + push_byte(reader, *dest, c); + } else if (read_utf8_character(reader, *dest, (uint8_t)c)) { + if (reader->strict) { + *dest = pop_node(reader, *dest); + return SERD_ERR_BAD_SYNTAX; + } + } + } + } + + *dest = pop_node(reader, *dest); + return st; +} + +static SerdStatus +read_PrefixedName(SerdReader* reader, Ref dest, bool read_prefix, bool* ate_dot) +{ + SerdStatus st = SERD_SUCCESS; + if (read_prefix && ((st = read_PN_PREFIX(reader, dest)) > SERD_FAILURE)) { + return st; + } + + if (peek_byte(reader) != ':') { + return SERD_FAILURE; + } + + push_byte(reader, dest, eat_byte_safe(reader, ':')); + + st = read_PN_LOCAL(reader, dest, ate_dot); + + return (st > SERD_FAILURE) ? st : SERD_SUCCESS; +} + +static SerdStatus +read_0_9(SerdReader* reader, Ref str, bool at_least_one) +{ + unsigned count = 0; + SerdStatus st = SERD_SUCCESS; + for (int c = 0; is_digit((c = peek_byte(reader))); ++count) { + TRY(st, push_byte(reader, str, eat_byte_safe(reader, c))); + } + + if (at_least_one && count == 0) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "expected digit\n"); + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_number(SerdReader* reader, Ref* dest, Ref* datatype, bool* ate_dot) +{ +#define XSD_DECIMAL NS_XSD "decimal" +#define XSD_DOUBLE NS_XSD "double" +#define XSD_INTEGER NS_XSD "integer" + + *dest = push_node(reader, SERD_LITERAL, "", 0); + + SerdStatus st = SERD_SUCCESS; + int c = peek_byte(reader); + bool has_decimal = false; + if (c == '-' || c == '+') { + push_byte(reader, *dest, eat_byte_safe(reader, c)); + } + if ((c = peek_byte(reader)) == '.') { + has_decimal = true; + // decimal case 2 (e.g. '.0' or `-.0' or `+.0') + push_byte(reader, *dest, eat_byte_safe(reader, c)); + TRY(st, read_0_9(reader, *dest, true)); + } else { + // all other cases ::= ( '-' | '+' ) [0-9]+ ( . )? ( [0-9]+ )? ... + TRY(st, read_0_9(reader, *dest, true)); + if ((c = peek_byte(reader)) == '.') { + has_decimal = true; + + // Annoyingly, dot can be end of statement, so tentatively eat + eat_byte_safe(reader, c); + c = peek_byte(reader); + if (!is_digit(c) && c != 'e' && c != 'E') { + *ate_dot = true; // Force caller to deal with stupid grammar + return SERD_SUCCESS; // Next byte is not a number character + } + + push_byte(reader, *dest, '.'); + read_0_9(reader, *dest, false); + } + } + c = peek_byte(reader); + if (c == 'e' || c == 'E') { + // double + push_byte(reader, *dest, eat_byte_safe(reader, c)); + switch ((c = peek_byte(reader))) { + case '+': + case '-': + push_byte(reader, *dest, eat_byte_safe(reader, c)); + default: + break; + } + TRY(st, read_0_9(reader, *dest, true)); + *datatype = push_node(reader, SERD_URI, XSD_DOUBLE, sizeof(XSD_DOUBLE) - 1); + } else if (has_decimal) { + *datatype = + push_node(reader, SERD_URI, XSD_DECIMAL, sizeof(XSD_DECIMAL) - 1); + } else { + *datatype = + push_node(reader, SERD_URI, XSD_INTEGER, sizeof(XSD_INTEGER) - 1); + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_iri(SerdReader* reader, Ref* dest, bool* ate_dot) +{ + switch (peek_byte(reader)) { + case '<': + return read_IRIREF(reader, dest); + default: + *dest = push_node(reader, SERD_CURIE, "", 0); + return read_PrefixedName(reader, *dest, true, ate_dot); + } +} + +static SerdStatus +read_literal(SerdReader* reader, + Ref* dest, + Ref* datatype, + Ref* lang, + SerdNodeFlags* flags, + bool* ate_dot) +{ + *dest = push_node(reader, SERD_LITERAL, "", 0); + + SerdStatus st = read_String(reader, *dest, flags); + if (st) { + *dest = pop_node(reader, *dest); + return st; + } + + switch (peek_byte(reader)) { + case '@': + eat_byte_safe(reader, '@'); + if ((st = read_LANGTAG(reader, lang))) { + *datatype = pop_node(reader, *datatype); + *lang = pop_node(reader, *lang); + *dest = pop_node(reader, *dest); + return r_err(reader, st, "bad literal\n"); + } + break; + case '^': + eat_byte_safe(reader, '^'); + eat_byte_check(reader, '^'); + if ((st = read_iri(reader, datatype, ate_dot))) { + *datatype = pop_node(reader, *datatype); + *lang = pop_node(reader, *lang); + *dest = pop_node(reader, *dest); + return r_err(reader, st, "bad literal\n"); + } + break; + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_verb(SerdReader* reader, Ref* dest) +{ + if (peek_byte(reader) == '<') { + return read_IRIREF(reader, dest); + } + + /* Either a qname, or "a". Read the prefix first, and if it is in fact + "a", produce that instead. + */ + *dest = push_node(reader, SERD_CURIE, "", 0); + + SerdStatus st = read_PN_PREFIX(reader, *dest); + bool ate_dot = false; + SerdNode* node = deref(reader, *dest); + const int next = peek_byte(reader); + if (!st && node->n_bytes == 1 && node->buf[0] == 'a' && next != ':' && + !is_PN_CHARS_BASE((uint32_t)next)) { + pop_node(reader, *dest); + *dest = push_node(reader, SERD_URI, NS_RDF "type", 47); + return SERD_SUCCESS; + } + + if (st > SERD_FAILURE || read_PrefixedName(reader, *dest, false, &ate_dot) || + ate_dot) { + *dest = pop_node(reader, *dest); + return r_err(reader, SERD_ERR_BAD_SYNTAX, "bad verb\n"); + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_BLANK_NODE_LABEL(SerdReader* reader, Ref* dest, bool* ate_dot) +{ + eat_byte_safe(reader, '_'); + eat_byte_check(reader, ':'); + + const Ref ref = *dest = + push_node(reader, + SERD_BLANK, + reader->bprefix ? (char*)reader->bprefix : "", + reader->bprefix_len); + + int c = peek_byte(reader); // First: (PN_CHARS | '_' | [0-9]) + if (is_digit(c) || c == '_') { + push_byte(reader, ref, eat_byte_safe(reader, c)); + } else if (read_PN_CHARS(reader, ref)) { + *dest = pop_node(reader, *dest); + return r_err(reader, SERD_ERR_BAD_SYNTAX, "invalid name start\n"); + } + + while ((c = peek_byte(reader))) { // Middle: (PN_CHARS | '.')* + if (c == '.') { + push_byte(reader, ref, eat_byte_safe(reader, c)); + } else if (read_PN_CHARS(reader, ref)) { + break; + } + } + + SerdNode* n = deref(reader, ref); + if (n->buf[n->n_bytes - 1] == '.' && read_PN_CHARS(reader, ref)) { + // Ate trailing dot, pop it from stack/node and inform caller + --n->n_bytes; + serd_stack_pop(&reader->stack, 1); + *ate_dot = true; + } + + if (fancy_syntax(reader)) { + if (is_digit(n->buf[reader->bprefix_len + 1])) { + if ((n->buf[reader->bprefix_len]) == 'b') { + ((char*)n->buf)[reader->bprefix_len] = 'B'; // Prevent clash + reader->seen_genid = true; + } else if (reader->seen_genid && n->buf[reader->bprefix_len] == 'B') { + *dest = pop_node(reader, *dest); + return r_err(reader, + SERD_ERR_ID_CLASH, + "found both `b' and `B' blank IDs, prefix required\n"); + } + } + } + + return SERD_SUCCESS; +} + +static Ref +read_blankName(SerdReader* reader) +{ + eat_byte_safe(reader, '='); + if (eat_byte_check(reader, '=') != '=') { + r_err(reader, SERD_ERR_BAD_SYNTAX, "expected `='\n"); + return 0; + } + + Ref subject = 0; + bool ate_dot = false; + read_ws_star(reader); + read_iri(reader, &subject, &ate_dot); + return subject; +} + +static SerdStatus +read_anon(SerdReader* reader, ReadContext ctx, bool subject, Ref* dest) +{ + const SerdStatementFlags old_flags = *ctx.flags; + bool empty = false; + eat_byte_safe(reader, '['); + if ((empty = peek_delim(reader, ']'))) { + *ctx.flags |= (subject) ? SERD_EMPTY_S : SERD_EMPTY_O; + } else { + *ctx.flags |= (subject) ? SERD_ANON_S_BEGIN : SERD_ANON_O_BEGIN; + if (peek_delim(reader, '=')) { + if (!(*dest = read_blankName(reader)) || !eat_delim(reader, ';')) { + return SERD_ERR_BAD_SYNTAX; + } + } + } + + if (!*dest) { + *dest = blank_id(reader); + } + + SerdStatus st = SERD_SUCCESS; + if (ctx.subject) { + TRY(st, emit_statement(reader, ctx, *dest, 0, 0)); + } + + ctx.subject = *dest; + if (!empty) { + *ctx.flags &= ~(unsigned)SERD_LIST_CONT; + if (!subject) { + *ctx.flags |= SERD_ANON_CONT; + } + + bool ate_dot_in_list = false; + read_predicateObjectList(reader, ctx, &ate_dot_in_list); + if (ate_dot_in_list) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "`.' inside blank\n"); + } + + read_ws_star(reader); + if (reader->end_sink) { + reader->end_sink(reader->handle, deref(reader, *dest)); + } + + *ctx.flags = old_flags; + } + + return (eat_byte_check(reader, ']') == ']') ? SERD_SUCCESS + : SERD_ERR_BAD_SYNTAX; +} + +/* If emit is true: recurses, calling statement_sink for every statement + encountered, and leaves stack in original calling state (i.e. pops + everything it pushes). */ +static SerdStatus +read_object(SerdReader* reader, ReadContext* ctx, bool emit, bool* ate_dot) +{ + static const char* const XSD_BOOLEAN = NS_XSD "boolean"; + static const size_t XSD_BOOLEAN_LEN = 40; + +#ifndef NDEBUG + const size_t orig_stack_size = reader->stack.size; +#endif + + SerdStatus ret = SERD_FAILURE; + + bool simple = (ctx->subject != 0); + SerdNode* node = NULL; + Ref o = 0; + Ref datatype = 0; + Ref lang = 0; + uint32_t flags = 0; + const int c = peek_byte(reader); + if (!fancy_syntax(reader)) { + switch (c) { + case '"': + case ':': + case '<': + case '_': + break; + default: + return r_err(reader, SERD_ERR_BAD_SYNTAX, "expected: ':', '<', or '_'\n"); + } + } + switch (c) { + case EOF: + case ')': + return r_err(reader, SERD_ERR_BAD_SYNTAX, "expected object\n"); + case '[': + simple = false; + ret = read_anon(reader, *ctx, false, &o); + break; + case '(': + simple = false; + ret = read_collection(reader, *ctx, &o); + break; + case '_': + ret = read_BLANK_NODE_LABEL(reader, &o, ate_dot); + break; + case '<': + case ':': + ret = read_iri(reader, &o, ate_dot); + break; + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + ret = read_number(reader, &o, &datatype, ate_dot); + break; + case '\"': + case '\'': + ret = read_literal(reader, &o, &datatype, &lang, &flags, ate_dot); + break; + default: + /* Either a boolean literal, or a qname. Read the prefix first, and if + it is in fact a "true" or "false" literal, produce that instead. + */ + o = push_node(reader, SERD_CURIE, "", 0); + while (!read_PN_CHARS_BASE(reader, o)) { + } + node = deref(reader, o); + if ((node->n_bytes == 4 && !memcmp(node->buf, "true", 4)) || + (node->n_bytes == 5 && !memcmp(node->buf, "false", 5))) { + node->type = SERD_LITERAL; + datatype = push_node(reader, SERD_URI, XSD_BOOLEAN, XSD_BOOLEAN_LEN); + ret = SERD_SUCCESS; + } else if (read_PN_PREFIX_tail(reader, o) > SERD_FAILURE) { + ret = SERD_ERR_BAD_SYNTAX; + } else { + if ((ret = read_PrefixedName(reader, o, false, ate_dot))) { + ret = ret > SERD_FAILURE ? ret : SERD_ERR_BAD_SYNTAX; + pop_node(reader, o); + return r_err(reader, ret, "expected prefixed name\n"); + } + } + } + + if (!ret && simple && o) { + deref(reader, o)->flags = flags; + } + + if (!ret && emit && simple) { + ret = emit_statement(reader, *ctx, o, datatype, lang); + } else if (!ret && !emit) { + ctx->object = o; + ctx->datatype = datatype; + ctx->lang = lang; + return SERD_SUCCESS; + } + + pop_node(reader, lang); + pop_node(reader, datatype); + pop_node(reader, o); +#ifndef NDEBUG + assert(reader->stack.size == orig_stack_size); +#endif + return ret; +} + +static SerdStatus +read_objectList(SerdReader* reader, ReadContext ctx, bool* ate_dot) +{ + SerdStatus st = SERD_SUCCESS; + TRY(st, read_object(reader, &ctx, true, ate_dot)); + if (!fancy_syntax(reader) && peek_delim(reader, ',')) { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "syntax does not support abbreviation\n"); + } + + while (!*ate_dot && eat_delim(reader, ',')) { + st = read_object(reader, &ctx, true, ate_dot); + } + + return st; +} + +static SerdStatus +read_predicateObjectList(SerdReader* reader, ReadContext ctx, bool* ate_dot) +{ + SerdStatus st = SERD_SUCCESS; + while (!(st = read_verb(reader, &ctx.predicate)) && read_ws_star(reader) && + !(st = read_objectList(reader, ctx, ate_dot))) { + ctx.predicate = pop_node(reader, ctx.predicate); + if (*ate_dot) { + return SERD_SUCCESS; + } + + bool ate_semi = false; + int c = 0; + do { + read_ws_star(reader); + switch (c = peek_byte(reader)) { + case EOF: + return r_err(reader, SERD_ERR_BAD_SYNTAX, "unexpected end of file\n"); + case '.': + case ']': + case '}': + return SERD_SUCCESS; + case ';': + eat_byte_safe(reader, c); + ate_semi = true; + } + } while (c == ';'); + + if (!ate_semi) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "missing ';' or '.'\n"); + } + } + + ctx.predicate = pop_node(reader, ctx.predicate); + return st; +} + +static SerdStatus +end_collection(SerdReader* reader, + ReadContext ctx, + Ref n1, + Ref n2, + SerdStatus st) +{ + pop_node(reader, n2); + pop_node(reader, n1); + *ctx.flags &= ~(unsigned)SERD_LIST_CONT; + if (!st) { + return (eat_byte_check(reader, ')') == ')') ? SERD_SUCCESS + : SERD_ERR_BAD_SYNTAX; + } + + return st; +} + +static SerdStatus +read_collection(SerdReader* reader, ReadContext ctx, Ref* dest) +{ + SerdStatus st = SERD_SUCCESS; + eat_byte_safe(reader, '('); + + bool end = peek_delim(reader, ')'); + + *dest = end ? reader->rdf_nil : blank_id(reader); + if (ctx.subject) { + // subject predicate _:head + *ctx.flags |= (end ? 0 : SERD_LIST_O_BEGIN); + TRY(st, emit_statement(reader, ctx, *dest, 0, 0)); + *ctx.flags |= SERD_LIST_CONT; + } else { + *ctx.flags |= (end ? 0 : SERD_LIST_S_BEGIN); + } + + if (end) { + return end_collection(reader, ctx, 0, 0, st); + } + + /* The order of node allocation here is necessarily not in stack order, + so we create two nodes and recycle them throughout. */ + Ref n1 = push_node_padded(reader, genid_size(reader), SERD_BLANK, "", 0); + Ref n2 = 0; + Ref node = n1; + Ref rest = 0; + + ctx.subject = *dest; + while (!peek_delim(reader, ')')) { + // _:node rdf:first object + ctx.predicate = reader->rdf_first; + bool ate_dot = false; + if ((st = read_object(reader, &ctx, true, &ate_dot)) || ate_dot) { + return end_collection(reader, ctx, n1, n2, st); + } + + if (!(end = peek_delim(reader, ')'))) { + /* Give rest a new ID. Done as late as possible to ensure it is + used and > IDs generated by read_object above. */ + if (!rest) { + rest = n2 = blank_id(reader); // First pass, push + } else { + set_blank_id(reader, rest, genid_size(reader)); + } + } + + // _:node rdf:rest _:rest + *ctx.flags |= SERD_LIST_CONT; + ctx.predicate = reader->rdf_rest; + TRY(st, emit_statement(reader, ctx, (end ? reader->rdf_nil : rest), 0, 0)); + + ctx.subject = rest; // _:node = _:rest + rest = node; // _:rest = (old)_:node + node = ctx.subject; // invariant + } + + return end_collection(reader, ctx, n1, n2, st); +} + +static SerdStatus +read_subject(SerdReader* reader, ReadContext ctx, Ref* dest, int* s_type) +{ + SerdStatus st = SERD_SUCCESS; + bool ate_dot = false; + switch ((*s_type = peek_byte(reader))) { + case '[': + read_anon(reader, ctx, true, dest); + break; + case '(': + st = read_collection(reader, ctx, dest); + break; + case '_': + st = read_BLANK_NODE_LABEL(reader, dest, &ate_dot); + break; + default: + st = read_iri(reader, dest, &ate_dot); + } + + if (ate_dot) { + pop_node(reader, *dest); + return r_err(reader, SERD_ERR_BAD_SYNTAX, "subject ends with `.'\n"); + } + + return st; +} + +static SerdStatus +read_labelOrSubject(SerdReader* reader, Ref* dest) +{ + bool ate_dot = false; + switch (peek_byte(reader)) { + case '[': + eat_byte_safe(reader, '['); + read_ws_star(reader); + if (!eat_byte_check(reader, ']')) { + return SERD_ERR_BAD_SYNTAX; + } + *dest = blank_id(reader); + return SERD_SUCCESS; + case '_': + return read_BLANK_NODE_LABEL(reader, dest, &ate_dot); + default: + if (!read_iri(reader, dest, &ate_dot)) { + return SERD_SUCCESS; + } else { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "expected label or subject\n"); + } + } +} + +static SerdStatus +read_triples(SerdReader* reader, ReadContext ctx, bool* ate_dot) +{ + SerdStatus st = SERD_FAILURE; + if (ctx.subject) { + read_ws_star(reader); + switch (peek_byte(reader)) { + case '.': + *ate_dot = eat_byte_safe(reader, '.'); + return SERD_FAILURE; + case '}': + return SERD_FAILURE; + } + st = read_predicateObjectList(reader, ctx, ate_dot); + } + + ctx.subject = ctx.predicate = 0; + return st > SERD_FAILURE ? st : SERD_SUCCESS; +} + +static SerdStatus +read_base(SerdReader* reader, bool sparql, bool token) +{ + SerdStatus st = SERD_SUCCESS; + if (token) { + TRY(st, eat_string(reader, "base", 4)); + } + + read_ws_star(reader); + + Ref uri = 0; + TRY(st, read_IRIREF(reader, &uri)); + if (reader->base_sink) { + TRY(st, reader->base_sink(reader->handle, deref(reader, uri))); + } + pop_node(reader, uri); + + read_ws_star(reader); + if (!sparql) { + return eat_byte_check(reader, '.') ? SERD_SUCCESS : SERD_ERR_BAD_SYNTAX; + } + + if (peek_byte(reader) == '.') { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "full stop after SPARQL BASE\n"); + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_prefixID(SerdReader* reader, bool sparql, bool token) +{ + SerdStatus st = SERD_SUCCESS; + if (token) { + TRY(st, eat_string(reader, "prefix", 6)); + } + + read_ws_star(reader); + Ref name = push_node(reader, SERD_LITERAL, "", 0); + if ((st = read_PN_PREFIX(reader, name)) > SERD_FAILURE) { + return st; + } + + if (eat_byte_check(reader, ':') != ':') { + pop_node(reader, name); + return SERD_ERR_BAD_SYNTAX; + } + + read_ws_star(reader); + Ref uri = 0; + TRY(st, read_IRIREF(reader, &uri)); + + if (reader->prefix_sink) { + st = reader->prefix_sink( + reader->handle, deref(reader, name), deref(reader, uri)); + } + + pop_node(reader, uri); + pop_node(reader, name); + if (!sparql) { + read_ws_star(reader); + st = eat_byte_check(reader, '.') ? SERD_SUCCESS : SERD_ERR_BAD_SYNTAX; + } + + return st; +} + +static SerdStatus +read_directive(SerdReader* reader) +{ + const bool sparql = peek_byte(reader) != '@'; + if (!sparql) { + eat_byte_safe(reader, '@'); + switch (peek_byte(reader)) { + case 'B': + case 'P': + return r_err(reader, SERD_ERR_BAD_SYNTAX, "uppercase directive\n"); + } + } + + switch (peek_byte(reader)) { + case 'B': + case 'b': + return read_base(reader, sparql, true); + case 'P': + case 'p': + return read_prefixID(reader, sparql, true); + default: + break; + } + + return r_err(reader, SERD_ERR_BAD_SYNTAX, "invalid directive\n"); +} + +static SerdStatus +read_wrappedGraph(SerdReader* reader, ReadContext* ctx) +{ + if (!eat_byte_check(reader, '{')) { + return SERD_ERR_BAD_SYNTAX; + } + + read_ws_star(reader); + while (peek_byte(reader) != '}') { + bool ate_dot = false; + int s_type = 0; + ctx->subject = 0; + SerdStatus st = read_subject(reader, *ctx, &ctx->subject, &s_type); + if (st) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "bad subject\n"); + } + + if (read_triples(reader, *ctx, &ate_dot) && s_type != '[') { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "missing predicate object list\n"); + } + + pop_node(reader, ctx->subject); + read_ws_star(reader); + if (peek_byte(reader) == '.') { + eat_byte_safe(reader, '.'); + } + read_ws_star(reader); + } + + eat_byte_safe(reader, '}'); + read_ws_star(reader); + if (peek_byte(reader) == '.') { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "graph followed by `.'\n"); + } + + return SERD_SUCCESS; +} + +static int +tokcmp(SerdReader* reader, Ref ref, const char* tok, size_t n) +{ + SerdNode* node = deref(reader, ref); + if (!node || node->n_bytes != n) { + return -1; + } + + return serd_strncasecmp((const char*)node->buf, tok, n); +} + +SerdStatus +read_n3_statement(SerdReader* reader) +{ + SerdStatementFlags flags = 0; + ReadContext ctx = {0, 0, 0, 0, 0, 0, &flags}; + bool ate_dot = false; + int s_type = 0; + SerdStatus st = SERD_SUCCESS; + read_ws_star(reader); + switch (peek_byte(reader)) { + case '\0': + eat_byte_safe(reader, '\0'); + return SERD_FAILURE; + case EOF: + return SERD_FAILURE; + case '@': + if (!fancy_syntax(reader)) { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "syntax does not support directives\n"); + } + TRY(st, read_directive(reader)); + read_ws_star(reader); + break; + case '{': + if (reader->syntax == SERD_TRIG) { + TRY(st, read_wrappedGraph(reader, &ctx)); + read_ws_star(reader); + } else { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "syntax does not support graphs\n"); + } + break; + default: + if ((st = read_subject(reader, ctx, &ctx.subject, &s_type)) > + SERD_FAILURE) { + return st; + } + + if (!tokcmp(reader, ctx.subject, "base", 4)) { + st = read_base(reader, true, false); + } else if (!tokcmp(reader, ctx.subject, "prefix", 6)) { + st = read_prefixID(reader, true, false); + } else if (!tokcmp(reader, ctx.subject, "graph", 5)) { + read_ws_star(reader); + TRY(st, read_labelOrSubject(reader, &ctx.graph)); + read_ws_star(reader); + TRY(st, read_wrappedGraph(reader, &ctx)); + pop_node(reader, ctx.graph); + ctx.graph = 0; + read_ws_star(reader); + } else if (read_ws_star(reader) && peek_byte(reader) == '{') { + if (s_type == '(' || (s_type == '[' && !*ctx.flags)) { + return r_err(reader, SERD_ERR_BAD_SYNTAX, "invalid graph name\n"); + } + ctx.graph = ctx.subject; + ctx.subject = 0; + TRY(st, read_wrappedGraph(reader, &ctx)); + pop_node(reader, ctx.graph); + read_ws_star(reader); + } else if ((st = read_triples(reader, ctx, &ate_dot))) { + if (st == SERD_FAILURE && s_type == '[') { + return SERD_SUCCESS; + } + + if (ate_dot) { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "unexpected end of statement\n"); + } + + return st > SERD_FAILURE ? st : SERD_ERR_BAD_SYNTAX; + } else if (!ate_dot) { + read_ws_star(reader); + st = (eat_byte_check(reader, '.') == '.') ? SERD_SUCCESS + : SERD_ERR_BAD_SYNTAX; + } + break; + } + return st; +} + +static void +skip_until(SerdReader* reader, uint8_t byte) +{ + for (int c = 0; (c = peek_byte(reader)) && c != byte;) { + eat_byte_safe(reader, c); + } +} + +SerdStatus +read_turtleTrigDoc(SerdReader* reader) +{ + while (!reader->source.eof) { + const SerdStatus st = read_n3_statement(reader); + if (st > SERD_FAILURE) { + if (reader->strict) { + return st; + } + skip_until(reader, '\n'); + } + } + + return SERD_SUCCESS; +} + +SerdStatus +read_nquadsDoc(SerdReader* reader) +{ + SerdStatus st = SERD_SUCCESS; + while (!reader->source.eof) { + SerdStatementFlags flags = 0; + ReadContext ctx = {0, 0, 0, 0, 0, 0, &flags}; + bool ate_dot = false; + int s_type = 0; + read_ws_star(reader); + if (peek_byte(reader) == EOF) { + break; + } + + if (peek_byte(reader) == '@') { + return r_err( + reader, SERD_ERR_BAD_SYNTAX, "syntax does not support directives\n"); + } + + // subject predicate object + if ((st = read_subject(reader, ctx, &ctx.subject, &s_type)) || + !read_ws_star(reader) || (st = read_IRIREF(reader, &ctx.predicate)) || + !read_ws_star(reader) || + (st = read_object(reader, &ctx, false, &ate_dot))) { + return st; + } + + if (!ate_dot) { // graphLabel? + read_ws_star(reader); + switch (peek_byte(reader)) { + case '.': + break; + case '_': + TRY(st, read_BLANK_NODE_LABEL(reader, &ctx.graph, &ate_dot)); + break; + default: + TRY(st, read_IRIREF(reader, &ctx.graph)); + } + + // Terminating '.' + read_ws_star(reader); + if (!eat_byte_check(reader, '.')) { + return SERD_ERR_BAD_SYNTAX; + } + } + + TRY(st, emit_statement(reader, ctx, ctx.object, ctx.datatype, ctx.lang)); + + pop_node(reader, ctx.graph); + pop_node(reader, ctx.lang); + pop_node(reader, ctx.datatype); + pop_node(reader, ctx.object); + } + return SERD_SUCCESS; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c new file mode 100644 index 00000000..02aedbf2 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.c @@ -0,0 +1,393 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "node.h" + +#include "base64.h" +#include "string_utils.h" + +#include "serd/serd.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +# ifndef isnan +# define isnan(x) _isnan(x) +# endif +# ifndef isinf +# define isinf(x) (!_finite(x)) +# endif +#endif + +SerdNode +serd_node_from_string(SerdType type, const uint8_t* str) +{ + if (!str) { + return SERD_NODE_NULL; + } + + SerdNodeFlags flags = 0; + size_t buf_n_bytes = 0; + const size_t buf_n_chars = serd_strlen(str, &buf_n_bytes, &flags); + SerdNode ret = {str, buf_n_bytes, buf_n_chars, flags, type}; + return ret; +} + +SerdNode +serd_node_from_substring(SerdType type, const uint8_t* str, const size_t len) +{ + if (!str) { + return SERD_NODE_NULL; + } + + SerdNodeFlags flags = 0; + size_t buf_n_bytes = 0; + const size_t buf_n_chars = serd_substrlen(str, len, &buf_n_bytes, &flags); + assert(buf_n_bytes <= len); + SerdNode ret = {str, buf_n_bytes, buf_n_chars, flags, type}; + return ret; +} + +SerdNode +serd_node_copy(const SerdNode* node) +{ + if (!node || !node->buf) { + return SERD_NODE_NULL; + } + + SerdNode copy = *node; + uint8_t* buf = (uint8_t*)malloc(copy.n_bytes + 1); + memcpy(buf, node->buf, copy.n_bytes + 1); + copy.buf = buf; + return copy; +} + +bool +serd_node_equals(const SerdNode* a, const SerdNode* b) +{ + return (a == b) || + (a->type == b->type && a->n_bytes == b->n_bytes && + a->n_chars == b->n_chars && + ((a->buf == b->buf) || + !memcmp((const char*)a->buf, (const char*)b->buf, a->n_bytes + 1))); +} + +static size_t +serd_uri_string_length(const SerdURI* uri) +{ + size_t len = uri->path_base.len; + +#define ADD_LEN(field, n_delims) \ + if ((field).len) { \ + len += (field).len + (n_delims); \ + } + + ADD_LEN(uri->path, 1) // + possible leading `/' + ADD_LEN(uri->scheme, 1) // + trailing `:' + ADD_LEN(uri->authority, 2) // + leading `//' + ADD_LEN(uri->query, 1) // + leading `?' + ADD_LEN(uri->fragment, 1) // + leading `#' + + return len + 2; // + 2 for authority `//' +} + +static size_t +string_sink(const void* buf, size_t len, void* stream) +{ + uint8_t** ptr = (uint8_t**)stream; + memcpy(*ptr, buf, len); + *ptr += len; + return len; +} + +SerdNode +serd_node_new_uri_from_node(const SerdNode* uri_node, + const SerdURI* base, + SerdURI* out) +{ + return (uri_node->type == SERD_URI && uri_node->buf) + ? serd_node_new_uri_from_string(uri_node->buf, base, out) + : SERD_NODE_NULL; +} + +SerdNode +serd_node_new_uri_from_string(const uint8_t* str, + const SerdURI* base, + SerdURI* out) +{ + if (!str || str[0] == '\0') { + // Empty URI => Base URI, or nothing if no base is given + return base ? serd_node_new_uri(base, NULL, out) : SERD_NODE_NULL; + } + + SerdURI uri; + serd_uri_parse(str, &uri); + return serd_node_new_uri(&uri, base, out); // Resolve/Serialise +} + +static inline bool +is_uri_path_char(const uint8_t c) +{ + if (is_alpha(c) || is_digit(c)) { + return true; + } + + switch (c) { + // unreserved: + case '-': + case '.': + case '_': + case '~': + // pchar: + case ':': + case '@': + // separator: + case '/': + // sub-delimeters: + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case ';': + case '=': + return true; + default: + return false; + } +} + +SerdNode +serd_node_new_file_uri(const uint8_t* path, + const uint8_t* hostname, + SerdURI* out, + bool escape) +{ + const size_t path_len = strlen((const char*)path); + const size_t hostname_len = hostname ? strlen((const char*)hostname) : 0; + const bool is_windows = is_windows_path(path); + size_t uri_len = 0; + uint8_t* uri = NULL; + + if (path[0] == '/' || is_windows) { + uri_len = strlen("file://") + hostname_len + is_windows; + uri = (uint8_t*)calloc(uri_len + 1, 1); + + memcpy(uri, "file://", 7); + + if (hostname) { + memcpy(uri + 7, hostname, hostname_len); + } + + if (is_windows) { + ((char*)uri)[7 + hostname_len] = '/'; + } + } + + SerdChunk chunk = {uri, uri_len}; + for (size_t i = 0; i < path_len; ++i) { + if (is_windows && path[i] == '\\') { + serd_chunk_sink("/", 1, &chunk); + } else if (path[i] == '%') { + serd_chunk_sink("%%", 2, &chunk); + } else if (!escape || is_uri_path_char(path[i])) { + serd_chunk_sink(path + i, 1, &chunk); + } else { + char escape_str[4] = {'%', 0, 0, 0}; + snprintf(escape_str + 1, sizeof(escape_str) - 1, "%X", (unsigned)path[i]); + serd_chunk_sink(escape_str, 3, &chunk); + } + } + + serd_chunk_sink_finish(&chunk); + + if (out) { + serd_uri_parse(chunk.buf, out); + } + + return serd_node_from_substring(SERD_URI, chunk.buf, chunk.len); +} + +SerdNode +serd_node_new_uri(const SerdURI* uri, const SerdURI* base, SerdURI* out) +{ + SerdURI abs_uri = *uri; + if (base) { + serd_uri_resolve(uri, base, &abs_uri); + } + + const size_t len = serd_uri_string_length(&abs_uri); + uint8_t* buf = (uint8_t*)malloc(len + 1); + SerdNode node = {buf, 0, 0, 0, SERD_URI}; + uint8_t* ptr = buf; + const size_t actual_len = serd_uri_serialise(&abs_uri, string_sink, &ptr); + + buf[actual_len] = '\0'; + node.n_bytes = actual_len; + node.n_chars = serd_strlen(buf, NULL, NULL); + + if (out) { + serd_uri_parse(buf, out); // TODO: cleverly avoid double parse + } + + return node; +} + +SerdNode +serd_node_new_relative_uri(const SerdURI* uri, + const SerdURI* base, + const SerdURI* root, + SerdURI* out) +{ + const size_t uri_len = serd_uri_string_length(uri); + const size_t base_len = serd_uri_string_length(base); + uint8_t* buf = (uint8_t*)malloc(uri_len + base_len + 1); + SerdNode node = {buf, 0, 0, 0, SERD_URI}; + uint8_t* ptr = buf; + const size_t actual_len = + serd_uri_serialise_relative(uri, base, root, string_sink, &ptr); + + buf[actual_len] = '\0'; + node.n_bytes = actual_len; + node.n_chars = serd_strlen(buf, NULL, NULL); + + if (out) { + serd_uri_parse(buf, out); // TODO: cleverly avoid double parse + } + + return node; +} + +static inline unsigned +serd_digits(double abs) +{ + const double lg = ceil(log10(floor(abs) + 1.0)); + return lg < 1.0 ? 1U : (unsigned)lg; +} + +SerdNode +serd_node_new_decimal(double d, unsigned frac_digits) +{ + if (isnan(d) || isinf(d)) { + return SERD_NODE_NULL; + } + + const double abs_d = fabs(d); + const unsigned int_digits = serd_digits(abs_d); + char* buf = (char*)calloc(int_digits + frac_digits + 3, 1); + SerdNode node = {(const uint8_t*)buf, 0, 0, 0, SERD_LITERAL}; + const double int_part = floor(abs_d); + + // Point s to decimal point location + char* s = buf + int_digits; + if (d < 0.0) { + *buf = '-'; + ++s; + } + + // Write integer part (right to left) + char* t = s - 1; + uint64_t dec = (uint64_t)int_part; + do { + *t-- = (char)('0' + dec % 10); + } while ((dec /= 10) > 0); + + *s++ = '.'; + + // Write fractional part (right to left) + double frac_part = fabs(d - int_part); + if (frac_part < DBL_EPSILON) { + *s++ = '0'; + node.n_bytes = node.n_chars = (size_t)(s - buf); + } else { + uint64_t frac = (uint64_t)llround(frac_part * pow(10.0, (int)frac_digits)); + s += frac_digits - 1; + unsigned i = 0; + + // Skip trailing zeros + for (; i < frac_digits - 1 && !(frac % 10); ++i, --s, frac /= 10) { + } + + node.n_bytes = node.n_chars = (size_t)(s - buf) + 1u; + + // Write digits from last trailing zero to decimal point + for (; i < frac_digits; ++i) { + *s-- = (char)('0' + (frac % 10)); + frac /= 10; + } + } + + return node; +} + +SerdNode +serd_node_new_integer(int64_t i) +{ + uint64_t abs_i = (i < 0) ? -i : i; + const unsigned digits = serd_digits((double)abs_i); + char* buf = (char*)calloc(digits + 2, 1); + SerdNode node = {(const uint8_t*)buf, 0, 0, 0, SERD_LITERAL}; + + // Point s to the end + char* s = buf + digits - 1; + if (i < 0) { + *buf = '-'; + ++s; + } + + node.n_bytes = node.n_chars = (size_t)(s - buf) + 1u; + + // Write integer part (right to left) + do { + *s-- = (char)('0' + (abs_i % 10)); + } while ((abs_i /= 10) > 0); + + return node; +} + +SerdNode +serd_node_new_blob(const void* buf, size_t size, bool wrap_lines) +{ + const size_t len = serd_base64_get_length(size, wrap_lines); + uint8_t* str = (uint8_t*)calloc(len + 2, 1); + SerdNode node = {str, len, len, 0, SERD_LITERAL}; + + if (serd_base64_encode(str, buf, size, wrap_lines)) { + node.flags |= SERD_HAS_NEWLINE; + } + + return node; +} + +void +serd_node_free(SerdNode* node) +{ + if (node && node->buf) { + free((uint8_t*)node->buf); + node->buf = NULL; + } +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h new file mode 100644 index 00000000..60f460dd --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/node.h @@ -0,0 +1,48 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef SERD_NODE_H +#define SERD_NODE_H + +#include "serd/serd.h" + +#include + +struct SerdNodeImpl { + size_t n_bytes; /**< Size in bytes (not including null) */ + SerdNodeFlags flags; /**< Node flags (e.g. string properties) */ + SerdType type; /**< Node type */ +}; + +static inline char* +serd_node_buffer(SerdNode* node) +{ + return (char*)(node + 1); +} + +static inline const char* +serd_node_buffer_c(const SerdNode* node) +{ + return (const char*)(node + 1); +} + +SerdNode* +serd_node_malloc(size_t n_bytes, SerdNodeFlags flags, SerdType type); + +void +serd_node_set(SerdNode** dst, const SerdNode* src); + +#endif // SERD_NODE_H diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c new file mode 100644 index 00000000..e21b6aa5 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.c @@ -0,0 +1,425 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "byte_source.h" +#include "reader.h" +#include "stack.h" +#include "system.h" + +#include "serd_internal.h" + +#include +#include +#include +#include +#include +#include + +SerdStatus +r_err(SerdReader* reader, SerdStatus st, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const Cursor* const cur = &reader->source.cur; + const SerdError e = {st, cur->filename, cur->line, cur->col, fmt, &args}; + serd_error(reader->error_sink, reader->error_handle, &e); + va_end(args); + return st; +} + +void +set_blank_id(SerdReader* reader, Ref ref, size_t buf_size) +{ + SerdNode* node = deref(reader, ref); + const char* prefix = reader->bprefix ? (const char*)reader->bprefix : ""; + node->n_bytes = node->n_chars = (size_t)snprintf( + (char*)node->buf, buf_size, "%sb%u", prefix, reader->next_id++); +} + +size_t +genid_size(SerdReader* reader) +{ + return reader->bprefix_len + 1 + 10 + 1; // + "b" + UINT32_MAX + \0 +} + +Ref +blank_id(SerdReader* reader) +{ + Ref ref = push_node_padded(reader, genid_size(reader), SERD_BLANK, "", 0); + set_blank_id(reader, ref, genid_size(reader)); + return ref; +} + +/** fread-like wrapper for getc (which is faster). */ +static size_t +serd_file_read_byte(void* buf, size_t size, size_t nmemb, void* stream) +{ + (void)size; + (void)nmemb; + + const int c = getc((FILE*)stream); + if (c == EOF) { + *((uint8_t*)buf) = 0; + return 0; + } + *((uint8_t*)buf) = (uint8_t)c; + return 1; +} + +Ref +push_node_padded(SerdReader* reader, + size_t maxlen, + SerdType type, + const char* str, + size_t n_bytes) +{ + void* mem = serd_stack_push_aligned( + &reader->stack, sizeof(SerdNode) + maxlen + 1, sizeof(SerdNode)); + + SerdNode* const node = (SerdNode*)mem; + node->n_bytes = node->n_chars = n_bytes; + node->flags = 0; + node->type = type; + node->buf = NULL; + + uint8_t* buf = (uint8_t*)(node + 1); + memcpy(buf, str, n_bytes + 1); + +#ifdef SERD_STACK_CHECK + reader->allocs = (Ref*)realloc(reader->allocs, + sizeof(reader->allocs) * (++reader->n_allocs)); + reader->allocs[reader->n_allocs - 1] = ((uint8_t*)mem - reader->stack.buf); +#endif + return (Ref)((uint8_t*)node - reader->stack.buf); +} + +Ref +push_node(SerdReader* reader, SerdType type, const char* str, size_t n_bytes) +{ + return push_node_padded(reader, n_bytes, type, str, n_bytes); +} + +SerdNode* +deref(SerdReader* reader, const Ref ref) +{ + if (ref) { + SerdNode* node = (SerdNode*)(reader->stack.buf + ref); + node->buf = (uint8_t*)node + sizeof(SerdNode); + return node; + } + return NULL; +} + +Ref +pop_node(SerdReader* reader, Ref ref) +{ + if (ref && ref != reader->rdf_first && ref != reader->rdf_rest && + ref != reader->rdf_nil) { +#ifdef SERD_STACK_CHECK + SERD_STACK_ASSERT_TOP(reader, ref); + --reader->n_allocs; +#endif + SerdNode* const node = deref(reader, ref); + uint8_t* const top = reader->stack.buf + reader->stack.size; + serd_stack_pop_aligned(&reader->stack, (size_t)(top - (uint8_t*)node)); + } + return 0; +} + +SerdStatus +emit_statement(SerdReader* reader, ReadContext ctx, Ref o, Ref d, Ref l) +{ + SerdNode* graph = deref(reader, ctx.graph); + if (!graph && reader->default_graph.buf) { + graph = &reader->default_graph; + } + + const SerdStatus st = !reader->statement_sink + ? SERD_SUCCESS + : reader->statement_sink(reader->handle, + *ctx.flags, + graph, + deref(reader, ctx.subject), + deref(reader, ctx.predicate), + deref(reader, o), + deref(reader, d), + deref(reader, l)); + + *ctx.flags &= SERD_ANON_CONT | SERD_LIST_CONT; // Preserve only cont flags + return st; +} + +static SerdStatus +read_statement(SerdReader* reader) +{ + return read_n3_statement(reader); +} + +static SerdStatus +read_doc(SerdReader* reader) +{ + return ((reader->syntax == SERD_NQUADS) ? read_nquadsDoc(reader) + : read_turtleTrigDoc(reader)); +} + +SerdReader* +serd_reader_new(SerdSyntax syntax, + void* handle, + void (*free_handle)(void*), + SerdBaseSink base_sink, + SerdPrefixSink prefix_sink, + SerdStatementSink statement_sink, + SerdEndSink end_sink) +{ + SerdReader* me = (SerdReader*)calloc(1, sizeof(SerdReader)); + me->handle = handle; + me->free_handle = free_handle; + me->base_sink = base_sink; + me->prefix_sink = prefix_sink; + me->statement_sink = statement_sink; + me->end_sink = end_sink; + me->default_graph = SERD_NODE_NULL; + me->stack = serd_stack_new(SERD_PAGE_SIZE); + me->syntax = syntax; + me->next_id = 1; + me->strict = true; + + me->rdf_first = push_node(me, SERD_URI, NS_RDF "first", 48); + me->rdf_rest = push_node(me, SERD_URI, NS_RDF "rest", 47); + me->rdf_nil = push_node(me, SERD_URI, NS_RDF "nil", 46); + + return me; +} + +void +serd_reader_set_strict(SerdReader* reader, bool strict) +{ + reader->strict = strict; +} + +void +serd_reader_set_error_sink(SerdReader* reader, + SerdErrorSink error_sink, + void* error_handle) +{ + reader->error_sink = error_sink; + reader->error_handle = error_handle; +} + +void +serd_reader_free(SerdReader* reader) +{ + if (!reader) { + return; + } + + pop_node(reader, reader->rdf_nil); + pop_node(reader, reader->rdf_rest); + pop_node(reader, reader->rdf_first); + serd_node_free(&reader->default_graph); + +#ifdef SERD_STACK_CHECK + free(reader->allocs); +#endif + free(reader->stack.buf); + free(reader->bprefix); + if (reader->free_handle) { + reader->free_handle(reader->handle); + } + free(reader); +} + +void* +serd_reader_get_handle(const SerdReader* reader) +{ + return reader->handle; +} + +void +serd_reader_add_blank_prefix(SerdReader* reader, const uint8_t* prefix) +{ + free(reader->bprefix); + reader->bprefix_len = 0; + reader->bprefix = NULL; + + const size_t prefix_len = prefix ? strlen((const char*)prefix) : 0; + if (prefix_len) { + reader->bprefix_len = prefix_len; + reader->bprefix = (uint8_t*)malloc(reader->bprefix_len + 1); + memcpy(reader->bprefix, prefix, reader->bprefix_len + 1); + } +} + +void +serd_reader_set_default_graph(SerdReader* reader, const SerdNode* graph) +{ + serd_node_free(&reader->default_graph); + reader->default_graph = serd_node_copy(graph); +} + +SerdStatus +serd_reader_read_file(SerdReader* reader, const uint8_t* uri) +{ + uint8_t* const path = serd_file_uri_parse(uri, NULL); + if (!path) { + return SERD_ERR_BAD_ARG; + } + + FILE* fd = serd_fopen((const char*)path, "rb"); + if (!fd) { + serd_free(path); + return SERD_ERR_UNKNOWN; + } + + SerdStatus ret = serd_reader_read_file_handle(reader, fd, path); + fclose(fd); + free(path); + return ret; +} + +static SerdStatus +skip_bom(SerdReader* me) +{ + if (serd_byte_source_peek(&me->source) == 0xEF) { + serd_byte_source_advance(&me->source); + if (serd_byte_source_peek(&me->source) != 0xBB || + serd_byte_source_advance(&me->source) || + serd_byte_source_peek(&me->source) != 0xBF || + serd_byte_source_advance(&me->source)) { + r_err(me, SERD_ERR_BAD_SYNTAX, "corrupt byte order mark\n"); + return SERD_ERR_BAD_SYNTAX; + } + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_reader_start_stream(SerdReader* reader, + FILE* file, + const uint8_t* name, + bool bulk) +{ + return serd_reader_start_source_stream(reader, + bulk ? (SerdSource)fread + : serd_file_read_byte, + (SerdStreamErrorFunc)ferror, + file, + name, + bulk ? SERD_PAGE_SIZE : 1); +} + +SerdStatus +serd_reader_start_source_stream(SerdReader* reader, + SerdSource read_func, + SerdStreamErrorFunc error_func, + void* stream, + const uint8_t* name, + size_t page_size) +{ + return serd_byte_source_open_source( + &reader->source, read_func, error_func, stream, name, page_size); +} + +static SerdStatus +serd_reader_prepare(SerdReader* reader) +{ + SerdStatus st = serd_byte_source_prepare(&reader->source); + if (st == SERD_SUCCESS) { + st = skip_bom(reader); + } else if (st == SERD_FAILURE) { + reader->source.eof = true; + } else { + r_err(reader, st, "read error: %s\n", strerror(errno)); + } + return st; +} + +SerdStatus +serd_reader_read_chunk(SerdReader* reader) +{ + SerdStatus st = SERD_SUCCESS; + if (!reader->source.prepared) { + st = serd_reader_prepare(reader); + } else if (reader->source.eof) { + st = serd_byte_source_advance(&reader->source); + } + + if (peek_byte(reader) == 0) { + // Skip leading null byte, for reading from a null-delimited socket + eat_byte_safe(reader, 0); + } + + return st ? st : read_statement(reader); +} + +SerdStatus +serd_reader_end_stream(SerdReader* reader) +{ + return serd_byte_source_close(&reader->source); +} + +SerdStatus +serd_reader_read_file_handle(SerdReader* reader, + FILE* file, + const uint8_t* name) +{ + return serd_reader_read_source(reader, + (SerdSource)fread, + (SerdStreamErrorFunc)ferror, + file, + name, + SERD_PAGE_SIZE); +} + +SerdStatus +serd_reader_read_source(SerdReader* reader, + SerdSource source, + SerdStreamErrorFunc error, + void* stream, + const uint8_t* name, + size_t page_size) +{ + SerdStatus st = serd_reader_start_source_stream( + reader, source, error, stream, name, page_size); + + if (st || (st = serd_reader_prepare(reader))) { + serd_reader_end_stream(reader); + return st; + } + + if ((st = read_doc(reader))) { + serd_reader_end_stream(reader); + return st; + } + + return serd_reader_end_stream(reader); +} + +SerdStatus +serd_reader_read_string(SerdReader* reader, const uint8_t* utf8) +{ + serd_byte_source_open_string(&reader->source, utf8); + + SerdStatus st = serd_reader_prepare(reader); + if (!st) { + st = read_doc(reader); + } + + serd_byte_source_close(&reader->source); + + return st; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h new file mode 100644 index 00000000..3a8991f4 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/reader.h @@ -0,0 +1,196 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef SERD_READER_H +#define SERD_READER_H + +#include "byte_source.h" +#include "stack.h" + +#include "serd/serd.h" + +#include +#include +#include +#include + +#if defined(__GNUC__) +# define SERD_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define SERD_LOG_FUNC(fmt, arg1) +#endif + +#ifdef SERD_STACK_CHECK +# define SERD_STACK_ASSERT_TOP(reader, ref) \ + assert(ref == reader->allocs[reader->n_allocs - 1]); +#else +# define SERD_STACK_ASSERT_TOP(reader, ref) +#endif + +/* Reference to a node in the stack (we can not use pointers since the + stack may be reallocated, invalidating any pointers to elements). +*/ +typedef size_t Ref; + +typedef struct { + Ref graph; + Ref subject; + Ref predicate; + Ref object; + Ref datatype; + Ref lang; + SerdStatementFlags* flags; +} ReadContext; + +struct SerdReaderImpl { + void* handle; + void (*free_handle)(void* ptr); + SerdBaseSink base_sink; + SerdPrefixSink prefix_sink; + SerdStatementSink statement_sink; + SerdEndSink end_sink; + SerdErrorSink error_sink; + void* error_handle; + Ref rdf_first; + Ref rdf_rest; + Ref rdf_nil; + SerdNode default_graph; + SerdByteSource source; + SerdStack stack; + SerdSyntax syntax; + unsigned next_id; + uint8_t* buf; + uint8_t* bprefix; + size_t bprefix_len; + bool strict; ///< True iff strict parsing + bool seen_genid; +#ifdef SERD_STACK_CHECK + Ref* allocs; ///< Stack of push offsets + size_t n_allocs; ///< Number of stack pushes +#endif +}; + +SERD_LOG_FUNC(3, 4) +SerdStatus +r_err(SerdReader* reader, SerdStatus st, const char* fmt, ...); + +Ref +push_node_padded(SerdReader* reader, + size_t maxlen, + SerdType type, + const char* str, + size_t n_bytes); + +Ref +push_node(SerdReader* reader, SerdType type, const char* str, size_t n_bytes); + +SERD_PURE_FUNC size_t +genid_size(SerdReader* reader); + +Ref +blank_id(SerdReader* reader); + +void +set_blank_id(SerdReader* reader, Ref ref, size_t buf_size); + +SerdNode* +deref(SerdReader* reader, Ref ref); + +Ref +pop_node(SerdReader* reader, Ref ref); + +SerdStatus +emit_statement(SerdReader* reader, ReadContext ctx, Ref o, Ref d, Ref l); + +SerdStatus +read_n3_statement(SerdReader* reader); + +SerdStatus +read_nquadsDoc(SerdReader* reader); + +SerdStatus +read_turtleTrigDoc(SerdReader* reader); + +static inline int +peek_byte(SerdReader* reader) +{ + SerdByteSource* source = &reader->source; + + return source->eof ? EOF : (int)source->read_buf[source->read_head]; +} + +static inline int +eat_byte_safe(SerdReader* reader, const int byte) +{ + (void)byte; + + const int c = peek_byte(reader); + assert(c == byte); + + serd_byte_source_advance(&reader->source); + return c; +} + +static inline int +eat_byte_check(SerdReader* reader, const int byte) +{ + const int c = peek_byte(reader); + if (c != byte) { + r_err(reader, SERD_ERR_BAD_SYNTAX, "expected `%c', not `%c'\n", byte, c); + return 0; + } + return eat_byte_safe(reader, byte); +} + +static inline SerdStatus +eat_string(SerdReader* reader, const char* str, unsigned n) +{ + for (unsigned i = 0; i < n; ++i) { + if (!eat_byte_check(reader, ((const uint8_t*)str)[i])) { + return SERD_ERR_BAD_SYNTAX; + } + } + return SERD_SUCCESS; +} + +static inline SerdStatus +push_byte(SerdReader* reader, Ref ref, const int c) +{ + assert(c != EOF); + SERD_STACK_ASSERT_TOP(reader, ref); + + uint8_t* const s = (uint8_t*)serd_stack_push(&reader->stack, 1); + SerdNode* const node = (SerdNode*)(reader->stack.buf + ref); + + ++node->n_bytes; + if (!(c & 0x80)) { // Starts with 0 bit, start of new character + ++node->n_chars; + } + + *(s - 1) = (uint8_t)c; + *s = '\0'; + return SERD_SUCCESS; +} + +static inline void +push_bytes(SerdReader* reader, Ref ref, const uint8_t* bytes, unsigned len) +{ + for (unsigned i = 0; i < len; ++i) { + push_byte(reader, ref, bytes[i]); + } +} + +#endif // SERD_READER_H diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h new file mode 100644 index 00000000..349d7124 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_config.h @@ -0,0 +1,98 @@ +/* + Copyright 2021 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/* + Configuration header that defines reasonable defaults at compile time. + + This allows compile-time configuration from the command line (typically via + the build system) while still allowing the source to be built without any + configuration. The build system can define SERD_NO_DEFAULT_CONFIG to disable + defaults, in which case it must define things like HAVE_FEATURE to enable + features. The design here ensures that compiler warnings or + include-what-you-use will catch any mistakes. +*/ + +#ifndef SERD_CONFIG_H +#define SERD_CONFIG_H + +// Define version unconditionally so a warning will catch a mismatch +#define SERD_VERSION "0.30.10" + +#if !defined(SERD_NO_DEFAULT_CONFIG) + +// We need unistd.h to check _POSIX_VERSION +# ifndef SERD_NO_POSIX +# ifdef __has_include +# if __has_include() +# include +# endif +# elif defined(__unix__) +# include +# endif +# endif + +// POSIX.1-2001: fileno() +# ifndef HAVE_FILENO +# if defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L +# define HAVE_FILENO +# endif +# endif + +// POSIX.1-2001: posix_fadvise() +# ifndef HAVE_POSIX_FADVISE +# ifndef __APPLE__ +# if defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L +# define HAVE_POSIX_FADVISE +# endif +# endif +# endif + +// POSIX.1-2001: posix_memalign() +# ifndef HAVE_POSIX_MEMALIGN +# if defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L +# define HAVE_POSIX_MEMALIGN +# endif +# endif + +#endif // !defined(SERD_NO_DEFAULT_CONFIG) + +/* + Make corresponding USE_FEATURE defines based on the HAVE_FEATURE defines from + above or the command line. The code checks for these using #if (not #ifdef), + so there will be an undefined warning if it checks for an unknown feature, + and this header is always required by any code that checks for features, even + if the build system defines them all. +*/ + +#ifdef HAVE_FILENO +# define USE_FILENO 1 +#else +# define USE_FILENO 0 +#endif + +#ifdef HAVE_POSIX_FADVISE +# define USE_POSIX_FADVISE 1 +#else +# define USE_POSIX_FADVISE 0 +#endif + +#ifdef HAVE_POSIX_MEMALIGN +# define USE_POSIX_MEMALIGN 1 +#else +# define USE_POSIX_MEMALIGN 0 +#endif + +#endif // SERD_CONFIG_H diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h new file mode 100644 index 00000000..139e6659 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serd_internal.h @@ -0,0 +1,46 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef SERD_INTERNAL_H +#define SERD_INTERNAL_H + +#include "serd/serd.h" + +#include + +#define NS_XSD "http://www.w3.org/2001/XMLSchema#" +#define NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#" + +#define SERD_PAGE_SIZE 4096 + +#ifndef MIN +# define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +/* Error reporting */ + +static inline void +serd_error(SerdErrorSink error_sink, void* handle, const SerdError* e) +{ + if (error_sink) { + error_sink(handle, e); + } else { + fprintf(stderr, "error: %s:%u:%u: ", e->filename, e->line, e->col); + vfprintf(stderr, e->fmt, *e->args); + } +} + +#endif // SERD_INTERNAL_H diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c new file mode 100644 index 00000000..a5c3c0da --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/serdi.c @@ -0,0 +1,377 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#define _POSIX_C_SOURCE 200809L /* for fileno and posix_fadvise */ + +#include "serd_config.h" +#include "string_utils.h" + +#include "serd/serd.h" + +#ifdef _WIN32 +# ifdef _MSC_VER +# define WIN32_LEAN_AND_MEAN 1 +# endif +# include +# include +#endif + +#if USE_POSIX_FADVISE && USE_FILENO +# include +#endif + +#include +#include +#include +#include +#include +#include + +#define SERDI_ERROR(msg) fprintf(stderr, "serdi: " msg) +#define SERDI_ERRORF(fmt, ...) fprintf(stderr, "serdi: " fmt, __VA_ARGS__) + +typedef struct { + SerdSyntax syntax; + const char* name; + const char* extension; +} Syntax; + +static const Syntax syntaxes[] = {{SERD_TURTLE, "turtle", ".ttl"}, + {SERD_NTRIPLES, "ntriples", ".nt"}, + {SERD_NQUADS, "nquads", ".nq"}, + {SERD_TRIG, "trig", ".trig"}, + {(SerdSyntax)0, NULL, NULL}}; + +static SerdSyntax +get_syntax(const char* name) +{ + for (const Syntax* s = syntaxes; s->name; ++s) { + if (!serd_strncasecmp(s->name, name, strlen(name))) { + return s->syntax; + } + } + + SERDI_ERRORF("unknown syntax `%s'\n", name); + return (SerdSyntax)0; +} + +static SERD_PURE_FUNC SerdSyntax +guess_syntax(const char* filename) +{ + const char* ext = strrchr(filename, '.'); + if (ext) { + for (const Syntax* s = syntaxes; s->name; ++s) { + if (!serd_strncasecmp(s->extension, ext, strlen(ext))) { + return s->syntax; + } + } + } + + return (SerdSyntax)0; +} + +static int +print_version(void) +{ + printf("serdi " SERD_VERSION " \n"); + printf("Copyright 2011-2021 David Robillard .\n" + "License: \n" + "This is free software; you are free to change and redistribute it." + "\nThere is NO WARRANTY, to the extent permitted by law.\n"); + return 0; +} + +static int +print_usage(const char* name, bool error) +{ + FILE* const os = error ? stderr : stdout; + fprintf(os, "%s", error ? "\n" : ""); + fprintf(os, "Usage: %s [OPTION]... INPUT [BASE_URI]\n", name); + fprintf(os, "Read and write RDF syntax.\n"); + fprintf(os, "Use - for INPUT to read from standard input.\n\n"); + fprintf(os, " -a Write ASCII output if possible.\n"); + fprintf(os, " -b Fast bulk output for large serialisations.\n"); + fprintf(os, " -c PREFIX Chop PREFIX from matching blank node IDs.\n"); + fprintf(os, " -e Eat input one character at a time.\n"); + fprintf(os, " -f Keep full URIs in input (don't qualify).\n"); + fprintf(os, " -h Display this help and exit.\n"); + fprintf(os, " -i SYNTAX Input syntax: turtle/ntriples/trig/nquads.\n"); + fprintf(os, " -l Lax (non-strict) parsing.\n"); + fprintf(os, " -o SYNTAX Output syntax: turtle/ntriples/nquads.\n"); + fprintf(os, " -p PREFIX Add PREFIX to blank node IDs.\n"); + fprintf(os, " -q Suppress all output except data.\n"); + fprintf(os, " -r ROOT_URI Keep relative URIs within ROOT_URI.\n"); + fprintf(os, " -s INPUT Parse INPUT as string (terminates options).\n"); + fprintf(os, " -v Display version information and exit.\n"); + return error ? 1 : 0; +} + +static int +missing_arg(const char* name, char opt) +{ + SERDI_ERRORF("option requires an argument -- '%c'\n", opt); + return print_usage(name, true); +} + +static SerdStatus +quiet_error_sink(void* handle, const SerdError* e) +{ + (void)handle; + (void)e; + return SERD_SUCCESS; +} + +static inline FILE* +serd_fopen(const char* path, const char* mode) +{ + FILE* fd = fopen(path, mode); + if (!fd) { + SERDI_ERRORF("failed to open file %s (%s)\n", path, strerror(errno)); + return NULL; + } + +#if USE_POSIX_FADVISE && USE_FILENO + posix_fadvise(fileno(fd), 0, 0, POSIX_FADV_SEQUENTIAL | POSIX_FADV_NOREUSE); +#endif + + return fd; +} + +static SerdStyle +choose_style(const SerdSyntax input_syntax, + const SerdSyntax output_syntax, + const bool ascii, + const bool bulk_write, + const bool full_uris) +{ + unsigned output_style = 0u; + if (output_syntax == SERD_NTRIPLES || ascii) { + output_style |= SERD_STYLE_ASCII; + } else if (output_syntax == SERD_TURTLE) { + output_style |= SERD_STYLE_ABBREVIATED; + if (!full_uris) { + output_style |= SERD_STYLE_CURIED; + } + } + + if ((input_syntax == SERD_TURTLE || input_syntax == SERD_TRIG) || + (output_style & SERD_STYLE_CURIED)) { + // Base URI may change and/or we're abbreviating URIs, so must resolve + output_style |= SERD_STYLE_RESOLVED; + } + + if (bulk_write) { + output_style |= SERD_STYLE_BULK; + } + + return (SerdStyle)output_style; +} + +int +main(int argc, char** argv) +{ + if (argc < 2) { + return print_usage(argv[0], true); + } + + FILE* in_fd = NULL; + SerdSyntax input_syntax = (SerdSyntax)0; + SerdSyntax output_syntax = (SerdSyntax)0; + bool from_file = true; + bool ascii = false; + bool bulk_read = true; + bool bulk_write = false; + bool full_uris = false; + bool lax = false; + bool quiet = false; + const uint8_t* in_name = NULL; + const uint8_t* add_prefix = NULL; + const uint8_t* chop_prefix = NULL; + const uint8_t* root_uri = NULL; + int a = 1; + for (; a < argc && argv[a][0] == '-'; ++a) { + if (argv[a][1] == '\0') { + in_name = (const uint8_t*)"(stdin)"; + in_fd = stdin; + break; + } + + if (argv[a][1] == 'a') { + ascii = true; + } else if (argv[a][1] == 'b') { + bulk_write = true; + } else if (argv[a][1] == 'e') { + bulk_read = false; + } else if (argv[a][1] == 'f') { + full_uris = true; + } else if (argv[a][1] == 'h') { + return print_usage(argv[0], false); + } else if (argv[a][1] == 'l') { + lax = true; + } else if (argv[a][1] == 'q') { + quiet = true; + } else if (argv[a][1] == 'v') { + return print_version(); + } else if (argv[a][1] == 's') { + in_name = (const uint8_t*)"(string)"; + from_file = false; + ++a; + break; + } else if (argv[a][1] == 'i') { + if (++a == argc) { + return missing_arg(argv[0], 'i'); + } + + if (!(input_syntax = get_syntax(argv[a]))) { + return print_usage(argv[0], true); + } + } else if (argv[a][1] == 'o') { + if (++a == argc) { + return missing_arg(argv[0], 'o'); + } + + if (!(output_syntax = get_syntax(argv[a]))) { + return print_usage(argv[0], true); + } + } else if (argv[a][1] == 'p') { + if (++a == argc) { + return missing_arg(argv[0], 'p'); + } + + add_prefix = (const uint8_t*)argv[a]; + } else if (argv[a][1] == 'c') { + if (++a == argc) { + return missing_arg(argv[0], 'c'); + } + + chop_prefix = (const uint8_t*)argv[a]; + } else if (argv[a][1] == 'r') { + if (++a == argc) { + return missing_arg(argv[0], 'r'); + } + + root_uri = (const uint8_t*)argv[a]; + } else { + SERDI_ERRORF("invalid option -- '%s'\n", argv[a] + 1); + return print_usage(argv[0], true); + } + } + + if (a == argc) { + SERDI_ERROR("missing input\n"); + return 1; + } + +#ifdef _WIN32 + _setmode(_fileno(stdin), _O_BINARY); + _setmode(_fileno(stdout), _O_BINARY); +#endif + + uint8_t* input_path = NULL; + const uint8_t* input = (const uint8_t*)argv[a++]; + if (from_file) { + in_name = in_name ? in_name : input; + if (!in_fd) { + if (!strncmp((const char*)input, "file:", 5)) { + input_path = serd_file_uri_parse(input, NULL); + input = input_path; + } + if (!input || !(in_fd = serd_fopen((const char*)input, "rb"))) { + return 1; + } + } + } + + if (!input_syntax && !(input_syntax = guess_syntax((const char*)in_name))) { + input_syntax = SERD_TRIG; + } + + if (!output_syntax) { + output_syntax = + ((input_syntax == SERD_TURTLE || input_syntax == SERD_NTRIPLES) + ? SERD_NTRIPLES + : SERD_NQUADS); + } + + const SerdStyle output_style = + choose_style(input_syntax, output_syntax, ascii, bulk_write, full_uris); + + SerdURI base_uri = SERD_URI_NULL; + SerdNode base = SERD_NODE_NULL; + if (a < argc) { // Base URI given on command line + base = + serd_node_new_uri_from_string((const uint8_t*)argv[a], NULL, &base_uri); + } else if (from_file && in_fd != stdin) { // Use input file URI + base = serd_node_new_file_uri(input, NULL, &base_uri, true); + } + + FILE* const out_fd = stdout; + SerdEnv* const env = serd_env_new(&base); + + SerdWriter* const writer = serd_writer_new( + output_syntax, output_style, env, &base_uri, serd_file_sink, out_fd); + + SerdReader* const reader = + serd_reader_new(input_syntax, + writer, + NULL, + (SerdBaseSink)serd_writer_set_base_uri, + (SerdPrefixSink)serd_writer_set_prefix, + (SerdStatementSink)serd_writer_write_statement, + (SerdEndSink)serd_writer_end_anon); + + serd_reader_set_strict(reader, !lax); + if (quiet) { + serd_reader_set_error_sink(reader, quiet_error_sink, NULL); + serd_writer_set_error_sink(writer, quiet_error_sink, NULL); + } + + SerdNode root = serd_node_from_string(SERD_URI, root_uri); + serd_writer_set_root_uri(writer, &root); + serd_writer_chop_blank_prefix(writer, chop_prefix); + serd_reader_add_blank_prefix(reader, add_prefix); + + SerdStatus st = SERD_SUCCESS; + if (!from_file) { + st = serd_reader_read_string(reader, input); + } else if (bulk_read) { + st = serd_reader_read_file_handle(reader, in_fd, in_name); + } else { + st = serd_reader_start_stream(reader, in_fd, in_name, false); + while (!st) { + st = serd_reader_read_chunk(reader); + } + serd_reader_end_stream(reader); + } + + serd_reader_free(reader); + serd_writer_finish(writer); + serd_writer_free(writer); + serd_env_free(env); + serd_node_free(&base); + free(input_path); + + if (from_file) { + fclose(in_fd); + } + + if (fclose(out_fd)) { + perror("serdi: write error"); + st = SERD_ERR_UNKNOWN; + } + + return (st > SERD_FAILURE) ? 1 : 0; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h new file mode 100644 index 00000000..fef33390 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/stack.h @@ -0,0 +1,119 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef SERD_STACK_H +#define SERD_STACK_H + +#include +#include +#include +#include +#include + +/** An offset to start the stack at. Note 0 is reserved for NULL. */ +#define SERD_STACK_BOTTOM sizeof(void*) + +/** A dynamic stack in memory. */ +typedef struct { + uint8_t* buf; ///< Stack memory + size_t buf_size; ///< Allocated size of buf (>= size) + size_t size; ///< Conceptual size of stack in buf +} SerdStack; + +/** An offset to start the stack at. Note 0 is reserved for NULL. */ +#define SERD_STACK_BOTTOM sizeof(void*) + +static inline SerdStack +serd_stack_new(size_t size) +{ + SerdStack stack; + stack.buf = (uint8_t*)calloc(size, 1); + stack.buf_size = size; + stack.size = SERD_STACK_BOTTOM; + return stack; +} + +static inline bool +serd_stack_is_empty(SerdStack* stack) +{ + return stack->size <= SERD_STACK_BOTTOM; +} + +static inline void +serd_stack_free(SerdStack* stack) +{ + free(stack->buf); + stack->buf = NULL; + stack->buf_size = 0; + stack->size = 0; +} + +static inline void* +serd_stack_push(SerdStack* stack, size_t n_bytes) +{ + const size_t new_size = stack->size + n_bytes; + if (stack->buf_size < new_size) { + stack->buf_size += (stack->buf_size >> 1); // *= 1.5 + stack->buf = (uint8_t*)realloc(stack->buf, stack->buf_size); + } + + uint8_t* const ret = (stack->buf + stack->size); + + stack->size = new_size; + return ret; +} + +static inline void +serd_stack_pop(SerdStack* stack, size_t n_bytes) +{ + assert(stack->size >= n_bytes); + stack->size -= n_bytes; +} + +static inline void* +serd_stack_push_aligned(SerdStack* stack, size_t n_bytes, size_t align) +{ + // Push one byte to ensure space for a pad count + serd_stack_push(stack, 1); + + // Push padding if necessary + const size_t pad = align - stack->size % align; + if (pad > 0) { + serd_stack_push(stack, pad); + } + + // Set top of stack to pad count so we can properly pop later + assert(pad < UINT8_MAX); + stack->buf[stack->size - 1] = (uint8_t)pad; + + // Push requested space at aligned location + return serd_stack_push(stack, n_bytes); +} + +static inline void +serd_stack_pop_aligned(SerdStack* stack, size_t n_bytes) +{ + // Pop requested space down to aligned location + serd_stack_pop(stack, n_bytes); + + // Get amount of padding from top of stack + const uint8_t pad = stack->buf[stack->size - 1]; + + // Pop padding and pad count + serd_stack_pop(stack, pad + 1u); +} + +#endif // SERD_STACK_H diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c new file mode 100644 index 00000000..b83ad58f --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string.c @@ -0,0 +1,179 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "string_utils.h" + +#include "serd/serd.h" + +#include +#include +#include + +void +serd_free(void* ptr) +{ + free(ptr); +} + +const uint8_t* +serd_strerror(SerdStatus status) +{ + switch (status) { + case SERD_SUCCESS: + return (const uint8_t*)"Success"; + case SERD_FAILURE: + return (const uint8_t*)"Non-fatal failure"; + case SERD_ERR_UNKNOWN: + return (const uint8_t*)"Unknown error"; + case SERD_ERR_BAD_SYNTAX: + return (const uint8_t*)"Invalid syntax"; + case SERD_ERR_BAD_ARG: + return (const uint8_t*)"Invalid argument"; + case SERD_ERR_NOT_FOUND: + return (const uint8_t*)"Not found"; + case SERD_ERR_ID_CLASH: + return (const uint8_t*)"Blank node ID clash"; + case SERD_ERR_BAD_CURIE: + return (const uint8_t*)"Invalid CURIE"; + case SERD_ERR_INTERNAL: + return (const uint8_t*)"Internal error"; + default: + break; + } + return (const uint8_t*)"Unknown error"; // never reached +} + +static inline void +serd_update_flags(const uint8_t c, SerdNodeFlags* const flags) +{ + switch (c) { + case '\r': + case '\n': + *flags |= SERD_HAS_NEWLINE; + break; + case '"': + *flags |= SERD_HAS_QUOTE; + default: + break; + } +} + +size_t +serd_substrlen(const uint8_t* const str, + const size_t len, + size_t* const n_bytes, + SerdNodeFlags* const flags) +{ + size_t n_chars = 0; + size_t i = 0; + SerdNodeFlags f = 0; + for (; i < len && str[i]; ++i) { + if ((str[i] & 0xC0) != 0x80) { // Start of new character + ++n_chars; + serd_update_flags(str[i], &f); + } + } + if (n_bytes) { + *n_bytes = i; + } + if (flags) { + *flags = f; + } + return n_chars; +} + +size_t +serd_strlen(const uint8_t* str, size_t* n_bytes, SerdNodeFlags* flags) +{ + size_t n_chars = 0; + size_t i = 0; + SerdNodeFlags f = 0; + for (; str[i]; ++i) { + if ((str[i] & 0xC0) != 0x80) { // Start of new character + ++n_chars; + serd_update_flags(str[i], &f); + } + } + if (n_bytes) { + *n_bytes = i; + } + if (flags) { + *flags = f; + } + return n_chars; +} + +static inline double +read_sign(const char** sptr) +{ + double sign = 1.0; + switch (**sptr) { + case '-': + sign = -1.0; + // fallthru + case '+': + ++(*sptr); + // fallthru + default: + return sign; + } +} + +double +serd_strtod(const char* str, char** endptr) +{ + double result = 0.0; + + // Point s at the first non-whitespace character + const char* s = str; + while (is_space(*s)) { + ++s; + } + + // Read leading sign if necessary + const double sign = read_sign(&s); + + // Parse integer part + for (; is_digit(*s); ++s) { + result = (result * 10.0) + (*s - '0'); + } + + // Parse fractional part + if (*s == '.') { + double denom = 10.0; + for (++s; is_digit(*s); ++s) { + result += (*s - '0') / denom; + denom *= 10.0; + } + } + + // Parse exponent + if (*s == 'e' || *s == 'E') { + ++s; + double expt = 0.0; + double expt_sign = read_sign(&s); + for (; is_digit(*s); ++s) { + expt = (expt * 10.0) + (*s - '0'); + } + result *= pow(10, expt * expt_sign); + } + + if (endptr) { + *endptr = (char*)s; + } + + return result * sign; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h new file mode 100644 index 00000000..ac2b40c5 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/string_utils.h @@ -0,0 +1,173 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef SERD_STRING_UTILS_H +#define SERD_STRING_UTILS_H + +#include "serd/serd.h" + +#include +#include +#include + +/** Unicode replacement character in UTF-8 */ +static const uint8_t replacement_char[] = {0xEF, 0xBF, 0xBD}; + +/** Return true if `c` lies within [`min`...`max`] (inclusive) */ +static inline bool +in_range(const int c, const int min, const int max) +{ + return (c >= min && c <= max); +} + +/** RFC2234: ALPHA ::= %x41-5A / %x61-7A ; A-Z / a-z */ +static inline bool +is_alpha(const int c) +{ + return in_range(c, 'A', 'Z') || in_range(c, 'a', 'z'); +} + +/** RFC2234: DIGIT ::= %x30-39 ; 0-9 */ +static inline bool +is_digit(const int c) +{ + return in_range(c, '0', '9'); +} + +/* RFC2234: HEXDIG ::= DIGIT / "A" / "B" / "C" / "D" / "E" / "F" */ +static inline bool +is_hexdig(const int c) +{ + return is_digit(c) || in_range(c, 'A', 'F'); +} + +/* Turtle / JSON / C: XDIGIT ::= DIGIT / A-F / a-f */ +static inline bool +is_xdigit(const int c) +{ + return is_hexdig(c) || in_range(c, 'a', 'f'); +} + +static inline bool +is_space(const char c) +{ + switch (c) { + case ' ': + case '\f': + case '\n': + case '\r': + case '\t': + case '\v': + return true; + default: + return false; + } +} + +static inline bool +is_print(const int c) +{ + return c >= 0x20 && c <= 0x7E; +} + +static inline bool +is_base64(const uint8_t c) +{ + return is_alpha(c) || is_digit(c) || c == '+' || c == '/' || c == '='; +} + +static inline bool +is_windows_path(const uint8_t* path) +{ + return is_alpha(path[0]) && (path[1] == ':' || path[1] == '|') && + (path[2] == '/' || path[2] == '\\'); +} + +size_t +serd_substrlen(const uint8_t* str, + size_t len, + size_t* n_bytes, + SerdNodeFlags* flags); + +static inline char +serd_to_upper(const char c) +{ + return (char)((c >= 'a' && c <= 'z') ? c - 32 : c); +} + +static inline int +serd_strncasecmp(const char* s1, const char* s2, size_t n) +{ + for (; n > 0 && *s2; s1++, s2++, --n) { + if (serd_to_upper(*s1) != serd_to_upper(*s2)) { + return ((*(const uint8_t*)s1 < *(const uint8_t*)s2) ? -1 : +1); + } + } + + return 0; +} + +static inline uint32_t +utf8_num_bytes(const uint8_t c) +{ + if ((c & 0x80) == 0) { // Starts with `0' + return 1; + } + + if ((c & 0xE0) == 0xC0) { // Starts with `110' + return 2; + } + + if ((c & 0xF0) == 0xE0) { // Starts with `1110' + return 3; + } + + if ((c & 0xF8) == 0xF0) { // Starts with `11110' + return 4; + } + + return 0; +} + +/// Return the code point of a UTF-8 character with known length +static inline uint32_t +parse_counted_utf8_char(const uint8_t* utf8, size_t size) +{ + uint32_t c = utf8[0] & ((1u << (8 - size)) - 1); + for (size_t i = 1; i < size; ++i) { + const uint8_t in = utf8[i] & 0x3F; + c = (c << 6) | in; + } + return c; +} + +/// Parse a UTF-8 character, set *size to the length, and return the code point +static inline uint32_t +parse_utf8_char(const uint8_t* utf8, size_t* size) +{ + switch (*size = utf8_num_bytes(utf8[0])) { + case 1: + case 2: + case 3: + case 4: + return parse_counted_utf8_char(utf8, *size); + default: + *size = 0; + return 0; + } +} + +#endif // SERD_STRING_UTILS_H diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c new file mode 100644 index 00000000..6bc93ca6 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.c @@ -0,0 +1,82 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#define _POSIX_C_SOURCE 200809L /* for posix_memalign and posix_fadvise */ + +#include "system.h" + +#include "serd_config.h" +#include "serd_internal.h" + +#if USE_POSIX_FADVISE && USE_FILENO +# include +#endif + +#ifdef _WIN32 +# include +#endif + +#include +#include +#include +#include + +FILE* +serd_fopen(const char* path, const char* mode) +{ + FILE* fd = fopen(path, mode); + if (!fd) { + fprintf( + stderr, "error: failed to open file %s (%s)\n", path, strerror(errno)); + return NULL; + } + +#if USE_POSIX_FADVISE && USE_FILENO + posix_fadvise(fileno(fd), 0, 0, POSIX_FADV_SEQUENTIAL); +#endif + return fd; +} + +void* +serd_malloc_aligned(const size_t alignment, const size_t size) +{ +#if defined(_WIN32) + return _aligned_malloc(size, alignment); +#elif USE_POSIX_MEMALIGN + void* ptr = NULL; + const int ret = posix_memalign(&ptr, alignment, size); + return ret ? NULL : ptr; +#else + (void)alignment; + return malloc(size); +#endif +} + +void* +serd_allocate_buffer(const size_t size) +{ + return serd_malloc_aligned(SERD_PAGE_SIZE, size); +} + +void +serd_free_aligned(void* const ptr) +{ +#ifdef _WIN32 + _aligned_free(ptr); +#else + free(ptr); +#endif +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h new file mode 100644 index 00000000..fdfab4a4 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/system.h @@ -0,0 +1,40 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef SERD_SYSTEM_H +#define SERD_SYSTEM_H + +#include "attributes.h" + +#include + +/// Open a file configured for fast sequential reading +FILE* +serd_fopen(const char* path, const char* mode); + +/// Allocate a buffer aligned to `alignment` bytes +SERD_MALLOC_FUNC void* +serd_malloc_aligned(size_t alignment, size_t size); + +/// Allocate an aligned buffer for I/O +SERD_MALLOC_FUNC void* +serd_allocate_buffer(size_t size); + +/// Free a buffer allocated with an aligned allocation function +void +serd_free_aligned(void* ptr); + +#endif // SERD_SYSTEM_H diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c new file mode 100644 index 00000000..b70992ff --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri.c @@ -0,0 +1,506 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "string_utils.h" +#include "uri_utils.h" + +#include "serd/serd.h" + +#include +#include +#include +#include +#include + +const uint8_t* +serd_uri_to_path(const uint8_t* uri) +{ + const uint8_t* path = uri; + if (!is_windows_path(uri) && serd_uri_string_has_scheme(uri)) { + if (strncmp((const char*)uri, "file:", 5)) { + fprintf(stderr, "Non-file URI `%s'\n", uri); + return NULL; + } + + if (!strncmp((const char*)uri, "file://localhost/", 17)) { + path = uri + 16; + } else if (!strncmp((const char*)uri, "file://", 7)) { + path = uri + 7; + } else { + fprintf(stderr, "Invalid file URI `%s'\n", uri); + return NULL; + } + + if (is_windows_path(path + 1)) { + ++path; // Special case for terrible Windows file URIs + } + } + return path; +} + +uint8_t* +serd_file_uri_parse(const uint8_t* uri, uint8_t** hostname) +{ + const uint8_t* path = uri; + if (hostname) { + *hostname = NULL; + } + if (!strncmp((const char*)uri, "file://", 7)) { + const uint8_t* auth = uri + 7; + if (*auth == '/') { // No hostname + path = auth; + } else { // Has hostname + if (!(path = (const uint8_t*)strchr((const char*)auth, '/'))) { + return NULL; + } + + if (hostname) { + *hostname = (uint8_t*)calloc((size_t)(path - auth + 1), 1); + memcpy(*hostname, auth, (size_t)(path - auth)); + } + } + } + + if (is_windows_path(path + 1)) { + ++path; + } + + SerdChunk chunk = {NULL, 0}; + for (const uint8_t* s = path; *s; ++s) { + if (*s == '%') { + if (*(s + 1) == '%') { + serd_chunk_sink("%", 1, &chunk); + ++s; + } else if (is_hexdig(*(s + 1)) && is_hexdig(*(s + 2))) { + const uint8_t code[3] = {*(s + 1), *(s + 2), 0}; + const uint8_t c = (uint8_t)strtoul((const char*)code, NULL, 16); + serd_chunk_sink(&c, 1, &chunk); + s += 2; + } else { + s += 2; // Junk escape, ignore + } + } else { + serd_chunk_sink(s, 1, &chunk); + } + } + + return serd_chunk_sink_finish(&chunk); +} + +bool +serd_uri_string_has_scheme(const uint8_t* utf8) +{ + // RFC3986: scheme ::= ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) + if (!utf8 || !is_alpha(utf8[0])) { + return false; // Invalid scheme initial character, URI is relative + } + + for (uint8_t c = 0; (c = *++utf8) != '\0';) { + if (!is_uri_scheme_char(c)) { + return false; + } + + if (c == ':') { + return true; // End of scheme + } + } + + return false; +} + +SerdStatus +serd_uri_parse(const uint8_t* utf8, SerdURI* out) +{ + *out = SERD_URI_NULL; + + const uint8_t* ptr = utf8; + + /* See http://tools.ietf.org/html/rfc3986#section-3 + URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] + */ + + /* S3.1: scheme ::= ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) */ + if (is_alpha(*ptr)) { + for (uint8_t c = *++ptr; true; c = *++ptr) { + switch (c) { + case '\0': + case '/': + case '?': + case '#': + ptr = utf8; + goto path; // Relative URI (starts with path by definition) + case ':': + out->scheme.buf = utf8; + out->scheme.len = (size_t)((ptr++) - utf8); + goto maybe_authority; // URI with scheme + case '+': + case '-': + case '.': + continue; + default: + if (is_alpha(c) || is_digit(c)) { + continue; + } + } + } + } + + /* S3.2: The authority component is preceded by a double slash ("//") + and is terminated by the next slash ("/"), question mark ("?"), + or number sign ("#") character, or by the end of the URI. + */ +maybe_authority: + if (*ptr == '/' && *(ptr + 1) == '/') { + ptr += 2; + out->authority.buf = ptr; + for (uint8_t c = 0; (c = *ptr) != '\0'; ++ptr) { + switch (c) { + case '/': + goto path; + case '?': + goto query; + case '#': + goto fragment; + default: + ++out->authority.len; + } + } + } + + /* RFC3986 S3.3: The path is terminated by the first question mark ("?") + or number sign ("#") character, or by the end of the URI. + */ +path: + switch (*ptr) { + case '?': + goto query; + case '#': + goto fragment; + case '\0': + goto end; + default: + break; + } + out->path.buf = ptr; + out->path.len = 0; + for (uint8_t c = 0; (c = *ptr) != '\0'; ++ptr) { + switch (c) { + case '?': + goto query; + case '#': + goto fragment; + default: + ++out->path.len; + } + } + + /* RFC3986 S3.4: The query component is indicated by the first question + mark ("?") character and terminated by a number sign ("#") character + or by the end of the URI. + */ +query: + if (*ptr == '?') { + out->query.buf = ++ptr; + for (uint8_t c = 0; (c = *ptr) != '\0'; ++ptr) { + if (c == '#') { + goto fragment; + } + ++out->query.len; + } + } + + /* RFC3986 S3.5: A fragment identifier component is indicated by the + presence of a number sign ("#") character and terminated by the end + of the URI. + */ +fragment: + if (*ptr == '#') { + out->fragment.buf = ptr; + while (*ptr++ != '\0') { + ++out->fragment.len; + } + } + +end: + return SERD_SUCCESS; +} + +/** + Remove leading dot components from `path`. + See http://tools.ietf.org/html/rfc3986#section-5.2.3 + @param up Set to the number of up-references (e.g. "../") trimmed + @return A pointer to the new start of `path` +*/ +static const uint8_t* +remove_dot_segments(const uint8_t* path, size_t len, size_t* up) +{ + const uint8_t* begin = path; + const uint8_t* const end = path + len; + + *up = 0; + while (begin < end) { + switch (begin[0]) { + case '.': + switch (begin[1]) { + case '/': + begin += 2; // Chop leading "./" + break; + case '.': + switch (begin[2]) { + case '\0': + ++*up; + begin += 2; // Chop input ".." + break; + case '/': + ++*up; + begin += 3; // Chop leading "../" + break; + default: + return begin; + } + break; + case '\0': + return ++begin; // Chop input "." + default: + return begin; + } + break; + + case '/': + switch (begin[1]) { + case '.': + switch (begin[2]) { + case '/': + begin += 2; // Leading "/./" => "/" + break; + case '.': + switch (begin[3]) { + case '/': + ++*up; + begin += 3; // Leading "/../" => "/" + } + break; + default: + return begin; + } + } + return begin; + + default: + return begin; // Finished chopping dot components + } + } + + return begin; +} + +/// Merge `base` and `path` in-place +static void +merge(SerdChunk* base, SerdChunk* path) +{ + size_t up = 0; + const uint8_t* begin = remove_dot_segments(path->buf, path->len, &up); + const uint8_t* end = path->buf + path->len; + + if (base->len) { + // Find the up'th last slash + const uint8_t* base_last = (base->buf + base->len - 1); + ++up; + do { + if (*base_last == '/') { + --up; + } + } while (up > 0 && (--base_last > base->buf)); + + // Set path prefix + base->len = (size_t)(base_last - base->buf + 1); + } + + // Set path suffix + path->buf = begin; + path->len = (size_t)(end - begin); +} + +/// See http://tools.ietf.org/html/rfc3986#section-5.2.2 +void +serd_uri_resolve(const SerdURI* r, const SerdURI* base, SerdURI* t) +{ + if (!base->scheme.len) { + *t = *r; // Don't resolve against non-absolute URIs + return; + } + + t->path_base.buf = NULL; + t->path_base.len = 0; + if (r->scheme.len) { + *t = *r; + } else { + if (r->authority.len) { + t->authority = r->authority; + t->path = r->path; + t->query = r->query; + } else { + t->path = r->path; + if (!r->path.len) { + t->path_base = base->path; + if (r->query.len) { + t->query = r->query; + } else { + t->query = base->query; + } + } else { + if (r->path.buf[0] != '/') { + t->path_base = base->path; + } + merge(&t->path_base, &t->path); + t->query = r->query; + } + t->authority = base->authority; + } + t->scheme = base->scheme; + t->fragment = r->fragment; + } +} + +/** Write the path of `uri` starting at index `i` */ +static size_t +write_path_tail(SerdSink sink, void* stream, const SerdURI* uri, size_t i) +{ + size_t len = 0; + if (i < uri->path_base.len) { + len += sink(uri->path_base.buf + i, uri->path_base.len - i, stream); + } + + if (uri->path.buf) { + if (i < uri->path_base.len) { + len += sink(uri->path.buf, uri->path.len, stream); + } else { + const size_t j = (i - uri->path_base.len); + len += sink(uri->path.buf + j, uri->path.len - j, stream); + } + } + + return len; +} + +/** Write the path of `uri` relative to the path of `base`. */ +static size_t +write_rel_path(SerdSink sink, + void* stream, + const SerdURI* uri, + const SerdURI* base) +{ + const size_t path_len = uri_path_len(uri); + const size_t base_len = uri_path_len(base); + const size_t min_len = (path_len < base_len) ? path_len : base_len; + + // Find the last separator common to both paths + size_t last_shared_sep = 0; + size_t i = 0; + for (; i < min_len && uri_path_at(uri, i) == uri_path_at(base, i); ++i) { + if (uri_path_at(uri, i) == '/') { + last_shared_sep = i; + } + } + + if (i == path_len && i == base_len) { // Paths are identical + return 0; + } + + // Find the number of up references ("..") required + size_t up = 0; + for (size_t s = last_shared_sep + 1; s < base_len; ++s) { + if (uri_path_at(base, s) == '/') { + ++up; + } + } + + // Write up references + size_t len = 0; + for (size_t u = 0; u < up; ++u) { + len += sink("../", 3, stream); + } + + if (last_shared_sep == 0 && up == 0) { + len += sink("/", 1, stream); + } + + // Write suffix + return len + write_path_tail(sink, stream, uri, last_shared_sep + 1); +} + +static uint8_t +serd_uri_path_starts_without_slash(const SerdURI* uri) +{ + return ((uri->path_base.len || uri->path.len) && + ((!uri->path_base.len || uri->path_base.buf[0] != '/') && + (!uri->path.len || uri->path.buf[0] != '/'))); +} + +/// See http://tools.ietf.org/html/rfc3986#section-5.3 +size_t +serd_uri_serialise_relative(const SerdURI* uri, + const SerdURI* base, + const SerdURI* root, + SerdSink sink, + void* stream) +{ + size_t len = 0; + const bool relative = + root ? uri_is_under(uri, root) : uri_is_related(uri, base); + + if (relative) { + len = write_rel_path(sink, stream, uri, base); + } + + if (!relative || (!len && base->query.buf)) { + if (uri->scheme.buf) { + len += sink(uri->scheme.buf, uri->scheme.len, stream); + len += sink(":", 1, stream); + } + if (uri->authority.buf) { + len += sink("//", 2, stream); + len += sink(uri->authority.buf, uri->authority.len, stream); + if (uri->authority.len > 0 && + uri->authority.buf[uri->authority.len - 1] != '/' && + serd_uri_path_starts_without_slash(uri)) { + // Special case: ensure path begins with a slash + // https://tools.ietf.org/html/rfc3986#section-3.2 + len += sink("/", 1, stream); + } + } + len += write_path_tail(sink, stream, uri, 0); + } + + if (uri->query.buf) { + len += sink("?", 1, stream); + len += sink(uri->query.buf, uri->query.len, stream); + } + + if (uri->fragment.buf) { + // Note uri->fragment.buf includes the leading `#' + len += sink(uri->fragment.buf, uri->fragment.len, stream); + } + + return len; +} + +/// See http://tools.ietf.org/html/rfc3986#section-5.3 +size_t +serd_uri_serialise(const SerdURI* uri, SerdSink sink, void* stream) +{ + return serd_uri_serialise_relative(uri, NULL, NULL, sink, stream); +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h new file mode 100644 index 00000000..2dd4924f --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/uri_utils.h @@ -0,0 +1,110 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef SERD_URI_UTILS_H +#define SERD_URI_UTILS_H + +#include "serd/serd.h" + +#include "string_utils.h" + +#include +#include +#include + +static inline bool +chunk_equals(const SerdChunk* a, const SerdChunk* b) +{ + return a->len == b->len && + !strncmp((const char*)a->buf, (const char*)b->buf, a->len); +} + +static inline size_t +uri_path_len(const SerdURI* uri) +{ + return uri->path_base.len + uri->path.len; +} + +static inline uint8_t +uri_path_at(const SerdURI* uri, size_t i) +{ + return (i < uri->path_base.len) ? uri->path_base.buf[i] + : uri->path.buf[i - uri->path_base.len]; +} + +/** + Return the index of the first differing character after the last root slash, + or zero if `uri` is not under `root`. +*/ +static inline SERD_PURE_FUNC size_t +uri_rooted_index(const SerdURI* uri, const SerdURI* root) +{ + if (!root || !root->scheme.len || + !chunk_equals(&root->scheme, &uri->scheme) || + !chunk_equals(&root->authority, &uri->authority)) { + return 0; + } + + bool differ = false; + const size_t path_len = uri_path_len(uri); + const size_t root_len = uri_path_len(root); + size_t last_root_slash = 0; + for (size_t i = 0; i < path_len && i < root_len; ++i) { + const uint8_t u = uri_path_at(uri, i); + const uint8_t r = uri_path_at(root, i); + + differ = differ || u != r; + if (r == '/') { + last_root_slash = i; + if (differ) { + return 0; + } + } + } + + return last_root_slash + 1; +} + +/** Return true iff `uri` shares path components with `root` */ +static inline SERD_PURE_FUNC bool +uri_is_related(const SerdURI* uri, const SerdURI* root) +{ + return uri_rooted_index(uri, root) > 0; +} + +/** Return true iff `uri` is within the base of `root` */ +static inline SERD_PURE_FUNC bool +uri_is_under(const SerdURI* uri, const SerdURI* root) +{ + const size_t index = uri_rooted_index(uri, root); + return index > 0 && uri->path.len > index; +} + +static inline bool +is_uri_scheme_char(const int c) +{ + switch (c) { + case ':': + case '+': + case '-': + case '.': + return true; + default: + return is_alpha(c) || is_digit(c); + } +} + +#endif // SERD_URI_UTILS_H diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c new file mode 100644 index 00000000..82ac5eeb --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd/src/writer.c @@ -0,0 +1,1114 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "byte_sink.h" +#include "serd_internal.h" +#include "stack.h" +#include "string_utils.h" +#include "uri_utils.h" + +#include "serd/serd.h" + +#include +#include +#include +#include +#include +#include +#include + +typedef enum { + FIELD_NONE, + FIELD_SUBJECT, + FIELD_PREDICATE, + FIELD_OBJECT, + FIELD_GRAPH +} Field; + +typedef struct { + SerdNode graph; + SerdNode subject; + SerdNode predicate; +} WriteContext; + +static const WriteContext WRITE_CONTEXT_NULL = {{0, 0, 0, 0, SERD_NOTHING}, + {0, 0, 0, 0, SERD_NOTHING}, + {0, 0, 0, 0, SERD_NOTHING}}; + +typedef enum { + SEP_NONE, + SEP_END_S, ///< End of a subject ('.') + SEP_END_P, ///< End of a predicate (';') + SEP_END_O, ///< End of an object (',') + SEP_S_P, ///< Between a subject and predicate (whitespace) + SEP_P_O, ///< Between a predicate and object (whitespace) + SEP_ANON_BEGIN, ///< Start of anonymous node ('[') + SEP_ANON_END, ///< End of anonymous node (']') + SEP_LIST_BEGIN, ///< Start of list ('(') + SEP_LIST_SEP, ///< List separator (whitespace) + SEP_LIST_END, ///< End of list (')') + SEP_GRAPH_BEGIN, ///< Start of graph ('{') + SEP_GRAPH_END, ///< End of graph ('}') + SEP_URI_BEGIN, ///< URI start quote ('<') + SEP_URI_END ///< URI end quote ('>') +} Sep; + +typedef struct { + const char* str; ///< Sep string + uint8_t len; ///< Length of sep string + uint8_t space_before; ///< Newline before sep + uint8_t space_after_node; ///< Newline after sep if after node + uint8_t space_after_sep; ///< Newline after sep if after sep +} SepRule; + +static const SepRule rules[] = {{NULL, 0, 0, 0, 0}, + {" .\n\n", 4, 0, 0, 0}, + {" ;", 2, 0, 1, 1}, + {" ,", 2, 0, 1, 0}, + {NULL, 0, 0, 1, 0}, + {" ", 1, 0, 0, 0}, + {"[", 1, 0, 1, 1}, + {"]", 1, 1, 0, 0}, + {"(", 1, 0, 0, 0}, + {NULL, 0, 0, 1, 0}, + {")", 1, 1, 0, 0}, + {" {", 2, 0, 1, 1}, + {" }", 2, 0, 1, 1}, + {"<", 1, 0, 0, 0}, + {">", 1, 0, 0, 0}, + {"\n", 1, 0, 1, 0}}; + +struct SerdWriterImpl { + SerdSyntax syntax; + SerdStyle style; + SerdEnv* env; + SerdNode root_node; + SerdURI root_uri; + SerdURI base_uri; + SerdStack anon_stack; + SerdByteSink byte_sink; + SerdErrorSink error_sink; + void* error_handle; + WriteContext context; + SerdNode list_subj; + unsigned list_depth; + unsigned indent; + uint8_t* bprefix; + size_t bprefix_len; + Sep last_sep; + bool empty; +}; + +typedef enum { WRITE_STRING, WRITE_LONG_STRING } TextContext; + +static bool +write_node(SerdWriter* writer, + const SerdNode* node, + const SerdNode* datatype, + const SerdNode* lang, + Field field, + SerdStatementFlags flags); + +static bool +supports_abbrev(const SerdWriter* writer) +{ + return writer->syntax == SERD_TURTLE || writer->syntax == SERD_TRIG; +} + +static bool +supports_uriref(const SerdWriter* writer) +{ + return writer->syntax == SERD_TURTLE || writer->syntax == SERD_TRIG; +} + +static void +w_err(SerdWriter* writer, SerdStatus st, const char* fmt, ...) +{ + /* TODO: This results in errors with no file information, which is not + helpful when re-serializing a file (particularly for "undefined + namespace prefix" errors. The statement sink API needs to be changed to + add a Cursor parameter so the source can notify the writer of the + statement origin for better error reporting. */ + + va_list args; + va_start(args, fmt); + const SerdError e = {st, (const uint8_t*)"", 0, 0, fmt, &args}; + serd_error(writer->error_sink, writer->error_handle, &e); + va_end(args); +} + +static inline SERD_PURE_FUNC WriteContext* +anon_stack_top(SerdWriter* writer) +{ + assert(!serd_stack_is_empty(&writer->anon_stack)); + return (WriteContext*)(writer->anon_stack.buf + writer->anon_stack.size - + sizeof(WriteContext)); +} + +static void +copy_node(SerdNode* dst, const SerdNode* src) +{ + if (src) { + dst->buf = (uint8_t*)realloc((char*)dst->buf, src->n_bytes + 1); + dst->n_bytes = src->n_bytes; + dst->n_chars = src->n_chars; + dst->flags = src->flags; + dst->type = src->type; + memcpy((char*)dst->buf, src->buf, src->n_bytes + 1); + } else { + dst->type = SERD_NOTHING; + } +} + +static inline size_t +sink(const void* buf, size_t len, SerdWriter* writer) +{ + return serd_byte_sink_write(buf, len, &writer->byte_sink); +} + +// Write a single character, as an escape for single byte characters +// (Caller prints any single byte characters that don't need escaping) +static size_t +write_character(SerdWriter* writer, const uint8_t* utf8, size_t* size) +{ + char escape[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + const uint32_t c = parse_utf8_char(utf8, size); + switch (*size) { + case 0: + w_err(writer, SERD_ERR_BAD_ARG, "invalid UTF-8: %X\n", utf8[0]); + return sink(replacement_char, sizeof(replacement_char), writer); + case 1: + snprintf(escape, sizeof(escape), "\\u%04X", utf8[0]); + return sink(escape, 6, writer); + default: + break; + } + + if (!(writer->style & SERD_STYLE_ASCII)) { + // Write UTF-8 character directly to UTF-8 output + return sink(utf8, *size, writer); + } + + if (c <= 0xFFFF) { + snprintf(escape, sizeof(escape), "\\u%04X", c); + return sink(escape, 6, writer); + } + + snprintf(escape, sizeof(escape), "\\U%08X", c); + return sink(escape, 10, writer); +} + +static inline bool +uri_must_escape(const uint8_t c) +{ + switch (c) { + case ' ': + case '"': + case '<': + case '>': + case '\\': + case '^': + case '`': + case '{': + case '|': + case '}': + return true; + default: + return !in_range(c, 0x20, 0x7E); + } +} + +static size_t +write_uri(SerdWriter* writer, const uint8_t* utf8, size_t n_bytes) +{ + size_t len = 0; + for (size_t i = 0; i < n_bytes;) { + size_t j = i; // Index of next character that must be escaped + for (; j < n_bytes; ++j) { + if (uri_must_escape(utf8[j])) { + break; + } + } + + // Bulk write all characters up to this special one + len += sink(&utf8[i], j - i, writer); + if ((i = j) == n_bytes) { + break; // Reached end + } + + // Write UTF-8 character + size_t size = 0; + len += write_character(writer, utf8 + i, &size); + i += size; + if (size == 0) { + // Corrupt input, scan to start of next character + for (++i; i < n_bytes && (utf8[i] & 0x80); ++i) { + } + } + } + + return len; +} + +static bool +lname_must_escape(const uint8_t c) +{ + /* This arbitrary list of characters, most of which have nothing to do with + Turtle, must be handled as special cases here because the RDF and SPARQL + WGs are apparently intent on making the once elegant Turtle a baroque + and inconsistent mess, throwing elegance and extensibility completely + out the window for no good reason. + + Note '-', '.', and '_' are also in PN_LOCAL_ESC, but are valid unescaped + in local names, so they are not escaped here. */ + + switch (c) { + case '\'': + case '!': + case '#': + case '$': + case '%': + case '&': + case '(': + case ')': + case '*': + case '+': + case ',': + case '/': + case ';': + case '=': + case '?': + case '@': + case '~': + return true; + default: + break; + } + return false; +} + +static size_t +write_lname(SerdWriter* writer, const uint8_t* utf8, size_t n_bytes) +{ + size_t len = 0; + for (size_t i = 0; i < n_bytes; ++i) { + size_t j = i; // Index of next character that must be escaped + for (; j < n_bytes; ++j) { + if (lname_must_escape(utf8[j])) { + break; + } + } + + // Bulk write all characters up to this special one + len += sink(&utf8[i], j - i, writer); + if ((i = j) == n_bytes) { + break; // Reached end + } + + // Write escape + len += sink("\\", 1, writer); + len += sink(&utf8[i], 1, writer); + } + + return len; +} + +static size_t +write_text(SerdWriter* writer, + TextContext ctx, + const uint8_t* utf8, + size_t n_bytes) +{ + size_t len = 0; + for (size_t i = 0; i < n_bytes;) { + // Fast bulk write for long strings of printable ASCII + size_t j = i; + for (; j < n_bytes; ++j) { + if (utf8[j] == '\\' || utf8[j] == '"' || + (!in_range(utf8[j], 0x20, 0x7E))) { + break; + } + } + + len += sink(&utf8[i], j - i, writer); + if ((i = j) == n_bytes) { + break; // Reached end + } + + const uint8_t in = utf8[i++]; + if (ctx == WRITE_LONG_STRING) { + switch (in) { + case '\\': + len += sink("\\\\", 2, writer); + continue; + case '\b': + len += sink("\\b", 2, writer); + continue; + case '\n': + case '\r': + case '\t': + case '\f': + len += sink(&in, 1, writer); // Write character as-is + continue; + case '\"': + if (i == n_bytes) { // '"' at string end + len += sink("\\\"", 2, writer); + } else { + len += sink(&in, 1, writer); + } + continue; + default: + break; + } + } else if (ctx == WRITE_STRING) { + switch (in) { + case '\\': + len += sink("\\\\", 2, writer); + continue; + case '\n': + len += sink("\\n", 2, writer); + continue; + case '\r': + len += sink("\\r", 2, writer); + continue; + case '\t': + len += sink("\\t", 2, writer); + continue; + case '"': + len += sink("\\\"", 2, writer); + continue; + default: + break; + } + if (writer->syntax == SERD_TURTLE) { + switch (in) { + case '\b': + len += sink("\\b", 2, writer); + continue; + case '\f': + len += sink("\\f", 2, writer); + continue; + default: + break; + } + } + } + + // Write UTF-8 character + size_t size = 0; + len += write_character(writer, utf8 + i - 1, &size); + if (size == 0) { + // Corrupt input, scan to start of next character + for (; i < n_bytes && (utf8[i] & 0x80); ++i) { + } + } else { + i += size - 1; + } + } + + return len; +} + +static size_t +uri_sink(const void* buf, size_t len, void* stream) +{ + return write_uri((SerdWriter*)stream, (const uint8_t*)buf, len); +} + +static void +write_newline(SerdWriter* writer) +{ + sink("\n", 1, writer); + for (unsigned i = 0; i < writer->indent; ++i) { + sink("\t", 1, writer); + } +} + +static bool +write_sep(SerdWriter* writer, const Sep sep) +{ + const SepRule* rule = &rules[sep]; + if (rule->space_before) { + write_newline(writer); + } + + if (rule->str) { + sink(rule->str, rule->len, writer); + } + + if ((writer->last_sep && rule->space_after_sep) || + (!writer->last_sep && rule->space_after_node)) { + write_newline(writer); + } else if (writer->last_sep && rule->space_after_node) { + sink(" ", 1, writer); + } + + writer->last_sep = sep; + return true; +} + +static SerdStatus +reset_context(SerdWriter* writer, bool graph) +{ + if (graph) { + writer->context.graph.type = SERD_NOTHING; + } + + writer->context.subject.type = SERD_NOTHING; + writer->context.predicate.type = SERD_NOTHING; + writer->empty = false; + return SERD_SUCCESS; +} + +static SerdStatus +free_context(SerdWriter* writer) +{ + serd_node_free(&writer->context.graph); + serd_node_free(&writer->context.subject); + serd_node_free(&writer->context.predicate); + return reset_context(writer, true); +} + +static bool +is_inline_start(const SerdWriter* writer, Field field, SerdStatementFlags flags) +{ + return (supports_abbrev(writer) && + ((field == FIELD_SUBJECT && (flags & SERD_ANON_S_BEGIN)) || + (field == FIELD_OBJECT && (flags & SERD_ANON_O_BEGIN)))); +} + +static bool +write_literal(SerdWriter* writer, + const SerdNode* node, + const SerdNode* datatype, + const SerdNode* lang, + SerdStatementFlags flags) +{ + if (supports_abbrev(writer) && datatype && datatype->buf) { + const char* type_uri = (const char*)datatype->buf; + if (!strncmp(type_uri, NS_XSD, sizeof(NS_XSD) - 1) && + (!strcmp(type_uri + sizeof(NS_XSD) - 1, "boolean") || + !strcmp(type_uri + sizeof(NS_XSD) - 1, "integer"))) { + sink(node->buf, node->n_bytes, writer); + return true; + } + + if (!strncmp(type_uri, NS_XSD, sizeof(NS_XSD) - 1) && + !strcmp(type_uri + sizeof(NS_XSD) - 1, "decimal") && + strchr((const char*)node->buf, '.') && + node->buf[node->n_bytes - 1] != '.') { + /* xsd:decimal literals without trailing digits, e.g. "5.", can + not be written bare in Turtle. We could add a 0 which is + prettier, but changes the text and breaks round tripping. + */ + sink(node->buf, node->n_bytes, writer); + return true; + } + } + + if (supports_abbrev(writer) && + (node->flags & (SERD_HAS_NEWLINE | SERD_HAS_QUOTE))) { + sink("\"\"\"", 3, writer); + write_text(writer, WRITE_LONG_STRING, node->buf, node->n_bytes); + sink("\"\"\"", 3, writer); + } else { + sink("\"", 1, writer); + write_text(writer, WRITE_STRING, node->buf, node->n_bytes); + sink("\"", 1, writer); + } + if (lang && lang->buf) { + sink("@", 1, writer); + sink(lang->buf, lang->n_bytes, writer); + } else if (datatype && datatype->buf) { + sink("^^", 2, writer); + return write_node(writer, datatype, NULL, NULL, FIELD_NONE, flags); + } + return true; +} + +// Return true iff `buf` is a valid prefixed name suffix +static inline bool +is_name(const uint8_t* buf, const size_t len) +{ + // TODO: This is more strict than it should be + for (size_t i = 0; i < len; ++i) { + if (!(is_alpha(buf[i]) || is_digit(buf[i]))) { + return false; + } + } + + return true; +} + +static bool +write_uri_node(SerdWriter* const writer, + const SerdNode* node, + const Field field, + const SerdStatementFlags flags) +{ + SerdNode prefix; + SerdChunk suffix; + + if (is_inline_start(writer, field, flags)) { + ++writer->indent; + write_sep(writer, SEP_ANON_BEGIN); + sink("== ", 3, writer); + } + + const bool has_scheme = serd_uri_string_has_scheme(node->buf); + if (supports_abbrev(writer)) { + if (field == FIELD_PREDICATE && + !strcmp((const char*)node->buf, NS_RDF "type")) { + return sink("a", 1, writer) == 1; + } + + if (!strcmp((const char*)node->buf, NS_RDF "nil")) { + return sink("()", 2, writer) == 2; + } + + if (has_scheme && (writer->style & SERD_STYLE_CURIED) && + serd_env_qualify(writer->env, node, &prefix, &suffix) && + is_name(suffix.buf, suffix.len)) { + write_uri(writer, prefix.buf, prefix.n_bytes); + sink(":", 1, writer); + write_uri(writer, suffix.buf, suffix.len); + return true; + } + } + + if (!has_scheme && !supports_uriref(writer) && + !serd_env_get_base_uri(writer->env, NULL)->buf) { + w_err(writer, + SERD_ERR_BAD_ARG, + "syntax does not support URI reference <%s>\n", + node->buf); + return false; + } + + write_sep(writer, SEP_URI_BEGIN); + if (writer->style & SERD_STYLE_RESOLVED) { + SerdURI in_base_uri; + SerdURI uri; + SerdURI abs_uri; + serd_env_get_base_uri(writer->env, &in_base_uri); + serd_uri_parse(node->buf, &uri); + serd_uri_resolve(&uri, &in_base_uri, &abs_uri); + bool rooted = uri_is_under(&writer->base_uri, &writer->root_uri); + SerdURI* root = rooted ? &writer->root_uri : &writer->base_uri; + if (!uri_is_under(&abs_uri, root) || writer->syntax == SERD_NTRIPLES || + writer->syntax == SERD_NQUADS) { + serd_uri_serialise(&abs_uri, uri_sink, writer); + } else { + serd_uri_serialise_relative( + &uri, &writer->base_uri, root, uri_sink, writer); + } + } else { + write_uri(writer, node->buf, node->n_bytes); + } + + write_sep(writer, SEP_URI_END); + if (is_inline_start(writer, field, flags)) { + sink(" ;", 2, writer); + write_newline(writer); + } + + return true; +} + +static bool +write_curie(SerdWriter* const writer, + const SerdNode* node, + const Field field, + const SerdStatementFlags flags) +{ + SerdChunk prefix = {NULL, 0}; + SerdChunk suffix = {NULL, 0}; + SerdStatus st = SERD_SUCCESS; + + switch (writer->syntax) { + case SERD_NTRIPLES: + case SERD_NQUADS: + if ((st = serd_env_expand(writer->env, node, &prefix, &suffix))) { + w_err(writer, st, "undefined namespace prefix `%s'\n", node->buf); + return false; + } + write_sep(writer, SEP_URI_BEGIN); + write_uri(writer, prefix.buf, prefix.len); + write_uri(writer, suffix.buf, suffix.len); + write_sep(writer, SEP_URI_END); + break; + case SERD_TURTLE: + case SERD_TRIG: + if (is_inline_start(writer, field, flags)) { + ++writer->indent; + write_sep(writer, SEP_ANON_BEGIN); + sink("== ", 3, writer); + } + write_lname(writer, node->buf, node->n_bytes); + if (is_inline_start(writer, field, flags)) { + sink(" ;", 2, writer); + write_newline(writer); + } + } + + return true; +} + +static bool +write_blank(SerdWriter* const writer, + const SerdNode* node, + const Field field, + const SerdStatementFlags flags) +{ + if (supports_abbrev(writer)) { + if (is_inline_start(writer, field, flags)) { + ++writer->indent; + return write_sep(writer, SEP_ANON_BEGIN); + } + + if (field == FIELD_SUBJECT && (flags & SERD_LIST_S_BEGIN)) { + assert(writer->list_depth == 0); + copy_node(&writer->list_subj, node); + ++writer->list_depth; + ++writer->indent; + return write_sep(writer, SEP_LIST_BEGIN); + } + + if (field == FIELD_OBJECT && (flags & SERD_LIST_O_BEGIN)) { + ++writer->indent; + ++writer->list_depth; + return write_sep(writer, SEP_LIST_BEGIN); + } + + if ((field == FIELD_SUBJECT && (flags & SERD_EMPTY_S)) || + (field == FIELD_OBJECT && (flags & SERD_EMPTY_O))) { + return sink("[]", 2, writer) == 2; + } + } + + sink("_:", 2, writer); + if (writer->bprefix && !strncmp((const char*)node->buf, + (const char*)writer->bprefix, + writer->bprefix_len)) { + sink(node->buf + writer->bprefix_len, + node->n_bytes - writer->bprefix_len, + writer); + } else { + sink(node->buf, node->n_bytes, writer); + } + + return true; +} + +static bool +write_node(SerdWriter* writer, + const SerdNode* node, + const SerdNode* datatype, + const SerdNode* lang, + Field field, + SerdStatementFlags flags) +{ + bool ret = false; + switch (node->type) { + case SERD_NOTHING: + break; + case SERD_LITERAL: + ret = write_literal(writer, node, datatype, lang, flags); + break; + case SERD_URI: + ret = write_uri_node(writer, node, field, flags); + break; + case SERD_CURIE: + ret = write_curie(writer, node, field, flags); + break; + case SERD_BLANK: + ret = write_blank(writer, node, field, flags); + break; + } + + writer->last_sep = SEP_NONE; + return ret; +} + +static inline bool +is_resource(const SerdNode* node) +{ + return node && node->buf && node->type > SERD_LITERAL; +} + +static void +write_pred(SerdWriter* writer, SerdStatementFlags flags, const SerdNode* pred) +{ + write_node(writer, pred, NULL, NULL, FIELD_PREDICATE, flags); + write_sep(writer, SEP_P_O); + copy_node(&writer->context.predicate, pred); +} + +static bool +write_list_obj(SerdWriter* writer, + SerdStatementFlags flags, + const SerdNode* predicate, + const SerdNode* object, + const SerdNode* datatype, + const SerdNode* lang) +{ + if (!strcmp((const char*)object->buf, NS_RDF "nil")) { + --writer->indent; + write_sep(writer, SEP_LIST_END); + return true; + } + + if (!strcmp((const char*)predicate->buf, NS_RDF "first")) { + write_sep(writer, SEP_LIST_SEP); + write_node(writer, object, datatype, lang, FIELD_OBJECT, flags); + } + + return false; +} + +SerdStatus +serd_writer_write_statement(SerdWriter* writer, + SerdStatementFlags flags, + const SerdNode* graph, + const SerdNode* subject, + const SerdNode* predicate, + const SerdNode* object, + const SerdNode* datatype, + const SerdNode* lang) +{ + if (!is_resource(subject) || !is_resource(predicate) || !object || + !object->buf) { + return SERD_ERR_BAD_ARG; + } + +#define TRY(write_result) \ + do { \ + if (!(write_result)) { \ + return SERD_ERR_UNKNOWN; \ + } \ + } while (0) + + if (writer->syntax == SERD_NTRIPLES || writer->syntax == SERD_NQUADS) { + TRY(write_node(writer, subject, NULL, NULL, FIELD_SUBJECT, flags)); + sink(" ", 1, writer); + TRY(write_node(writer, predicate, NULL, NULL, FIELD_PREDICATE, flags)); + sink(" ", 1, writer); + TRY(write_node(writer, object, datatype, lang, FIELD_OBJECT, flags)); + if (writer->syntax == SERD_NQUADS && graph) { + sink(" ", 1, writer); + TRY(write_node(writer, graph, datatype, lang, FIELD_GRAPH, flags)); + } + sink(" .\n", 3, writer); + return SERD_SUCCESS; + } + + if ((graph && !serd_node_equals(graph, &writer->context.graph)) || + (!graph && writer->context.graph.type)) { + writer->indent = 0; + + if (writer->context.subject.type) { + write_sep(writer, SEP_END_S); + } + + if (writer->context.graph.type) { + write_sep(writer, SEP_GRAPH_END); + } + + reset_context(writer, true); + if (graph) { + TRY(write_node(writer, graph, datatype, lang, FIELD_GRAPH, flags)); + ++writer->indent; + write_sep(writer, SEP_GRAPH_BEGIN); + copy_node(&writer->context.graph, graph); + } + } + + if ((flags & SERD_LIST_CONT)) { + if (write_list_obj(writer, flags, predicate, object, datatype, lang)) { + // Reached end of list + if (--writer->list_depth == 0 && writer->list_subj.type) { + reset_context(writer, false); + serd_node_free(&writer->context.subject); + writer->context.subject = writer->list_subj; + writer->list_subj = SERD_NODE_NULL; + } + return SERD_SUCCESS; + } + } else if (serd_node_equals(subject, &writer->context.subject)) { + if (serd_node_equals(predicate, &writer->context.predicate)) { + // Abbreviate S P + if (!(flags & SERD_ANON_O_BEGIN)) { + ++writer->indent; + } + write_sep(writer, SEP_END_O); + write_node(writer, object, datatype, lang, FIELD_OBJECT, flags); + if (!(flags & SERD_ANON_O_BEGIN)) { + --writer->indent; + } + } else { + // Abbreviate S + Sep sep = writer->context.predicate.type ? SEP_END_P : SEP_S_P; + write_sep(writer, sep); + write_pred(writer, flags, predicate); + write_node(writer, object, datatype, lang, FIELD_OBJECT, flags); + } + } else { + // No abbreviation + if (writer->context.subject.type) { + assert(writer->indent > 0); + --writer->indent; + if (serd_stack_is_empty(&writer->anon_stack)) { + write_sep(writer, SEP_END_S); + } + } else if (!writer->empty) { + write_sep(writer, SEP_S_P); + } + + if (!(flags & SERD_ANON_CONT)) { + write_node(writer, subject, NULL, NULL, FIELD_SUBJECT, flags); + ++writer->indent; + write_sep(writer, SEP_S_P); + } else { + ++writer->indent; + } + + reset_context(writer, false); + copy_node(&writer->context.subject, subject); + + if (!(flags & SERD_LIST_S_BEGIN)) { + write_pred(writer, flags, predicate); + } + + write_node(writer, object, datatype, lang, FIELD_OBJECT, flags); + } + + if (flags & (SERD_ANON_S_BEGIN | SERD_ANON_O_BEGIN)) { + WriteContext* ctx = + (WriteContext*)serd_stack_push(&writer->anon_stack, sizeof(WriteContext)); + *ctx = writer->context; + WriteContext new_context = { + serd_node_copy(graph), serd_node_copy(subject), SERD_NODE_NULL}; + if ((flags & SERD_ANON_S_BEGIN)) { + new_context.predicate = serd_node_copy(predicate); + } + writer->context = new_context; + } else { + copy_node(&writer->context.graph, graph); + copy_node(&writer->context.subject, subject); + copy_node(&writer->context.predicate, predicate); + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_writer_end_anon(SerdWriter* writer, const SerdNode* node) +{ + if (writer->syntax == SERD_NTRIPLES || writer->syntax == SERD_NQUADS) { + return SERD_SUCCESS; + } + + if (serd_stack_is_empty(&writer->anon_stack) || writer->indent == 0) { + w_err(writer, SERD_ERR_UNKNOWN, "unexpected end of anonymous node\n"); + return SERD_ERR_UNKNOWN; + } + + --writer->indent; + write_sep(writer, SEP_ANON_END); + free_context(writer); + writer->context = *anon_stack_top(writer); + serd_stack_pop(&writer->anon_stack, sizeof(WriteContext)); + const bool is_subject = serd_node_equals(node, &writer->context.subject); + if (is_subject) { + copy_node(&writer->context.subject, node); + writer->context.predicate.type = SERD_NOTHING; + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_writer_finish(SerdWriter* writer) +{ + if (writer->context.subject.type) { + write_sep(writer, SEP_END_S); + } + + if (writer->context.graph.type) { + write_sep(writer, SEP_GRAPH_END); + } + + serd_byte_sink_flush(&writer->byte_sink); + writer->indent = 0; + return free_context(writer); +} + +SerdWriter* +serd_writer_new(SerdSyntax syntax, + SerdStyle style, + SerdEnv* env, + const SerdURI* base_uri, + SerdSink ssink, + void* stream) +{ + const WriteContext context = WRITE_CONTEXT_NULL; + SerdWriter* writer = (SerdWriter*)calloc(1, sizeof(SerdWriter)); + + writer->syntax = syntax; + writer->style = style; + writer->env = env; + writer->root_node = SERD_NODE_NULL; + writer->root_uri = SERD_URI_NULL; + writer->base_uri = base_uri ? *base_uri : SERD_URI_NULL; + writer->anon_stack = serd_stack_new(4 * sizeof(WriteContext)); + writer->context = context; + writer->list_subj = SERD_NODE_NULL; + writer->empty = true; + writer->byte_sink = serd_byte_sink_new( + ssink, stream, (style & SERD_STYLE_BULK) ? SERD_PAGE_SIZE : 1); + + return writer; +} + +void +serd_writer_set_error_sink(SerdWriter* writer, + SerdErrorSink error_sink, + void* error_handle) +{ + writer->error_sink = error_sink; + writer->error_handle = error_handle; +} + +void +serd_writer_chop_blank_prefix(SerdWriter* writer, const uint8_t* prefix) +{ + free(writer->bprefix); + writer->bprefix_len = 0; + writer->bprefix = NULL; + + const size_t prefix_len = prefix ? strlen((const char*)prefix) : 0; + if (prefix_len) { + writer->bprefix_len = prefix_len; + writer->bprefix = (uint8_t*)malloc(writer->bprefix_len + 1); + memcpy(writer->bprefix, prefix, writer->bprefix_len + 1); + } +} + +SerdStatus +serd_writer_set_base_uri(SerdWriter* writer, const SerdNode* uri) +{ + if (!serd_env_set_base_uri(writer->env, uri)) { + serd_env_get_base_uri(writer->env, &writer->base_uri); + + if (writer->syntax == SERD_TURTLE || writer->syntax == SERD_TRIG) { + if (writer->context.graph.type || writer->context.subject.type) { + sink(" .\n\n", 4, writer); + reset_context(writer, true); + } + sink("@base <", 7, writer); + sink(uri->buf, uri->n_bytes, writer); + sink("> .\n", 4, writer); + } + writer->indent = 0; + return reset_context(writer, true); + } + + return SERD_ERR_UNKNOWN; +} + +SerdStatus +serd_writer_set_root_uri(SerdWriter* writer, const SerdNode* uri) +{ + serd_node_free(&writer->root_node); + + if (uri && uri->buf) { + writer->root_node = serd_node_copy(uri); + serd_uri_parse(uri->buf, &writer->root_uri); + } else { + writer->root_node = SERD_NODE_NULL; + writer->root_uri = SERD_URI_NULL; + } + + return SERD_SUCCESS; +} + +SerdStatus +serd_writer_set_prefix(SerdWriter* writer, + const SerdNode* name, + const SerdNode* uri) +{ + if (!serd_env_set_prefix(writer->env, name, uri)) { + if (writer->syntax == SERD_TURTLE || writer->syntax == SERD_TRIG) { + if (writer->context.graph.type || writer->context.subject.type) { + sink(" .\n\n", 4, writer); + reset_context(writer, true); + } + sink("@prefix ", 8, writer); + sink(name->buf, name->n_bytes, writer); + sink(": <", 3, writer); + write_uri(writer, uri->buf, uri->n_bytes); + sink("> .\n", 4, writer); + } + writer->indent = 0; + return reset_context(writer, true); + } + + return SERD_ERR_UNKNOWN; +} + +void +serd_writer_free(SerdWriter* writer) +{ + if (!writer) { + return; + } + + serd_writer_finish(writer); + serd_stack_free(&writer->anon_stack); + free(writer->bprefix); + serd_byte_sink_free(&writer->byte_sink); + serd_node_free(&writer->root_node); + free(writer); +} + +SerdEnv* +serd_writer_get_env(SerdWriter* writer) +{ + return writer->env; +} + +size_t +serd_file_sink(const void* buf, size_t len, void* stream) +{ + return fwrite(buf, 1, len, (FILE*)stream); +} + +size_t +serd_chunk_sink(const void* buf, size_t len, void* stream) +{ + SerdChunk* chunk = (SerdChunk*)stream; + chunk->buf = (uint8_t*)realloc((uint8_t*)chunk->buf, chunk->len + len); + memcpy((uint8_t*)chunk->buf + chunk->len, buf, len); + chunk->len += len; + return len; +} + +uint8_t* +serd_chunk_sink_finish(SerdChunk* stream) +{ + serd_chunk_sink("", 1, stream); + return (uint8_t*)stream->buf; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h b/modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h new file mode 100644 index 00000000..1a3e2865 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/serd_config.h @@ -0,0 +1,33 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +/* + Instead of providing a config header per lv2-related library, we put all + of the config in a single file, which is included below. +*/ + +#pragma once + +#include "juce_lv2_config.h" diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/COPYING b/modules/juce_audio_processors/format_types/LV2_SDK/sord/COPYING new file mode 100644 index 00000000..9748bb93 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/COPYING @@ -0,0 +1,13 @@ +Copyright 2011-2021 David Robillard + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h b/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h new file mode 100644 index 00000000..a3270311 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sord.h @@ -0,0 +1,642 @@ +/* + Copyright 2011-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file sord.h API for Sord, a lightweight RDF model library. +*/ + +#ifndef SORD_SORD_H +#define SORD_SORD_H + +#include "serd/serd.h" + +#include +#include +#include + +#if defined(_WIN32) && !defined(SORD_STATIC) && defined(SORD_INTERNAL) +# define SORD_API __declspec(dllexport) +#elif defined(_WIN32) && !defined(SORD_STATIC) +# define SORD_API __declspec(dllimport) +#elif defined(__GNUC__) +# define SORD_API __attribute__((visibility("default"))) +#else +# define SORD_API +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + @defgroup sord Sord + A lightweight RDF model library. + + Sord stores RDF (subject object predicate context) quads, where the context + may be omitted (to represent triples in the default graph). + @{ +*/ + +/** + Sord World. + The World represents all library state, including interned strings. +*/ +typedef struct SordWorldImpl SordWorld; + +/** + Sord Model. + + A model is an indexed set of Quads (i.e. it can contain several RDF + graphs). It may be searched using various patterns depending on which + indices are enabled. +*/ +typedef struct SordModelImpl SordModel; + +/** + Model Inserter. + + An inserter is used for writing statements to a model using the Serd sink + interface. This makes it simple to write to a model directly using a + SerdReader, or any other code that writes statements to a SerdStatementSink. +*/ +typedef struct SordInserterImpl SordInserter; + +/** + Model Iterator. +*/ +typedef struct SordIterImpl SordIter; + +/** + RDF Node. + A Node is a component of a Quad. Nodes may be URIs, blank nodes, or + (in the case of quad objects only) string literals. Literal nodes may + have an associate language or datatype (but not both). +*/ +typedef struct SordNodeImpl SordNode; + +/** + Quad of nodes (a statement), or a quad pattern. + + Nodes are ordered (S P O G). The ID of the default graph is 0. +*/ +typedef const SordNode* SordQuad[4]; + +/** + Index into a SordQuad. +*/ +typedef enum { + SORD_SUBJECT = 0, /**< Subject */ + SORD_PREDICATE = 1, /**< Predicate ("key") */ + SORD_OBJECT = 2, /**< Object ("value") */ + SORD_GRAPH = 3 /**< Graph ("context") */ +} SordQuadIndex; + +/** + Type of a node. +*/ +typedef enum { + SORD_URI = 1, /**< URI */ + SORD_BLANK = 2, /**< Blank node identifier */ + SORD_LITERAL = 3 /**< Literal (string with optional lang or datatype) */ +} SordNodeType; + +/** + Indexing option. +*/ +typedef enum { + SORD_SPO = 1, /**< Subject, Predicate, Object */ + SORD_SOP = 1 << 1, /**< Subject, Object, Predicate */ + SORD_OPS = 1 << 2, /**< Object, Predicate, Subject */ + SORD_OSP = 1 << 3, /**< Object, Subject, Predicate */ + SORD_PSO = 1 << 4, /**< Predicate, Subject, Object */ + SORD_POS = 1 << 5 /**< Predicate, Object, Subject */ +} SordIndexOption; + +/** + @name World + @{ +*/ + +/** + Create a new Sord World. + It is safe to use multiple worlds in one process, though no data + (e.g. nodes) can be shared between worlds, and this should be avoided if + possible for performance reasons. +*/ +SORD_API +SordWorld* +sord_world_new(void); + +/** + Free `world`. +*/ +SORD_API +void +sord_world_free(SordWorld* world); + +/** + Set a function to be called when errors occur. + + The `error_sink` will be called with `handle` as its first argument. If + no error function is set, errors are printed to stderr. +*/ +SORD_API +void +sord_world_set_error_sink(SordWorld* world, + SerdErrorSink error_sink, + void* handle); + +/** + @} + @name Node + @{ +*/ + +/** + Get a URI node from a string. + + Note this function measures `str`, which is a common bottleneck. + Use sord_node_from_serd_node() instead if `str` is already measured. +*/ +SORD_API +SordNode* +sord_new_uri(SordWorld* world, const uint8_t* uri); + +/** + Get a URI node from a relative URI string. +*/ +SORD_API +SordNode* +sord_new_relative_uri(SordWorld* world, + const uint8_t* uri, + const uint8_t* base_uri); + +/** + Get a blank node from a string. + + Note this function measures `str`, which is a common bottleneck. + Use sord_node_from_serd_node() instead if `str` is already measured. +*/ +SORD_API +SordNode* +sord_new_blank(SordWorld* world, const uint8_t* str); + +/** + Get a literal node from a string. + + Note this function measures `str`, which is a common bottleneck. + Use sord_node_from_serd_node() instead if `str` is already measured. +*/ +SORD_API +SordNode* +sord_new_literal(SordWorld* world, + SordNode* datatype, + const uint8_t* str, + const char* lang); + +/** + Copy a node (obtain a reference). + + Node that since nodes are interned and reference counted, this does not + actually create a deep copy of `node`. +*/ +SORD_API +SordNode* +sord_node_copy(const SordNode* node); + +/** + Free a node (drop a reference). +*/ +SORD_API +void +sord_node_free(SordWorld* world, SordNode* node); + +/** + Return the type of a node (SORD_URI, SORD_BLANK, or SORD_LITERAL). +*/ +SORD_API +SordNodeType +sord_node_get_type(const SordNode* node); + +/** + Return the string value of a node. +*/ +SORD_API +const uint8_t* +sord_node_get_string(const SordNode* node); + +/** + Return the string value of a node, and set `bytes` to its length in bytes. +*/ +SORD_API +const uint8_t* +sord_node_get_string_counted(const SordNode* node, size_t* bytes); + +/** + Return the string value of a node, and set `bytes` to its length in bytes, + and `count` to its length in characters. +*/ +SORD_API +const uint8_t* +sord_node_get_string_measured(const SordNode* node, + size_t* bytes, + size_t* chars); + +/** + Return the language of a literal node (or NULL). +*/ +SORD_API +const char* +sord_node_get_language(const SordNode* node); + +/** + Return the datatype URI of a literal node (or NULL). +*/ +SORD_API +SordNode* +sord_node_get_datatype(const SordNode* node); + +/** + Return the flags (string attributes) of a node. +*/ +SORD_API +SerdNodeFlags +sord_node_get_flags(const SordNode* node); + +/** + Return true iff node can be serialised as an inline object. + + More specifically, this returns true iff the node is the object field + of exactly one statement, and therefore can be inlined since it needn't + be referred to by name. +*/ +SORD_API +bool +sord_node_is_inline_object(const SordNode* node); + +/** + Return true iff `a` is equal to `b`. + + Note this is much faster than comparing the node's strings. +*/ +SORD_API +bool +sord_node_equals(const SordNode* a, const SordNode* b); + +/** + Return a SordNode as a SerdNode. + + The returned node is shared and must not be freed or modified. +*/ +SORD_API +const SerdNode* +sord_node_to_serd_node(const SordNode* node); + +/** + Create a new SordNode from a SerdNode. + + The returned node must be freed using sord_node_free(). +*/ +SORD_API +SordNode* +sord_node_from_serd_node(SordWorld* world, + SerdEnv* env, + const SerdNode* node, + const SerdNode* datatype, + const SerdNode* lang); + +/** + @} + @name Model + @{ +*/ + +/** + Create a new model. + + @param world The world in which to make this model. + + @param indices SordIndexOption flags (e.g. SORD_SPO|SORD_OPS). Be sure to + enable an index where the most significant node(s) are not variables in your + queries (e.g. to make (? P O) queries, enable either SORD_OPS or SORD_POS). + + @param graphs If true, store (and index) graph contexts. +*/ +SORD_API +SordModel* +sord_new(SordWorld* world, unsigned indices, bool graphs); + +/** + Close and free `model`. +*/ +SORD_API +void +sord_free(SordModel* model); + +/** + Get the world associated with `model`. +*/ +SORD_API +SordWorld* +sord_get_world(SordModel* model); + +/** + Return the number of nodes stored in `world`. + + Nodes are included in this count iff they are a part of a quad in `world`. +*/ +SORD_API +size_t +sord_num_nodes(const SordWorld* world); + +/** + Return the number of quads stored in `model`. +*/ +SORD_API +size_t +sord_num_quads(const SordModel* model); + +/** + Return an iterator to the start of `model`. +*/ +SORD_API +SordIter* +sord_begin(const SordModel* model); + +/** + Search for statements by a quad pattern. + @return an iterator to the first match, or NULL if no matches found. +*/ +SORD_API +SordIter* +sord_find(SordModel* model, const SordQuad pat); + +/** + Search for statements by nodes. + @return an iterator to the first match, or NULL if no matches found. +*/ +SORD_API +SordIter* +sord_search(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g); +/** + Search for a single node that matches a pattern. + Exactly one of `s`, `p`, `o` must be NULL. + This function is mainly useful for predicates that only have one value. + The returned node must be freed using sord_node_free(). + @return the first matching node, or NULL if no matches are found. +*/ +SORD_API +SordNode* +sord_get(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g); + +/** + Return true iff a statement exists. +*/ +SORD_API +bool +sord_ask(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g); + +/** + Return the number of matching statements. +*/ +SORD_API +uint64_t +sord_count(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g); + +/** + Check if `model` contains a triple pattern. + + @return true if `model` contains a match for `pat`, otherwise false. +*/ +SORD_API +bool +sord_contains(SordModel* model, const SordQuad pat); + +/** + Add a quad to a model. + + Calling this function invalidates all iterators on `model`. + + @return true on success, false, on error. +*/ +SORD_API +bool +sord_add(SordModel* model, const SordQuad tup); + +/** + Remove a quad from a model. + + Calling this function invalidates all iterators on `model`. To remove quads + while iterating, use sord_erase() instead. +*/ +SORD_API +void +sord_remove(SordModel* model, const SordQuad tup); + +/** + Remove a quad from a model via an iterator. + + Calling this function invalidates all iterators on `model` except `iter`. + + @param model The model which `iter` points to. + @param iter Iterator to the element to erase, which is incremented to the + next value on return. +*/ +SORD_API +SerdStatus +sord_erase(SordModel* model, SordIter* iter); + +/** + @} + @name Inserter + @{ +*/ + +/** + Create an inserter for writing statements to a model. +*/ +SORD_API +SordInserter* +sord_inserter_new(SordModel* model, SerdEnv* env); + +/** + Free an inserter. +*/ +SORD_API +void +sord_inserter_free(SordInserter* inserter); + +/** + Set the current base URI for writing to the model. + + Note this function can be safely casted to SerdBaseSink. +*/ +SORD_API +SerdStatus +sord_inserter_set_base_uri(SordInserter* inserter, const SerdNode* uri); + +/** + Set a namespace prefix for writing to the model. + + Note this function can be safely casted to SerdPrefixSink. +*/ +SORD_API +SerdStatus +sord_inserter_set_prefix(SordInserter* inserter, + const SerdNode* name, + const SerdNode* uri); + +/** + Write a statement to the model. + + Note this function can be safely casted to SerdStatementSink. +*/ +SORD_API +SerdStatus +sord_inserter_write_statement(SordInserter* inserter, + SerdStatementFlags flags, + const SerdNode* graph, + const SerdNode* subject, + const SerdNode* predicate, + const SerdNode* object, + const SerdNode* object_datatype, + const SerdNode* object_lang); + +/** + @} + @name Iteration + @{ +*/ + +/** + Set `quad` to the quad pointed to by `iter`. +*/ +SORD_API +void +sord_iter_get(const SordIter* iter, SordQuad tup); + +/** + Return a field of the quad pointed to by `iter`. + + Returns NULL if `iter` is NULL or is at the end. +*/ +SORD_API +const SordNode* +sord_iter_get_node(const SordIter* iter, SordQuadIndex index); + +/** + Return the store pointed to by `iter`. +*/ +SORD_API +const SordModel* +sord_iter_get_model(SordIter* iter); + +/** + Increment `iter` to point to the next statement. +*/ +SORD_API +bool +sord_iter_next(SordIter* iter); + +/** + Return true iff `iter` is at the end of its range. +*/ +SORD_API +bool +sord_iter_end(const SordIter* iter); + +/** + Free `iter`. +*/ +SORD_API +void +sord_iter_free(SordIter* iter); + +/** + @} + @name Utilities + @{ +*/ + +/** + Match two quads (using ID comparison only). + + This function is a straightforward and fast equivalence match with wildcard + support (ID 0 is a wildcard). It does not actually read node data. + @return true iff `x` and `y` match. +*/ +SORD_API +bool +sord_quad_match(const SordQuad x, const SordQuad y); + +/** + @} + @name Serialisation + @{ +*/ + +/** + Return a reader that will read into `model`. +*/ +SORD_API +SerdReader* +sord_new_reader(SordModel* model, + SerdEnv* env, + SerdSyntax syntax, + SordNode* graph); + +/** + Write a model to a writer. +*/ +SORD_API +bool +sord_write(SordModel* model, SerdWriter* writer, SordNode* graph); + +/** + Write a range to a writer. + + This increments `iter` to its end, then frees it. +*/ +SORD_API +bool +sord_write_iter(SordIter* iter, SerdWriter* writer); + +/** + @} + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* SORD_SORD_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp b/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp new file mode 100644 index 00000000..32027cde --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/sord/sordmm.hpp @@ -0,0 +1,720 @@ +/* + Copyright 2011-2013 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file sordmm.hpp + Public Sord C++ API. +*/ + +#ifndef SORD_SORDMM_HPP +#define SORD_SORDMM_HPP + +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#endif + +#include "serd/serd.h" +#include "sord/sord.h" + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SORD_NS_XSD "http://www.w3.org/2001/XMLSchema#" + +namespace Sord { + +/** Utility base class to prevent copying or moving. */ +class Noncopyable +{ +public: + Noncopyable() = default; + ~Noncopyable() = default; + + Noncopyable(const Noncopyable&) = delete; + const Noncopyable& operator=(const Noncopyable&) = delete; + + Noncopyable(Noncopyable&&) = delete; + Noncopyable& operator=(Noncopyable&&) = delete; +}; + +/** C++ wrapper for a Sord object. */ +template +class Wrapper +{ +public: + inline Wrapper(T* c_obj = nullptr) + : _c_obj(c_obj) + {} + + inline T* c_obj() { return _c_obj; } + inline const T* c_obj() const { return _c_obj; } + +protected: + T* _c_obj; +}; + +/** Collection of RDF namespaces with prefixes. */ +class Namespaces : public Wrapper +{ +public: + Namespaces() + : Wrapper(serd_env_new(nullptr)) + {} + + ~Namespaces() { serd_env_free(_c_obj); } + + static inline SerdNode string_to_node(SerdType type, const std::string& s) + { + SerdNode ret = {reinterpret_cast(s.c_str()), + s.length(), + s.length(), + 0, + type}; + return ret; + } + + inline void add(const std::string& name, const std::string& uri) + { + const SerdNode name_node = string_to_node(SERD_LITERAL, name); + const SerdNode uri_node = string_to_node(SERD_URI, uri); + serd_env_set_prefix(_c_obj, &name_node, &uri_node); + } + + inline std::string qualify(std::string uri) const + { + const SerdNode uri_node = string_to_node(SERD_URI, uri); + SerdNode prefix; + SerdChunk suffix; + if (serd_env_qualify(_c_obj, &uri_node, &prefix, &suffix)) { + std::string ret(reinterpret_cast(prefix.buf), + prefix.n_bytes); + ret.append(":").append(reinterpret_cast(suffix.buf), + suffix.len); + return ret; + } + return uri; + } + + inline std::string expand(const std::string& curie) const + { + assert(curie.find(':') != std::string::npos); + SerdNode curie_node = string_to_node(SERD_CURIE, curie); + SerdChunk uri_prefix; + SerdChunk uri_suffix; + if (!serd_env_expand(_c_obj, &curie_node, &uri_prefix, &uri_suffix)) { + std::string ret(reinterpret_cast(uri_prefix.buf), + uri_prefix.len); + ret.append(reinterpret_cast(uri_suffix.buf), uri_suffix.len); + return ret; + } + std::cerr << "CURIE `" << curie << "' has unknown prefix." << std::endl; + return curie; + } +}; + +/** Sord library state. */ +class World + : public Noncopyable + , public Wrapper +{ +public: + inline World() + : _next_blank_id(0) + { + _c_obj = sord_world_new(); + } + + inline ~World() { sord_world_free(_c_obj); } + + inline uint64_t blank_id() { return _next_blank_id++; } + + inline void add_prefix(const std::string& prefix, const std::string& uri) + { + _prefixes.add(prefix, uri); + } + + inline const Namespaces& prefixes() const { return _prefixes; } + inline Namespaces& prefixes() { return _prefixes; } + inline SordWorld* world() { return _c_obj; } + +private: + Namespaces _prefixes; + std::set _blank_ids; + uint64_t _next_blank_id; +}; + +/** An RDF Node (resource, literal, etc) + */ +class Node : public Wrapper +{ +public: + enum Type { + UNKNOWN = 0, + URI = SORD_URI, + BLANK = SORD_BLANK, + LITERAL = SORD_LITERAL + }; + + inline Node() + : Wrapper(nullptr) + , _world(nullptr) + {} + + inline Node(World& world, Type t, const std::string& s); + inline Node(World& world); + inline Node(World& world, const SordNode* node); + inline Node(World& world, SordNode* node, bool copy = false); + inline Node(const Node& other); + inline ~Node(); + + inline Type type() const + { + return _c_obj ? static_cast(sord_node_get_type(_c_obj)) : UNKNOWN; + } + + inline const SordNode* get_node() const { return _c_obj; } + inline SordNode* get_node() { return _c_obj; } + + const SerdNode* to_serd_node() const + { + return sord_node_to_serd_node(_c_obj); + } + + inline bool is_valid() const { return type() != UNKNOWN; } + + inline bool operator<(const Node& other) const + { + if (type() != other.type()) { + return type() < other.type(); + } else { + return to_string() < other.to_string(); + } + } + + Node& operator=(const Node& other) + { + if (&other != this) { + if (_c_obj) { + sord_node_free(_world->c_obj(), _c_obj); + } + _world = other._world; + _c_obj = other._c_obj ? sord_node_copy(other._c_obj) : nullptr; + } + return *this; + } + + inline bool operator==(const Node& other) const + { + return sord_node_equals(_c_obj, other._c_obj); + } + + inline const uint8_t* to_u_string() const; + inline const char* to_c_string() const; + inline std::string to_string() const; + + inline bool is_literal_type(const char* type_uri) const; + + inline bool is_uri() const { return _c_obj && type() == URI; } + inline bool is_blank() const { return _c_obj && type() == BLANK; } + inline bool is_int() const { return is_literal_type(SORD_NS_XSD "integer"); } + inline bool is_float() const + { + return is_literal_type(SORD_NS_XSD "decimal"); + } + inline bool is_bool() const { return is_literal_type(SORD_NS_XSD "boolean"); } + + inline int to_int() const; + inline float to_float() const; + inline bool to_bool() const; + + inline static Node blank_id(World& world, const std::string& base = "b") + { + const uint64_t num = world.blank_id(); + std::ostringstream ss; + ss << base << num; + return Node(world, Node::BLANK, ss.str()); + } + +private: + World* _world; +}; + +inline std::ostream& +operator<<(std::ostream& os, const Node& node) +{ + return os << node.to_string(); +} + +class URI : public Node +{ +public: + inline URI(World& world, const std::string& s) + : Node(world, Node::URI, s) + {} + + inline URI(World& world, const std::string& s, const std::string& base) + : Node( + world, + sord_new_relative_uri(world.world(), + reinterpret_cast(s.c_str()), + reinterpret_cast(base.c_str()))) + {} +}; + +class Curie : public Node +{ +public: + inline Curie(World& world, const std::string& s) + : Node(world, Node::URI, world.prefixes().expand(s)) + {} +}; + +class Literal : public Node +{ +public: + inline Literal(World& world, const std::string& s) + : Node(world, Node::LITERAL, s) + {} + + static inline Node decimal(World& world, double d, unsigned frac_digits) + { + const SerdNode val = serd_node_new_decimal(d, frac_digits); + const SerdNode type = serd_node_from_string( + SERD_URI, reinterpret_cast(SORD_NS_XSD "decimal")); + + return Node( + world, + sord_node_from_serd_node( + world.c_obj(), world.prefixes().c_obj(), &val, &type, nullptr), + false); + } + + static inline Node integer(World& world, int64_t i) + { + const SerdNode val = serd_node_new_integer(i); + const SerdNode type = serd_node_from_string( + SERD_URI, reinterpret_cast(SORD_NS_XSD "integer")); + + return Node( + world, + sord_node_from_serd_node( + world.c_obj(), world.prefixes().c_obj(), &val, &type, nullptr), + false); + } +}; + +inline Node::Node(World& world, Type type, const std::string& s) + : _world(&world) +{ + switch (type) { + case URI: + _c_obj = sord_new_uri(world.world(), + reinterpret_cast(s.c_str())); + break; + case LITERAL: + _c_obj = sord_new_literal(world.world(), + nullptr, + reinterpret_cast(s.c_str()), + nullptr); + break; + case BLANK: + _c_obj = sord_new_blank(world.world(), + reinterpret_cast(s.c_str())); + break; + default: + _c_obj = nullptr; + } + + assert(this->type() == type); +} + +inline Node::Node(World& world) + : _world(&world) +{ + Node me = blank_id(world); + *this = me; +} + +inline Node::Node(World& world, const SordNode* node) + : _world(&world) +{ + _c_obj = sord_node_copy(node); +} + +inline Node::Node(World& world, SordNode* node, bool copy) + : _world(&world) +{ + _c_obj = copy ? sord_node_copy(node) : node; +} + +inline Node::Node(const Node& other) // NOLINT(bugprone-copy-constructor-init) + : Wrapper() + , _world(other._world) +{ + if (_world) { + _c_obj = other._c_obj ? sord_node_copy(other._c_obj) : nullptr; + } + + assert((!_c_obj && !other._c_obj) || to_string() == other.to_string()); +} + +inline Node::~Node() +{ + if (_world) { + sord_node_free(_world->c_obj(), _c_obj); + } +} + +inline std::string +Node::to_string() const +{ + return _c_obj ? reinterpret_cast(sord_node_get_string(_c_obj)) + : ""; +} + +inline const char* +Node::to_c_string() const +{ + return reinterpret_cast(sord_node_get_string(_c_obj)); +} + +inline const uint8_t* +Node::to_u_string() const +{ + return sord_node_get_string(_c_obj); +} + +inline bool +Node::is_literal_type(const char* type_uri) const +{ + if (_c_obj && sord_node_get_type(_c_obj) == SORD_LITERAL) { + const SordNode* datatype = sord_node_get_datatype(_c_obj); + if (datatype && + !strcmp(reinterpret_cast(sord_node_get_string(datatype)), + type_uri)) { + return true; + } + } + return false; +} + +inline int +Node::to_int() const +{ + assert(is_int()); + char* endptr = nullptr; + return strtol( + reinterpret_cast(sord_node_get_string(_c_obj)), &endptr, 10); +} + +inline float +Node::to_float() const +{ + assert(is_float()); + return serd_strtod( + reinterpret_cast(sord_node_get_string(_c_obj)), nullptr); +} + +inline bool +Node::to_bool() const +{ + assert(is_bool()); + return !strcmp(reinterpret_cast(sord_node_get_string(_c_obj)), + "true"); +} + +struct Iter : public Wrapper { + inline Iter(World& world, SordIter* c_obj) + : Wrapper(c_obj) + , _world(world) + {} + + Iter(const Iter&) = delete; + Iter& operator=(const Iter&) = delete; + + inline Iter(Iter&& iter) noexcept + : Wrapper(iter) + , _world(iter._world) + {} + + inline ~Iter() { sord_iter_free(_c_obj); } + + inline bool end() const { return sord_iter_end(_c_obj); } + inline bool next() const { return sord_iter_next(_c_obj); } + inline Iter& operator++() + { + assert(!end()); + next(); + return *this; + } + inline Node get_subject() const + { + SordQuad quad; + sord_iter_get(_c_obj, quad); + return Node(_world, quad[SORD_SUBJECT]); + } + inline Node get_predicate() const + { + SordQuad quad; + sord_iter_get(_c_obj, quad); + return Node(_world, quad[SORD_PREDICATE]); + } + inline Node get_object() const + { + SordQuad quad; + sord_iter_get(_c_obj, quad); + return Node(_world, quad[SORD_OBJECT]); + } + World& _world; +}; + +/** An RDF Model (collection of triples). + */ +class Model + : public Noncopyable + , public Wrapper +{ +public: + inline Model(World& world, + const std::string& base_uri, + unsigned indices = (SORD_SPO | SORD_OPS), + bool graphs = true); + + inline ~Model(); + + inline const Node& base_uri() const { return _base; } + + size_t num_quads() const { return sord_num_quads(_c_obj); } + + inline void load_file(SerdEnv* env, + SerdSyntax syntax, + const std::string& uri, + const std::string& base_uri = ""); + + inline void load_string(SerdEnv* env, + SerdSyntax syntax, + const char* str, + size_t len, + const std::string& base_uri); + + inline SerdStatus write_to_file(const std::string& uri, + SerdSyntax syntax = SERD_TURTLE, + SerdStyle style = static_cast( + SERD_STYLE_ABBREVIATED | SERD_STYLE_CURIED | + SERD_STYLE_RESOLVED)); + + inline std::string write_to_string( + const std::string& base_uri, + SerdSyntax syntax = SERD_TURTLE, + SerdStyle style = static_cast(SERD_STYLE_ABBREVIATED | + SERD_STYLE_CURIED | + SERD_STYLE_RESOLVED)); + + inline void add_statement(const Node& subject, + const Node& predicate, + const Node& object); + + inline Iter find(const Node& subject, + const Node& predicate, + const Node& object); + + inline Node get(const Node& subject, + const Node& predicate, + const Node& object); + + inline World& world() const { return _world; } + +private: + World& _world; + Node _base; +}; + +/** Create an empty in-memory RDF model. + */ +inline Model::Model(World& world, + const std::string& base_uri, + unsigned indices, + bool graphs) + : _world(world) + , _base(world, Node::URI, base_uri) +{ + _c_obj = sord_new(_world.world(), indices, graphs); +} + +inline void +Model::load_string(SerdEnv* env, + SerdSyntax syntax, + const char* str, + size_t /*len*/, + const std::string& /*base_uri*/) +{ + SerdReader* reader = sord_new_reader(_c_obj, env, syntax, nullptr); + serd_reader_read_string(reader, reinterpret_cast(str)); + serd_reader_free(reader); +} + +inline Model::~Model() +{ + sord_free(_c_obj); +} + +inline void +Model::load_file(SerdEnv* env, + SerdSyntax syntax, + const std::string& data_uri, + const std::string& /*base_uri*/) +{ + uint8_t* path = serd_file_uri_parse( + reinterpret_cast(data_uri.c_str()), nullptr); + if (!path) { + fprintf(stderr, "Failed to parse file URI <%s>\n", data_uri.c_str()); + return; + } + + // FIXME: blank prefix parameter? + SerdReader* reader = sord_new_reader(_c_obj, env, syntax, nullptr); + serd_reader_read_file(reader, path); + serd_reader_free(reader); + serd_free(path); +} + +inline SerdStatus +Model::write_to_file(const std::string& uri, SerdSyntax syntax, SerdStyle style) +{ + uint8_t* path = + serd_file_uri_parse(reinterpret_cast(uri.c_str()), nullptr); + if (!path) { + fprintf(stderr, "Failed to parse file URI <%s>\n", uri.c_str()); + return SERD_ERR_BAD_ARG; + } + + FILE* const fd = fopen(reinterpret_cast(path), "w"); + if (!fd) { + fprintf(stderr, "Failed to open file %s\n", path); + serd_free(path); + return SERD_ERR_UNKNOWN; + } + serd_free(path); + + SerdURI base_uri = SERD_URI_NULL; + if (serd_uri_parse(reinterpret_cast(uri.c_str()), + &base_uri)) { + fprintf(stderr, "Invalid base URI <%s>\n", uri.c_str()); + fclose(fd); + return SERD_ERR_BAD_ARG; + } + + SerdWriter* writer = serd_writer_new( + syntax, style, _world.prefixes().c_obj(), &base_uri, serd_file_sink, fd); + + serd_env_foreach(_world.prefixes().c_obj(), + reinterpret_cast(serd_writer_set_prefix), + writer); + + sord_write(_c_obj, writer, nullptr); + serd_writer_free(writer); + fclose(fd); + + return SERD_SUCCESS; +} + +extern "C" { + +static size_t +string_sink(const void* buf, size_t len, void* stream) +{ + try { + auto* str = static_cast(stream); + str->append(static_cast(buf), len); + return len; + } catch (...) { + return 0; + } +} +} + +inline std::string +Model::write_to_string(const std::string& base_uri_str, + SerdSyntax syntax, + SerdStyle style) +{ + SerdURI base_uri = SERD_URI_NULL; + if (serd_uri_parse(reinterpret_cast(base_uri_str.c_str()), + &base_uri)) { + fprintf(stderr, "Invalid base URI <%s>\n", base_uri_str.c_str()); + return ""; + } + + std::string ret; + + SerdWriter* writer = serd_writer_new( + syntax, style, _world.prefixes().c_obj(), &base_uri, string_sink, &ret); + + const SerdNode base_uri_node = serd_node_from_string( + SERD_URI, reinterpret_cast(base_uri_str.c_str())); + serd_writer_set_base_uri(writer, &base_uri_node); + + serd_env_foreach(_world.prefixes().c_obj(), + reinterpret_cast(serd_writer_set_prefix), + writer); + + sord_write(_c_obj, writer, nullptr); + + serd_writer_free(writer); + return ret; +} + +inline void +Model::add_statement(const Node& subject, + const Node& predicate, + const Node& object) +{ + SordQuad quad = {subject.c_obj(), predicate.c_obj(), object.c_obj(), nullptr}; + + sord_add(_c_obj, quad); +} + +inline Iter +Model::find(const Node& subject, const Node& predicate, const Node& object) +{ + SordQuad quad = {subject.c_obj(), predicate.c_obj(), object.c_obj(), nullptr}; + + return Iter(_world, sord_find(_c_obj, quad)); +} + +inline Node +Model::get(const Node& subject, const Node& predicate, const Node& object) +{ + SordNode* c_node = sord_get( + _c_obj, subject.c_obj(), predicate.c_obj(), object.c_obj(), nullptr); + return Node(_world, c_node, false); +} + +} // namespace Sord + +#endif // SORD_SORDMM_HPP diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c new file mode 100644 index 00000000..05e822c9 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord.c @@ -0,0 +1,1368 @@ +/* + Copyright 2011-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "sord_config.h" // IWYU pragma: keep +#include "sord_internal.h" + +#include "serd/serd.h" +#include "sord/sord.h" + +#define ZIX_INLINE +#include "zix/btree.c" +#include "zix/btree.h" +#include "zix/common.h" +#include "zix/digest.c" +#include "zix/hash.c" +#include "zix/hash.h" + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +# define SORD_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define SORD_LOG_FUNC(fmt, arg1) +#endif + +#define SORD_LOG(prefix, ...) fprintf(stderr, "[Sord::" prefix "] " __VA_ARGS__) + +#ifdef SORD_DEBUG_ITER +# define SORD_ITER_LOG(...) SORD_LOG("iter", __VA_ARGS__) +#else +# define SORD_ITER_LOG(...) +#endif +#ifdef SORD_DEBUG_SEARCH +# define SORD_FIND_LOG(...) SORD_LOG("search", __VA_ARGS__) +#else +# define SORD_FIND_LOG(...) +#endif +#ifdef SORD_DEBUG_WRITE +# define SORD_WRITE_LOG(...) SORD_LOG("write", __VA_ARGS__) +#else +# define SORD_WRITE_LOG(...) +#endif + +#define NUM_ORDERS 12 +#define STATEMENT_LEN 3 +#define TUP_LEN (STATEMENT_LEN + 1) +#define DEFAULT_ORDER SPO +#define DEFAULT_GRAPH_ORDER GSPO + +#define TUP_FMT "(%s %s %s %s)" +#define TUP_FMT_ELEM(e) ((e) ? sord_node_get_string(e) : (const uint8_t*)"*") +#define TUP_FMT_ARGS(t) \ + TUP_FMT_ELEM((t)[0]), TUP_FMT_ELEM((t)[1]), TUP_FMT_ELEM((t)[2]), \ + TUP_FMT_ELEM((t)[3]) + +#define TUP_G 3 + +/** Triple ordering */ +typedef enum { + SPO, ///< Subject, Predicate, Object + SOP, ///< Subject, Object, Predicate + OPS, ///< Object, Predicate, Subject + OSP, ///< Object, Subject, Predicate + PSO, ///< Predicate, Subject, Object + POS, ///< Predicate, Object, Subject + GSPO, ///< Graph, Subject, Predicate, Object + GSOP, ///< Graph, Subject, Object, Predicate + GOPS, ///< Graph, Object, Predicate, Subject + GOSP, ///< Graph, Object, Subject, Predicate + GPSO, ///< Graph, Predicate, Subject, Object + GPOS ///< Graph, Predicate, Object, Subject +} SordOrder; + +#ifdef SORD_DEBUG_SEARCH +/** String name of each ordering (array indexed by SordOrder) */ +static const char* const order_names[NUM_ORDERS] = {"spo", + "sop", + "ops", + "osp", + "pso", + "pos", + "gspo", + "gsop", + "gops", + "gosp", + "gpso", + "gpos"}; +#endif + +/** + Quads of indices for each order, from most to least significant + (array indexed by SordOrder) +*/ +static const int orderings[NUM_ORDERS][TUP_LEN] = { + {0, 1, 2, 3}, // SPO + {0, 2, 1, 3}, // SOP + {2, 1, 0, 3}, // OPS + {2, 0, 1, 3}, // OSP + {1, 0, 2, 3}, // PSO + {1, 2, 0, 3}, // POS + {3, 0, 1, 2}, // GSPO + {3, 0, 2, 1}, // GSOP + {3, 2, 1, 0}, // GOPS + {3, 2, 0, 1}, // GOSP + {3, 1, 0, 2}, // GPSO + {3, 1, 2, 0} // GPOS +}; + +/** World */ +struct SordWorldImpl { + ZixHash* nodes; + SerdErrorSink error_sink; + void* error_handle; +}; + +/** Store */ +struct SordModelImpl { + SordWorld* world; + + /** Index for each possible triple ordering (may or may not exist). + * Each index is a tree of SordQuad with the appropriate ordering. + */ + ZixBTree* indices[NUM_ORDERS]; + + size_t n_quads; + size_t n_iters; +}; + +/** Mode for searching or iteration */ +typedef enum { + ALL, ///< Iterate over entire store + SINGLE, ///< Iteration over a single element (exact search) + RANGE, ///< Iterate over range with equal prefix + FILTER_RANGE, ///< Iterate over range with equal prefix, filtering + FILTER_ALL ///< Iterate to end of store, filtering +} SearchMode; + +/** Iterator over some range of a store */ +struct SordIterImpl { + const SordModel* sord; ///< Model being iterated over + ZixBTreeIter* cur; ///< Current DB cursor + SordQuad pat; ///< Pattern (in ordering order) + SordOrder order; ///< Store order (which index) + SearchMode mode; ///< Iteration mode + int n_prefix; ///< Prefix for RANGE and FILTER_RANGE + bool end; ///< True iff reached end + bool skip_graphs; ///< Iteration should ignore graphs +}; + +static uint32_t +sord_node_hash(const void* n) +{ + const SordNode* node = (const SordNode*)n; + uint32_t hash = zix_digest_start(); + hash = zix_digest_add(hash, node->node.buf, node->node.n_bytes); + hash = zix_digest_add(hash, &node->node.type, sizeof(node->node.type)); + if (node->node.type == SERD_LITERAL) { + hash = zix_digest_add(hash, &node->meta.lit, sizeof(node->meta.lit)); + } + return hash; +} + +static bool +sord_node_hash_equal(const void* a, const void* b) +{ + const SordNode* a_node = (const SordNode*)a; + const SordNode* b_node = (const SordNode*)b; + return (a_node == b_node) || + ((a_node->node.type == b_node->node.type) && + (a_node->node.type != SERD_LITERAL || + (a_node->meta.lit.datatype == b_node->meta.lit.datatype && + !strncmp(a_node->meta.lit.lang, + b_node->meta.lit.lang, + sizeof(a_node->meta.lit.lang)))) && + (serd_node_equals(&a_node->node, &b_node->node))); +} + +SORD_LOG_FUNC(3, 4) +static void +error(SordWorld* world, SerdStatus st, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const SerdError e = {st, NULL, 0, 0, fmt, &args}; + if (world->error_sink) { + world->error_sink(world->error_handle, &e); + } else { + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, args); + } + va_end(args); +} + +SordWorld* +sord_world_new(void) +{ + SordWorld* world = (SordWorld*)malloc(sizeof(SordWorld)); + world->error_sink = NULL; + world->error_handle = NULL; + + world->nodes = + zix_hash_new(sord_node_hash, sord_node_hash_equal, sizeof(SordNode)); + + return world; +} + +static void +free_node_entry(void* value, void* user_data) +{ + SordNode* node = (SordNode*)value; + if (node->node.type == SERD_LITERAL) { + sord_node_free((SordWorld*)user_data, node->meta.lit.datatype); + } + free((uint8_t*)node->node.buf); +} + +void +sord_world_free(SordWorld* world) +{ + zix_hash_foreach(world->nodes, free_node_entry, world); + zix_hash_free(world->nodes); + free(world); +} + +void +sord_world_set_error_sink(SordWorld* world, + SerdErrorSink error_sink, + void* handle) +{ + world->error_sink = error_sink; + world->error_handle = handle; +} + +static inline int +sord_node_compare_literal(const SordNode* a, const SordNode* b) +{ + const int cmp = strcmp((const char*)sord_node_get_string(a), + (const char*)sord_node_get_string(b)); + if (cmp != 0) { + return cmp; + } + + const bool a_has_lang = a->meta.lit.lang[0]; + const bool b_has_lang = b->meta.lit.lang[0]; + const bool a_has_datatype = a->meta.lit.datatype; + const bool b_has_datatype = b->meta.lit.datatype; + const bool a_has_meta = a_has_lang || a_has_datatype; + const bool b_has_meta = b_has_lang || b_has_datatype; + + assert(!(a_has_lang && a_has_datatype)); + assert(!(b_has_lang && b_has_datatype)); + + if (!a_has_meta && !b_has_meta) { + return 0; + } else if (!a_has_meta || (a_has_lang && b_has_datatype)) { + return -1; + } else if (!b_has_meta || (a_has_datatype && b_has_lang)) { + return 1; + } else if (a_has_lang) { + assert(b_has_lang); + return strcmp(a->meta.lit.lang, b->meta.lit.lang); + } + + assert(a_has_datatype); + assert(b_has_datatype); + return strcmp((const char*)a->meta.lit.datatype->node.buf, + (const char*)b->meta.lit.datatype->node.buf); +} + +/** Compare nodes, considering NULL a wildcard match. */ +static inline int +sord_node_compare(const SordNode* a, const SordNode* b) +{ + if (a == b || !a || !b) { + return 0; // Exact or wildcard match + } else if (a->node.type != b->node.type) { + return (a->node.type < b->node.type) ? -1 : 1; + } + + int cmp = 0; + switch (a->node.type) { + case SERD_URI: + case SERD_BLANK: + return strcmp((const char*)a->node.buf, (const char*)b->node.buf); + case SERD_LITERAL: + cmp = sord_node_compare_literal(a, b); + break; + default: + break; + } + return cmp; +} + +bool +sord_node_equals(const SordNode* a, const SordNode* b) +{ + return a == b; // Nodes are interned +} + +/** Return true iff IDs are equivalent, or one is a wildcard */ +static inline bool +sord_id_match(const SordNode* a, const SordNode* b) +{ + return !a || !b || (a == b); +} + +static inline bool +sord_quad_match_inline(const SordQuad x, const SordQuad y) +{ + return sord_id_match(x[0], y[0]) && sord_id_match(x[1], y[1]) && + sord_id_match(x[2], y[2]) && sord_id_match(x[3], y[3]); +} + +bool +sord_quad_match(const SordQuad x, const SordQuad y) +{ + return sord_quad_match_inline(x, y); +} + +/** + Compare two quad IDs lexicographically. + NULL IDs (equal to 0) are treated as wildcards, always less than every + other possible ID, except itself. +*/ +static int +sord_quad_compare(const void* x_ptr, const void* y_ptr, const void* user_data) +{ + const int* const ordering = (const int*)user_data; + const SordNode* const* const x = (const SordNode* const*)x_ptr; + const SordNode* const* const y = (const SordNode* const*)y_ptr; + + for (int i = 0; i < TUP_LEN; ++i) { + const int idx = ordering[i]; + const int cmp = sord_node_compare(x[idx], y[idx]); + if (cmp) { + return cmp; + } + } + + return 0; +} + +static inline bool +sord_iter_forward(SordIter* iter) +{ + if (!iter->skip_graphs) { + zix_btree_iter_increment(iter->cur); + return zix_btree_iter_is_end(iter->cur); + } + + SordNode** key = (SordNode**)zix_btree_get(iter->cur); + const SordQuad initial = {key[0], key[1], key[2], key[3]}; + zix_btree_iter_increment(iter->cur); + while (!zix_btree_iter_is_end(iter->cur)) { + key = (SordNode**)zix_btree_get(iter->cur); + for (int i = 0; i < 3; ++i) { + if (key[i] != initial[i]) { + return false; + } + } + + zix_btree_iter_increment(iter->cur); + } + + return true; +} + +/** + Seek forward as necessary until `iter` points at a match. + @return true iff iterator reached end of valid range. +*/ +static inline bool +sord_iter_seek_match(SordIter* iter) +{ + for (iter->end = true; !zix_btree_iter_is_end(iter->cur); + sord_iter_forward(iter)) { + const SordNode** const key = (const SordNode**)zix_btree_get(iter->cur); + if (sord_quad_match_inline(key, iter->pat)) { + return (iter->end = false); + } + } + return true; +} + +/** + Seek forward as necessary until `iter` points at a match, or the prefix + no longer matches iter->pat. + @return true iff iterator reached end of valid range. +*/ +static inline bool +sord_iter_seek_match_range(SordIter* iter) +{ + assert(!iter->end); + + do { + const SordNode** key = (const SordNode**)zix_btree_get(iter->cur); + + if (sord_quad_match_inline(key, iter->pat)) { + return false; // Found match + } + + for (int i = 0; i < iter->n_prefix; ++i) { + const int idx = orderings[iter->order][i]; + if (!sord_id_match(key[idx], iter->pat[idx])) { + iter->end = true; // Reached end of valid range + return true; + } + } + } while (!sord_iter_forward(iter)); + + return (iter->end = true); // Reached end +} + +static SordIter* +sord_iter_new(const SordModel* sord, + ZixBTreeIter* cur, + const SordQuad pat, + SordOrder order, + SearchMode mode, + int n_prefix) +{ + SordIter* iter = (SordIter*)malloc(sizeof(SordIter)); + iter->sord = sord; + iter->cur = cur; + iter->order = order; + iter->mode = mode; + iter->n_prefix = n_prefix; + iter->end = false; + iter->skip_graphs = order < GSPO; + for (int i = 0; i < TUP_LEN; ++i) { + iter->pat[i] = pat[i]; + } + + switch (iter->mode) { + case ALL: + case SINGLE: + case RANGE: + assert(sord_quad_match_inline((const SordNode**)zix_btree_get(iter->cur), + iter->pat)); + break; + case FILTER_RANGE: + sord_iter_seek_match_range(iter); + break; + case FILTER_ALL: + sord_iter_seek_match(iter); + break; + } + +#ifdef SORD_DEBUG_ITER + SordQuad value; + sord_iter_get(iter, value); + SORD_ITER_LOG("New %p pat=" TUP_FMT " cur=" TUP_FMT " end=%d skip=%d\n", + (void*)iter, + TUP_FMT_ARGS(pat), + TUP_FMT_ARGS(value), + iter->end, + iter->skip_graphs); +#endif + + ++((SordModel*)sord)->n_iters; + return iter; +} + +const SordModel* +sord_iter_get_model(SordIter* iter) +{ + return iter->sord; +} + +void +sord_iter_get(const SordIter* iter, SordQuad tup) +{ + SordNode** key = (SordNode**)zix_btree_get(iter->cur); + for (int i = 0; i < TUP_LEN; ++i) { + tup[i] = key[i]; + } +} + +const SordNode* +sord_iter_get_node(const SordIter* iter, SordQuadIndex index) +{ + return (!sord_iter_end(iter) ? ((SordNode**)zix_btree_get(iter->cur))[index] + : NULL); +} + +static bool +sord_iter_scan_next(SordIter* iter) +{ + if (iter->end) { + return true; + } + + const SordNode** key; + if (!iter->end) { + switch (iter->mode) { + case ALL: + // At the end if the cursor is (assigned above) + break; + case SINGLE: + iter->end = true; + SORD_ITER_LOG("%p reached single end\n", (void*)iter); + break; + case RANGE: + SORD_ITER_LOG("%p range next\n", (void*)iter); + // At the end if the MSNs no longer match + key = (const SordNode**)zix_btree_get(iter->cur); + assert(key); + for (int i = 0; i < iter->n_prefix; ++i) { + const int idx = orderings[iter->order][i]; + if (!sord_id_match(key[idx], iter->pat[idx])) { + iter->end = true; + SORD_ITER_LOG("%p reached non-match end\n", (void*)iter); + break; + } + } + break; + case FILTER_RANGE: + // Seek forward to next match, stopping if prefix changes + sord_iter_seek_match_range(iter); + break; + case FILTER_ALL: + // Seek forward to next match + sord_iter_seek_match(iter); + break; + } + } else { + SORD_ITER_LOG("%p reached index end\n", (void*)iter); + } + + if (iter->end) { + SORD_ITER_LOG("%p Reached end\n", (void*)iter); + return true; + } else { +#ifdef SORD_DEBUG_ITER + SordQuad tup; + sord_iter_get(iter, tup); + SORD_ITER_LOG( + "%p Increment to " TUP_FMT "\n", (void*)iter, TUP_FMT_ARGS(tup)); +#endif + return false; + } +} + +bool +sord_iter_next(SordIter* iter) +{ + if (iter->end) { + return true; + } + + iter->end = sord_iter_forward(iter); + return sord_iter_scan_next(iter); +} + +bool +sord_iter_end(const SordIter* iter) +{ + return !iter || iter->end; +} + +void +sord_iter_free(SordIter* iter) +{ + SORD_ITER_LOG("%p Free\n", (void*)iter); + if (iter) { + --((SordModel*)iter->sord)->n_iters; + zix_btree_iter_free(iter->cur); + free(iter); + } +} + +/** + Return true iff `sord` has an index for `order`. + If `graphs` is true, `order` will be modified to be the + corresponding order with a G prepended (so G will be the MSN). +*/ +static inline bool +sord_has_index(SordModel* model, SordOrder* order, int* n_prefix, bool graphs) +{ + if (graphs) { + *order = (SordOrder)(*order + GSPO); + *n_prefix += 1; + } + + return model->indices[*order]; +} + +/** + Return the best available index for a pattern. + @param pat Pattern in standard (S P O G) order + @param mode Set to the (best) iteration mode for iterating over results + @param n_prefix Set to the length of the range prefix + (for `mode` == RANGE and `mode` == FILTER_RANGE) +*/ +static inline SordOrder +sord_best_index(SordModel* sord, + const SordQuad pat, + SearchMode* mode, + int* n_prefix) +{ + const bool graph_search = (pat[TUP_G] != 0); + + const unsigned sig = (pat[0] ? 1 : 0) * 0x100 + (pat[1] ? 1 : 0) * 0x010 + + (pat[2] ? 1 : 0) * 0x001; + + SordOrder good[2] = {(SordOrder)-1, (SordOrder)-1}; + +#define PAT_CASE(sig, m, g0, g1, np) \ + case sig: \ + *mode = m; \ + good[0] = g0; \ + good[1] = g1; \ + *n_prefix = np; \ + break + + // Good orderings that don't require filtering + *mode = RANGE; + *n_prefix = 0; + switch (sig) { + case 0x000: + assert(graph_search); + *mode = RANGE; + *n_prefix = 1; + return DEFAULT_GRAPH_ORDER; + case 0x111: + *mode = SINGLE; + return graph_search ? DEFAULT_GRAPH_ORDER : DEFAULT_ORDER; + + PAT_CASE(0x001, RANGE, OPS, OSP, 1); + PAT_CASE(0x010, RANGE, POS, PSO, 1); + PAT_CASE(0x011, RANGE, OPS, POS, 2); + PAT_CASE(0x100, RANGE, SPO, SOP, 1); + PAT_CASE(0x101, RANGE, SOP, OSP, 2); + PAT_CASE(0x110, RANGE, SPO, PSO, 2); + } + + if (*mode == RANGE) { + if (sord_has_index(sord, &good[0], n_prefix, graph_search)) { + return good[0]; + } else if (sord_has_index(sord, &good[1], n_prefix, graph_search)) { + return good[1]; + } + } + + // Not so good orderings that require filtering, but can + // still be constrained to a range + switch (sig) { + PAT_CASE(0x011, FILTER_RANGE, OSP, PSO, 1); + PAT_CASE(0x101, FILTER_RANGE, SPO, OPS, 1); + // SPO is always present, so 0x110 is never reached here + default: + break; + } + + if (*mode == FILTER_RANGE) { + if (sord_has_index(sord, &good[0], n_prefix, graph_search)) { + return good[0]; + } else if (sord_has_index(sord, &good[1], n_prefix, graph_search)) { + return good[1]; + } + } + + if (graph_search) { + *mode = FILTER_RANGE; + *n_prefix = 1; + return DEFAULT_GRAPH_ORDER; + } else { + *mode = FILTER_ALL; + return DEFAULT_ORDER; + } +} + +SordModel* +sord_new(SordWorld* world, unsigned indices, bool graphs) +{ + SordModel* model = (SordModel*)malloc(sizeof(struct SordModelImpl)); + model->world = world; + model->n_quads = 0; + model->n_iters = 0; + + for (unsigned i = 0; i < (NUM_ORDERS / 2); ++i) { + const int* const ordering = orderings[i]; + const int* const g_ordering = orderings[i + (NUM_ORDERS / 2)]; + + if (indices & (1 << i)) { + model->indices[i] = + zix_btree_new(sord_quad_compare, (void*)ordering, NULL); + if (graphs) { + model->indices[i + (NUM_ORDERS / 2)] = + zix_btree_new(sord_quad_compare, (void*)g_ordering, NULL); + } else { + model->indices[i + (NUM_ORDERS / 2)] = NULL; + } + } else { + model->indices[i] = NULL; + model->indices[i + (NUM_ORDERS / 2)] = NULL; + } + } + + if (!model->indices[DEFAULT_ORDER]) { + model->indices[DEFAULT_ORDER] = + zix_btree_new(sord_quad_compare, (void*)orderings[DEFAULT_ORDER], NULL); + } + if (graphs && !model->indices[DEFAULT_GRAPH_ORDER]) { + model->indices[DEFAULT_GRAPH_ORDER] = zix_btree_new( + sord_quad_compare, (void*)orderings[DEFAULT_GRAPH_ORDER], NULL); + } + + return model; +} + +static void +sord_node_free_internal(SordWorld* world, SordNode* node) +{ + assert(node->refs == 0); + + // If you hit this, the world has probably been destroyed too early + assert(world); + + // Cache pointer to buffer to free after node removal and destruction + const uint8_t* const buf = node->node.buf; + + // Remove node from hash (which frees the node) + if (zix_hash_remove(world->nodes, node)) { + error(world, SERD_ERR_INTERNAL, "failed to remove node from hash\n"); + } + + // Free buffer + free((uint8_t*)buf); +} + +static void +sord_add_quad_ref(SordModel* model, const SordNode* node, SordQuadIndex i) +{ + if (node) { + assert(node->refs > 0); + ++((SordNode*)node)->refs; + if (node->node.type != SERD_LITERAL && i == SORD_OBJECT) { + ++((SordNode*)node)->meta.res.refs_as_obj; + } + } +} + +static void +sord_drop_quad_ref(SordModel* model, const SordNode* node, SordQuadIndex i) +{ + if (!node) { + return; + } + + assert(node->refs > 0); + if (node->node.type != SERD_LITERAL && i == SORD_OBJECT) { + assert(node->meta.res.refs_as_obj > 0); + --((SordNode*)node)->meta.res.refs_as_obj; + } + if (--((SordNode*)node)->refs == 0) { + sord_node_free_internal(sord_get_world(model), (SordNode*)node); + } +} + +void +sord_free(SordModel* model) +{ + if (!model) { + return; + } + + // Free nodes + SordQuad tup; + SordIter* i = sord_begin(model); + for (; !sord_iter_end(i); sord_iter_next(i)) { + sord_iter_get(i, tup); + for (int t = 0; t < TUP_LEN; ++t) { + sord_drop_quad_ref(model, tup[t], (SordQuadIndex)t); + } + } + sord_iter_free(i); + + // Free quads + ZixBTreeIter* t = zix_btree_begin(model->indices[DEFAULT_ORDER]); + for (; !zix_btree_iter_is_end(t); zix_btree_iter_increment(t)) { + free(zix_btree_get(t)); + } + zix_btree_iter_free(t); + + // Free indices + for (unsigned o = 0; o < NUM_ORDERS; ++o) { + if (model->indices[o]) { + zix_btree_free(model->indices[o]); + } + } + + free(model); +} + +SordWorld* +sord_get_world(SordModel* model) +{ + return model->world; +} + +size_t +sord_num_quads(const SordModel* model) +{ + return model->n_quads; +} + +size_t +sord_num_nodes(const SordWorld* world) +{ + return zix_hash_size(world->nodes); +} + +SordIter* +sord_begin(const SordModel* model) +{ + if (sord_num_quads(model) == 0) { + return NULL; + } else { + ZixBTreeIter* cur = zix_btree_begin(model->indices[DEFAULT_ORDER]); + SordQuad pat = {0, 0, 0, 0}; + return sord_iter_new(model, cur, pat, DEFAULT_ORDER, ALL, 0); + } +} + +SordIter* +sord_find(SordModel* model, const SordQuad pat) +{ + if (!pat[0] && !pat[1] && !pat[2] && !pat[3]) { + return sord_begin(model); + } + + SearchMode mode; + int n_prefix; + const SordOrder index_order = sord_best_index(model, pat, &mode, &n_prefix); + + SORD_FIND_LOG("Find " TUP_FMT " index=%s mode=%u n_prefix=%d\n", + TUP_FMT_ARGS(pat), + order_names[index_order], + mode, + n_prefix); + + if (pat[0] && pat[1] && pat[2] && pat[3]) { + mode = SINGLE; // No duplicate quads (Sord is a set) + } + + ZixBTree* const db = model->indices[index_order]; + ZixBTreeIter* cur = NULL; + + if (mode == FILTER_ALL) { + // No prefix shared with an index at all, linear search (worst case) + cur = zix_btree_begin(db); + } else if (mode == FILTER_RANGE) { + /* Some prefix, but filtering still required. Build a search pattern + with only the prefix to find the lower bound in log time. */ + SordQuad prefix_pat = {NULL, NULL, NULL, NULL}; + const int* const ordering = orderings[index_order]; + for (int i = 0; i < n_prefix; ++i) { + prefix_pat[ordering[i]] = pat[ordering[i]]; + } + zix_btree_lower_bound(db, prefix_pat, &cur); + } else { + // Ideal case, pattern matches an index with no filtering required + zix_btree_lower_bound(db, pat, &cur); + } + + if (zix_btree_iter_is_end(cur)) { + SORD_FIND_LOG("No match found\n"); + zix_btree_iter_free(cur); + return NULL; + } + const SordNode** const key = (const SordNode**)zix_btree_get(cur); + if (!key || ((mode == RANGE || mode == SINGLE) && + !sord_quad_match_inline(pat, key))) { + SORD_FIND_LOG("No match found\n"); + zix_btree_iter_free(cur); + return NULL; + } + + return sord_iter_new(model, cur, pat, index_order, mode, n_prefix); +} + +SordIter* +sord_search(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g) +{ + SordQuad pat = {s, p, o, g}; + return sord_find(model, pat); +} + +SordNode* +sord_get(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g) +{ + if ((bool)s + (bool)p + (bool)o != 2) { + return NULL; + } + + SordIter* i = sord_search(model, s, p, o, g); + SordNode* ret = NULL; + if (!s) { + ret = sord_node_copy(sord_iter_get_node(i, SORD_SUBJECT)); + } else if (!p) { + ret = sord_node_copy(sord_iter_get_node(i, SORD_PREDICATE)); + } else if (!o) { + ret = sord_node_copy(sord_iter_get_node(i, SORD_OBJECT)); + } + + sord_iter_free(i); + return ret; +} + +bool +sord_ask(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g) +{ + SordQuad pat = {s, p, o, g}; + return sord_contains(model, pat); +} + +uint64_t +sord_count(SordModel* model, + const SordNode* s, + const SordNode* p, + const SordNode* o, + const SordNode* g) +{ + SordIter* i = sord_search(model, s, p, o, g); + uint64_t n = 0; + for (; !sord_iter_end(i); sord_iter_next(i)) { + ++n; + } + sord_iter_free(i); + return n; +} + +bool +sord_contains(SordModel* model, const SordQuad pat) +{ + SordIter* iter = sord_find(model, pat); + bool ret = (iter != NULL); + sord_iter_free(iter); + return ret; +} + +static uint8_t* +sord_strndup(const uint8_t* str, size_t len) +{ + uint8_t* dup = (uint8_t*)malloc(len + 1); + memcpy(dup, str, len + 1); + return dup; +} + +SordNodeType +sord_node_get_type(const SordNode* node) +{ + switch (node->node.type) { + case SERD_URI: + return SORD_URI; + case SERD_BLANK: + return SORD_BLANK; + default: + return SORD_LITERAL; + } + SORD_UNREACHABLE(); +} + +const uint8_t* +sord_node_get_string(const SordNode* node) +{ + return node->node.buf; +} + +const uint8_t* +sord_node_get_string_counted(const SordNode* node, size_t* bytes) +{ + *bytes = node->node.n_bytes; + return node->node.buf; +} + +const uint8_t* +sord_node_get_string_measured(const SordNode* node, + size_t* bytes, + size_t* chars) +{ + *bytes = node->node.n_bytes; + *chars = node->node.n_chars; + return node->node.buf; +} + +const char* +sord_node_get_language(const SordNode* node) +{ + if (node->node.type != SERD_LITERAL || !node->meta.lit.lang[0]) { + return NULL; + } + return node->meta.lit.lang; +} + +SordNode* +sord_node_get_datatype(const SordNode* node) +{ + return (node->node.type == SERD_LITERAL) ? node->meta.lit.datatype : NULL; +} + +SerdNodeFlags +sord_node_get_flags(const SordNode* node) +{ + return node->node.flags; +} + +bool +sord_node_is_inline_object(const SordNode* node) +{ + return (node->node.type == SERD_BLANK) && (node->meta.res.refs_as_obj == 1); +} + +static SordNode* +sord_insert_node(SordWorld* world, const SordNode* key, bool copy) +{ + SordNode* node = NULL; + ZixStatus st = zix_hash_insert(world->nodes, key, (void**)&node); + switch (st) { + case ZIX_STATUS_EXISTS: + ++node->refs; + break; + case ZIX_STATUS_SUCCESS: + assert(node->refs == 1); + if (copy) { + node->node.buf = sord_strndup(node->node.buf, node->node.n_bytes); + } + if (node->node.type == SERD_LITERAL) { + node->meta.lit.datatype = sord_node_copy(node->meta.lit.datatype); + } + return node; + default: + error( + world, SERD_ERR_INTERNAL, "error inserting node `%s'\n", key->node.buf); + } + + if (!copy) { + // Free the buffer we would have copied if a new node was created + free((uint8_t*)key->node.buf); + } + + return node; +} + +static SordNode* +sord_new_uri_counted(SordWorld* world, + const uint8_t* str, + size_t n_bytes, + size_t n_chars, + bool copy) +{ + if (!serd_uri_string_has_scheme(str)) { + error(world, SERD_ERR_BAD_ARG, "attempt to map invalid URI `%s'\n", str); + return NULL; // Can't intern relative URIs + } + + const SordNode key = {{str, n_bytes, n_chars, 0, SERD_URI}, 1, {{0}}}; + + return sord_insert_node(world, &key, copy); +} + +SordNode* +sord_new_uri(SordWorld* world, const uint8_t* uri) +{ + const SerdNode node = serd_node_from_string(SERD_URI, uri); + return sord_new_uri_counted(world, uri, node.n_bytes, node.n_chars, true); +} + +SordNode* +sord_new_relative_uri(SordWorld* world, + const uint8_t* uri, + const uint8_t* base_uri) +{ + if (serd_uri_string_has_scheme(uri)) { + return sord_new_uri(world, uri); + } + SerdURI buri = SERD_URI_NULL; + SerdNode base = serd_node_new_uri_from_string(base_uri, NULL, &buri); + SerdNode node = serd_node_new_uri_from_string(uri, &buri, NULL); + + SordNode* ret = + sord_new_uri_counted(world, node.buf, node.n_bytes, node.n_chars, false); + + serd_node_free(&base); + return ret; +} + +static SordNode* +sord_new_blank_counted(SordWorld* world, + const uint8_t* str, + size_t n_bytes, + size_t n_chars) +{ + const SordNode key = {{str, n_bytes, n_chars, 0, SERD_BLANK}, 1, {{0}}}; + + return sord_insert_node(world, &key, true); +} + +SordNode* +sord_new_blank(SordWorld* world, const uint8_t* str) +{ + const SerdNode node = serd_node_from_string(SERD_URI, str); + return sord_new_blank_counted(world, str, node.n_bytes, node.n_chars); +} + +static SordNode* +sord_new_literal_counted(SordWorld* world, + SordNode* datatype, + const uint8_t* str, + size_t n_bytes, + size_t n_chars, + SerdNodeFlags flags, + const char* lang) +{ + SordNode key = {{str, n_bytes, n_chars, flags, SERD_LITERAL}, 1, {{0}}}; + key.meta.lit.datatype = sord_node_copy(datatype); + memset(key.meta.lit.lang, 0, sizeof(key.meta.lit.lang)); + if (lang) { + strncpy(key.meta.lit.lang, lang, sizeof(key.meta.lit.lang) - 1); + } + + return sord_insert_node(world, &key, true); +} + +SordNode* +sord_new_literal(SordWorld* world, + SordNode* datatype, + const uint8_t* str, + const char* lang) +{ + SerdNodeFlags flags = 0; + size_t n_bytes = 0; + size_t n_chars = serd_strlen(str, &n_bytes, &flags); + return sord_new_literal_counted( + world, datatype, str, n_bytes, n_chars, flags, lang); +} + +SordNode* +sord_node_from_serd_node(SordWorld* world, + SerdEnv* env, + const SerdNode* node, + const SerdNode* datatype, + const SerdNode* lang) +{ + if (!node) { + return NULL; + } + + SordNode* datatype_node = NULL; + SordNode* ret = NULL; + switch (node->type) { + case SERD_NOTHING: + return NULL; + case SERD_LITERAL: + datatype_node = sord_node_from_serd_node(world, env, datatype, NULL, NULL); + ret = sord_new_literal_counted(world, + datatype_node, + node->buf, + node->n_bytes, + node->n_chars, + node->flags, + lang ? (const char*)lang->buf : NULL); + sord_node_free(world, datatype_node); + return ret; + case SERD_URI: + if (serd_uri_string_has_scheme(node->buf)) { + return sord_new_uri_counted( + world, node->buf, node->n_bytes, node->n_chars, true); + } else { + SerdURI base_uri; + serd_env_get_base_uri(env, &base_uri); + SerdURI abs_uri; + SerdNode abs_uri_node = + serd_node_new_uri_from_node(node, &base_uri, &abs_uri); + ret = sord_new_uri_counted(world, + abs_uri_node.buf, + abs_uri_node.n_bytes, + abs_uri_node.n_chars, + true); + serd_node_free(&abs_uri_node); + return ret; + } + case SERD_CURIE: { + SerdChunk uri_prefix; + SerdChunk uri_suffix; + if (serd_env_expand(env, node, &uri_prefix, &uri_suffix)) { + error( + world, SERD_ERR_BAD_CURIE, "failed to expand CURIE `%s'\n", node->buf); + return NULL; + } + const size_t uri_len = uri_prefix.len + uri_suffix.len; + uint8_t* buf = (uint8_t*)malloc(uri_len + 1); + memcpy(buf, uri_prefix.buf, uri_prefix.len); + memcpy(buf + uri_prefix.len, uri_suffix.buf, uri_suffix.len); + buf[uri_len] = '\0'; + ret = sord_new_uri_counted( + world, buf, uri_len, serd_strlen(buf, NULL, NULL), false); + return ret; + } + case SERD_BLANK: + return sord_new_blank_counted( + world, node->buf, node->n_bytes, node->n_chars); + } + return NULL; +} + +const SerdNode* +sord_node_to_serd_node(const SordNode* node) +{ + return node ? &node->node : &SERD_NODE_NULL; +} + +void +sord_node_free(SordWorld* world, SordNode* node) +{ + if (!node) { + return; + } else if (node->refs == 0) { + error(world, SERD_ERR_BAD_ARG, "attempt to free garbage node\n"); + } else if (--node->refs == 0) { + sord_node_free_internal(world, node); + } +} + +SordNode* +sord_node_copy(const SordNode* node) +{ + SordNode* copy = (SordNode*)node; + if (copy) { + ++copy->refs; + } + return copy; +} + +static inline bool +sord_add_to_index(SordModel* model, const SordNode** tup, SordOrder order) +{ + return !zix_btree_insert(model->indices[order], tup); +} + +bool +sord_add(SordModel* model, const SordQuad tup) +{ + SORD_WRITE_LOG("Add " TUP_FMT "\n", TUP_FMT_ARGS(tup)); + if (!tup[0] || !tup[1] || !tup[2]) { + error( + model->world, SERD_ERR_BAD_ARG, "attempt to add quad with NULL field\n"); + return false; + } else if (model->n_iters > 0) { + error(model->world, SERD_ERR_BAD_ARG, "added tuple during iteration\n"); + } + + const SordNode** quad = (const SordNode**)malloc(sizeof(SordQuad)); + memcpy(quad, tup, sizeof(SordQuad)); + + for (unsigned i = 0; i < NUM_ORDERS; ++i) { + if (model->indices[i] && (i < GSPO || tup[3])) { + if (!sord_add_to_index(model, quad, (SordOrder)i)) { + assert(i == 0); // Assuming index coherency + free(quad); + return false; // Quad already stored, do nothing + } + } + } + + for (int i = 0; i < TUP_LEN; ++i) { + sord_add_quad_ref(model, tup[i], (SordQuadIndex)i); + } + + ++model->n_quads; + return true; +} + +void +sord_remove(SordModel* model, const SordQuad tup) +{ + SORD_WRITE_LOG("Remove " TUP_FMT "\n", TUP_FMT_ARGS(tup)); + if (model->n_iters > 0) { + error(model->world, SERD_ERR_BAD_ARG, "remove with iterator\n"); + } + + SordNode* quad = NULL; + for (unsigned i = 0; i < NUM_ORDERS; ++i) { + if (model->indices[i] && (i < GSPO || tup[3])) { + if (zix_btree_remove(model->indices[i], tup, (void**)&quad, NULL)) { + assert(i == 0); // Assuming index coherency + return; // Quad not found, do nothing + } + } + } + + free(quad); + + for (int i = 0; i < TUP_LEN; ++i) { + sord_drop_quad_ref(model, tup[i], (SordQuadIndex)i); + } + + --model->n_quads; +} + +SerdStatus +sord_erase(SordModel* model, SordIter* iter) +{ + if (model->n_iters > 1) { + error(model->world, SERD_ERR_BAD_ARG, "erased with many iterators\n"); + return SERD_ERR_BAD_ARG; + } + + SordQuad tup; + sord_iter_get(iter, tup); + + SORD_WRITE_LOG("Remove " TUP_FMT "\n", TUP_FMT_ARGS(tup)); + + SordNode* quad = NULL; + for (unsigned i = 0; i < NUM_ORDERS; ++i) { + if (model->indices[i] && (i < GSPO || tup[3])) { + if (zix_btree_remove(model->indices[i], + tup, + (void**)&quad, + i == iter->order ? &iter->cur : NULL)) { + return (i == 0) ? SERD_ERR_NOT_FOUND : SERD_ERR_INTERNAL; + } + } + } + iter->end = zix_btree_iter_is_end(iter->cur); + sord_iter_scan_next(iter); + + free(quad); + + for (int i = 0; i < TUP_LEN; ++i) { + sord_drop_quad_ref(model, tup[i], (SordQuadIndex)i); + } + + --model->n_quads; + return SERD_SUCCESS; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h new file mode 100644 index 00000000..801f9681 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_config.h @@ -0,0 +1,61 @@ +/* + Copyright 2021 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/* + Configuration header that defines reasonable defaults at compile time. + + This allows compile-time configuration from the command line (typically via + the build system) while still allowing the source to be built without any + configuration. The build system can define SORD_NO_DEFAULT_CONFIG to disable + defaults, in which case it must define things like HAVE_FEATURE to enable + features. The design here ensures that compiler warnings or + include-what-you-use will catch any mistakes. +*/ + +#ifndef SORD_CONFIG_H +#define SORD_CONFIG_H + +// Define version unconditionally so a warning will catch a mismatch +#define SORD_VERSION "0.16.9" + +#if !defined(SORD_NO_DEFAULT_CONFIG) + +// The validator uses PCRE for literal pattern matching +# ifndef HAVE_PCRE +# ifdef __has_include +# if __has_include() +# define HAVE_PCRE 1 +# endif +# endif +# endif + +#endif // !defined(SORD_NO_DEFAULT_CONFIG) + +/* + Make corresponding USE_FEATURE defines based on the HAVE_FEATURE defines from + above or the command line. The code checks for these using #if (not #ifdef), + so there will be an undefined warning if it checks for an unknown feature, + and this header is always required by any code that checks for features, even + if the build system defines them all. +*/ + +#ifdef HAVE_PCRE +# define USE_PCRE 1 +#else +# define USE_PCRE 1 +#endif + +#endif // SORD_CONFIG_H diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h new file mode 100644 index 00000000..4aef8461 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_internal.h @@ -0,0 +1,53 @@ +/* + Copyright 2011-2015 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef SORD_SORD_INTERNAL_H +#define SORD_SORD_INTERNAL_H + +#include "serd/serd.h" +#include "sord/sord.h" + +#include + +#if defined(__clang__) || (defined(__GNUC__) && __GNUC__ > 4) +# define SORD_UNREACHABLE() __builtin_unreachable() +#else +# include +# define SORD_UNREACHABLE() assert(0) +#endif + +/** Resource node metadata */ +typedef struct { + size_t refs_as_obj; ///< References as a quad object +} SordResourceMetadata; + +/** Literal node metadata */ +typedef struct { + SordNode* datatype; ///< Optional literal data type URI + char lang[16]; ///< Optional language tag +} SordLiteralMetadata; + +/** Node */ +struct SordNodeImpl { + SerdNode node; ///< Serd node + size_t refs; ///< Reference count (# of containing quads) + union { + SordResourceMetadata res; + SordLiteralMetadata lit; + } meta; +}; + +#endif /* SORD_SORD_INTERNAL_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c new file mode 100644 index 00000000..7e7a6c89 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_test.c @@ -0,0 +1,767 @@ +/* + Copyright 2011-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "serd/serd.h" +#include "sord/sord.h" + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +# define SORD_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define SORD_LOG_FUNC(fmt, arg1) +#endif + +static const int DIGITS = 3; +static const unsigned n_objects_per = 2; + +static int n_expected_errors = 0; + +typedef struct { + SordQuad query; + int expected_num_results; +} QueryTest; + +#define USTR(s) ((const uint8_t*)(s)) + +static SordNode* +uri(SordWorld* world, int num) +{ + if (num == 0) { + return 0; + } + + char str[] = "eg:000"; + char* uri_num = str + 3; // First `0' + snprintf(uri_num, DIGITS + 1, "%0*d", DIGITS, num); + return sord_new_uri(world, (const uint8_t*)str); +} + +SORD_LOG_FUNC(1, 2) +static int +test_fail(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, args); + va_end(args); + return 1; +} + +static int +generate(SordWorld* world, SordModel* sord, size_t n_quads, SordNode* graph) +{ + fprintf(stderr, + "Generating %zu (S P *) quads with %u objects each\n", + n_quads, + n_objects_per); + + for (size_t i = 0; i < n_quads; ++i) { + int num = (i * n_objects_per) + 1; + + SordNode* ids[2 + n_objects_per]; + for (unsigned j = 0; j < 2 + n_objects_per; ++j) { + ids[j] = uri(world, num++); + } + + for (unsigned j = 0; j < n_objects_per; ++j) { + SordQuad tup = {ids[0], ids[1], ids[2 + j], graph}; + if (!sord_add(sord, tup)) { + return test_fail("Fail: Failed to add quad\n"); + } + } + + for (unsigned j = 0; j < 2 + n_objects_per; ++j) { + sord_node_free(world, ids[j]); + } + } + + // Add some literals + + // (98 4 "hello") and (98 4 "hello"^^<5>) + SordQuad tup = {0, 0, 0, 0}; + tup[0] = uri(world, 98); + tup[1] = uri(world, 4); + tup[2] = sord_new_literal(world, 0, USTR("hello"), NULL); + tup[3] = graph; + sord_add(sord, tup); + sord_node_free(world, (SordNode*)tup[2]); + tup[2] = sord_new_literal(world, uri(world, 5), USTR("hello"), NULL); + if (!sord_add(sord, tup)) { + return test_fail("Failed to add typed literal\n"); + } + + // (96 4 "hello"^^<4>) and (96 4 "hello"^^<5>) + tup[0] = uri(world, 96); + tup[1] = uri(world, 4); + tup[2] = sord_new_literal(world, uri(world, 4), USTR("hello"), NULL); + tup[3] = graph; + sord_add(sord, tup); + sord_node_free(world, (SordNode*)tup[2]); + tup[2] = sord_new_literal(world, uri(world, 5), USTR("hello"), NULL); + if (!sord_add(sord, tup)) { + return test_fail("Failed to add typed literal\n"); + } + + // (94 5 "hello") and (94 5 "hello"@en-gb) + tup[0] = uri(world, 94); + tup[1] = uri(world, 5); + tup[2] = sord_new_literal(world, 0, USTR("hello"), NULL); + tup[3] = graph; + sord_add(sord, tup); + sord_node_free(world, (SordNode*)tup[2]); + tup[2] = sord_new_literal(world, NULL, USTR("hello"), "en-gb"); + if (!sord_add(sord, tup)) { + return test_fail("Failed to add literal with language\n"); + } + + // (92 6 "hello"@en-us) and (92 5 "hello"@en-gb) + tup[0] = uri(world, 92); + tup[1] = uri(world, 6); + tup[2] = sord_new_literal(world, 0, USTR("hello"), "en-us"); + tup[3] = graph; + sord_add(sord, tup); + sord_node_free(world, (SordNode*)tup[2]); + tup[2] = sord_new_literal(world, NULL, USTR("hello"), "en-gb"); + if (!sord_add(sord, tup)) { + return test_fail("Failed to add literal with language\n"); + } + + sord_node_free(world, (SordNode*)tup[0]); + sord_node_free(world, (SordNode*)tup[2]); + tup[0] = uri(world, 14); + tup[2] = sord_new_literal(world, 0, USTR("bonjour"), "fr"); + sord_add(sord, tup); + sord_node_free(world, (SordNode*)tup[2]); + tup[2] = sord_new_literal(world, 0, USTR("salut"), "fr"); + sord_add(sord, tup); + + // Attempt to add some duplicates + if (sord_add(sord, tup)) { + return test_fail("Fail: Successfully added duplicate quad\n"); + } + if (sord_add(sord, tup)) { + return test_fail("Fail: Successfully added duplicate quad\n"); + } + + // Add a blank node subject + sord_node_free(world, (SordNode*)tup[0]); + tup[0] = sord_new_blank(world, USTR("ablank")); + sord_add(sord, tup); + + sord_node_free(world, (SordNode*)tup[1]); + sord_node_free(world, (SordNode*)tup[2]); + tup[1] = uri(world, 6); + tup[2] = uri(world, 7); + sord_add(sord, tup); + sord_node_free(world, (SordNode*)tup[0]); + sord_node_free(world, (SordNode*)tup[1]); + sord_node_free(world, (SordNode*)tup[2]); + + return EXIT_SUCCESS; +} + +#define TUP_FMT "(%6s %6s %6s)" +#define TUP_FMT_ARGS(t) \ + ((t)[0] ? sord_node_get_string((t)[0]) : USTR("*")), \ + ((t)[1] ? sord_node_get_string((t)[1]) : USTR("*")), \ + ((t)[2] ? sord_node_get_string((t)[2]) : USTR("*")) + +static int +test_read(SordWorld* world, SordModel* sord, SordNode* g, const size_t n_quads) +{ + int ret = EXIT_SUCCESS; + + SordQuad id; + + SordIter* iter = sord_begin(sord); + if (sord_iter_get_model(iter) != sord) { + return test_fail("Fail: Iterator has incorrect sord pointer\n"); + } + + for (; !sord_iter_end(iter); sord_iter_next(iter)) { + sord_iter_get(iter, id); + } + + // Attempt to increment past end + if (!sord_iter_next(iter)) { + return test_fail("Fail: Successfully incremented past end\n"); + } + + sord_iter_free(iter); + + const uint8_t* s = USTR("hello"); + SordNode* plain_hello = sord_new_literal(world, 0, s, NULL); + SordNode* type4_hello = sord_new_literal(world, uri(world, 4), s, NULL); + SordNode* type5_hello = sord_new_literal(world, uri(world, 5), s, NULL); + SordNode* gb_hello = sord_new_literal(world, NULL, s, "en-gb"); + SordNode* us_hello = sord_new_literal(world, NULL, s, "en-us"); + +#define NUM_PATTERNS 18 + + QueryTest patterns[NUM_PATTERNS] = { + {{0, 0, 0}, (int)(n_quads * n_objects_per) + 12}, + {{uri(world, 1), 0, 0}, 2}, + {{uri(world, 9), uri(world, 9), uri(world, 9)}, 0}, + {{uri(world, 1), uri(world, 2), uri(world, 4)}, 1}, + {{uri(world, 3), uri(world, 4), uri(world, 0)}, 2}, + {{uri(world, 0), uri(world, 2), uri(world, 4)}, 1}, + {{uri(world, 0), uri(world, 0), uri(world, 4)}, 1}, + {{uri(world, 1), uri(world, 0), uri(world, 0)}, 2}, + {{uri(world, 1), uri(world, 0), uri(world, 4)}, 1}, + {{uri(world, 0), uri(world, 2), uri(world, 0)}, 2}, + {{uri(world, 98), uri(world, 4), plain_hello}, 1}, + {{uri(world, 98), uri(world, 4), type5_hello}, 1}, + {{uri(world, 96), uri(world, 4), type4_hello}, 1}, + {{uri(world, 96), uri(world, 4), type5_hello}, 1}, + {{uri(world, 94), uri(world, 5), plain_hello}, 1}, + {{uri(world, 94), uri(world, 5), gb_hello}, 1}, + {{uri(world, 92), uri(world, 6), gb_hello}, 1}, + {{uri(world, 92), uri(world, 6), us_hello}, 1}}; + + SordQuad match = {uri(world, 1), uri(world, 2), uri(world, 4), g}; + if (!sord_contains(sord, match)) { + return test_fail("Fail: No match for " TUP_FMT "\n", TUP_FMT_ARGS(match)); + } + + SordQuad nomatch = {uri(world, 1), uri(world, 2), uri(world, 9), g}; + if (sord_contains(sord, nomatch)) { + return test_fail("Fail: False match for " TUP_FMT "\n", + TUP_FMT_ARGS(nomatch)); + } + + if (sord_get(sord, NULL, NULL, uri(world, 3), g)) { + return test_fail("Fail: Get *,*,3 succeeded\n"); + } else if (!sord_node_equals( + sord_get(sord, uri(world, 1), uri(world, 2), NULL, g), + uri(world, 3))) { + return test_fail("Fail: Get 1,2,* != 3\n"); + } else if (!sord_node_equals( + sord_get(sord, uri(world, 1), NULL, uri(world, 3), g), + uri(world, 2))) { + return test_fail("Fail: Get 1,*,3 != 2\n"); + } else if (!sord_node_equals( + sord_get(sord, NULL, uri(world, 2), uri(world, 3), g), + uri(world, 1))) { + return test_fail("Fail: Get *,2,3 != 1\n"); + } + + for (unsigned i = 0; i < NUM_PATTERNS; ++i) { + QueryTest test = patterns[i]; + SordQuad pat = {test.query[0], test.query[1], test.query[2], g}; + fprintf(stderr, "Query " TUP_FMT "... ", TUP_FMT_ARGS(pat)); + + iter = sord_find(sord, pat); + int num_results = 0; + for (; !sord_iter_end(iter); sord_iter_next(iter)) { + sord_iter_get(iter, id); + ++num_results; + if (!sord_quad_match(pat, id)) { + sord_iter_free(iter); + return test_fail("Fail: Query result " TUP_FMT + " does not match pattern\n", + TUP_FMT_ARGS(id)); + } + } + sord_iter_free(iter); + if (num_results != test.expected_num_results) { + return test_fail("Fail: Expected %d results, got %d\n", + test.expected_num_results, + num_results); + } + fprintf(stderr, "OK (%i matches)\n", test.expected_num_results); + } + + // Query blank node subject + SordQuad pat = {sord_new_blank(world, USTR("ablank")), 0, 0}; + if (!pat[0]) { + return test_fail("Blank node subject lost\n"); + } + fprintf(stderr, "Query " TUP_FMT "... ", TUP_FMT_ARGS(pat)); + iter = sord_find(sord, pat); + int num_results = 0; + for (; !sord_iter_end(iter); sord_iter_next(iter)) { + sord_iter_get(iter, id); + ++num_results; + if (!sord_quad_match(pat, id)) { + sord_iter_free(iter); + return test_fail("Fail: Query result " TUP_FMT + " does not match pattern\n", + TUP_FMT_ARGS(id)); + } + } + fprintf(stderr, "OK\n"); + sord_node_free(world, (SordNode*)pat[0]); + sord_iter_free(iter); + if (num_results != 2) { + return test_fail("Blank node subject query failed\n"); + } + + // Test nested queries + fprintf(stderr, "Nested Queries... "); + const SordNode* last_subject = 0; + iter = sord_search(sord, NULL, NULL, NULL, NULL); + for (; !sord_iter_end(iter); sord_iter_next(iter)) { + sord_iter_get(iter, id); + if (id[0] == last_subject) { + continue; + } + + SordQuad subpat = {id[0], 0, 0}; + SordIter* subiter = sord_find(sord, subpat); + unsigned num_sub_results = 0; + if (sord_iter_get_node(subiter, SORD_SUBJECT) != id[0]) { + return test_fail("Fail: Incorrect initial submatch\n"); + } + for (; !sord_iter_end(subiter); sord_iter_next(subiter)) { + SordQuad subid; + sord_iter_get(subiter, subid); + if (!sord_quad_match(subpat, subid)) { + sord_iter_free(iter); + sord_iter_free(subiter); + return test_fail("Fail: Nested query result does not match pattern\n"); + } + ++num_sub_results; + } + sord_iter_free(subiter); + if (num_sub_results != n_objects_per) { + return test_fail("Fail: Nested query " TUP_FMT " failed" + " (%u results, expected %u)\n", + TUP_FMT_ARGS(subpat), + num_sub_results, + n_objects_per); + } + + uint64_t count = sord_count(sord, id[0], 0, 0, 0); + if (count != num_sub_results) { + return test_fail("Fail: Query " TUP_FMT " sord_count() %" PRIu64 + "does not match result count %u\n", + TUP_FMT_ARGS(subpat), + count, + num_sub_results); + } + + last_subject = id[0]; + } + fprintf(stderr, "OK\n\n"); + sord_iter_free(iter); + + return ret; +} + +static SerdStatus +unexpected_error(void* handle, const SerdError* error) +{ + fprintf(stderr, "unexpected error: "); + vfprintf(stderr, error->fmt, *error->args); + return SERD_SUCCESS; +} + +static SerdStatus +expected_error(void* handle, const SerdError* error) +{ + fprintf(stderr, "expected error: "); + vfprintf(stderr, error->fmt, *error->args); + ++n_expected_errors; + return SERD_SUCCESS; +} + +static int +finished(SordWorld* world, SordModel* sord, int status) +{ + sord_free(sord); + sord_world_free(world); + return status; +} + +int +main(int argc, char** argv) +{ + static const size_t n_quads = 300; + + sord_free(NULL); // Shouldn't crash + + SordWorld* world = sord_world_new(); + + // Attempt to create invalid URI + fprintf(stderr, "expected "); + SordNode* bad_uri = sord_new_uri(world, USTR("noscheme")); + if (bad_uri) { + return test_fail("Successfully created invalid URI \"noscheme\"\n"); + } + sord_node_free(world, bad_uri); + + sord_world_set_error_sink(world, expected_error, NULL); + + // Attempt to create invalid CURIE + SerdNode base = serd_node_from_string(SERD_URI, USTR("http://example.org/")); + SerdEnv* env = serd_env_new(&base); + SerdNode sbad = serd_node_from_string(SERD_CURIE, USTR("bad:")); + SordNode* bad = sord_node_from_serd_node(world, env, &sbad, NULL, NULL); + if (bad) { + return test_fail("Successfully created CURIE with bad namespace\n"); + } + sord_node_free(world, bad); + serd_env_free(env); + + // Attempt to create node from garbage + SerdNode junk = SERD_NODE_NULL; + junk.type = (SerdType)1234; + if (sord_node_from_serd_node(world, env, &junk, NULL, NULL)) { + return test_fail("Successfully created node from garbage serd node\n"); + } + + // Attempt to create NULL node + SordNode* nil_node = + sord_node_from_serd_node(world, NULL, &SERD_NODE_NULL, NULL, NULL); + if (nil_node) { + return test_fail("Successfully created NULL node\n"); + } + sord_node_free(world, nil_node); + + // Check node flags are set properly + SordNode* with_newline = sord_new_literal(world, NULL, USTR("a\nb"), NULL); + if (!(sord_node_get_flags(with_newline) & SERD_HAS_NEWLINE)) { + return test_fail("Newline flag not set\n"); + } + SordNode* with_quote = sord_new_literal(world, NULL, USTR("a\"b"), NULL); + if (!(sord_node_get_flags(with_quote) & SERD_HAS_QUOTE)) { + return test_fail("Quote flag not set\n"); + } + + // Create with minimal indexing + SordModel* sord = sord_new(world, SORD_SPO, false); + generate(world, sord, n_quads, NULL); + + if (test_read(world, sord, NULL, n_quads)) { + sord_free(sord); + sord_world_free(world); + return EXIT_FAILURE; + } + + // Check adding tuples with NULL fields fails + sord_world_set_error_sink(world, expected_error, NULL); + const size_t initial_num_quads = sord_num_quads(sord); + SordQuad tup = {0, 0, 0, 0}; + if (sord_add(sord, tup)) { + return test_fail("Added NULL tuple\n"); + } + tup[0] = uri(world, 1); + if (sord_add(sord, tup)) { + return test_fail("Added tuple with NULL P and O\n"); + } + tup[1] = uri(world, 2); + if (sord_add(sord, tup)) { + return test_fail("Added tuple with NULL O\n"); + } + + if (sord_num_quads(sord) != initial_num_quads) { + return test_fail( + "Num quads %zu != %zu\n", sord_num_quads(sord), initial_num_quads); + } + + // Check adding tuples with an active iterator fails + SordIter* iter = sord_begin(sord); + tup[2] = uri(world, 3); + if (sord_add(sord, tup)) { + return test_fail("Added tuple with active iterator\n"); + } + + // Check removing tuples with several active iterator fails + SordIter* iter2 = sord_begin(sord); + if (!sord_erase(sord, iter)) { + return test_fail("Erased tuple with several active iterators\n"); + } + n_expected_errors = 0; + sord_remove(sord, tup); + if (n_expected_errors != 1) { + return test_fail("Removed tuple with several active iterators\n"); + } + sord_iter_free(iter); + sord_iter_free(iter2); + + sord_world_set_error_sink(world, unexpected_error, NULL); + + // Check interning merges equivalent values + SordNode* uri_id = sord_new_uri(world, USTR("http://example.org")); + SordNode* blank_id = sord_new_blank(world, USTR("testblank")); + SordNode* lit_id = sord_new_literal(world, uri_id, USTR("hello"), NULL); + if (sord_node_get_type(uri_id) != SORD_URI) { + return test_fail("URI node has incorrect type\n"); + } else if (sord_node_get_type(blank_id) != SORD_BLANK) { + return test_fail("Blank node has incorrect type\n"); + } else if (sord_node_get_type(lit_id) != SORD_LITERAL) { + return test_fail("Literal node has incorrect type\n"); + } + + const size_t initial_num_nodes = sord_num_nodes(world); + + SordNode* uri_id2 = sord_new_uri(world, USTR("http://example.org")); + SordNode* blank_id2 = sord_new_blank(world, USTR("testblank")); + SordNode* lit_id2 = sord_new_literal(world, uri_id, USTR("hello"), NULL); + if (uri_id2 != uri_id || !sord_node_equals(uri_id2, uri_id)) { + fprintf(stderr, "Fail: URI interning failed (duplicates)\n"); + return finished(world, sord, EXIT_FAILURE); + } else if (blank_id2 != blank_id || !sord_node_equals(blank_id2, blank_id)) { + fprintf(stderr, "Fail: Blank node interning failed (duplicates)\n"); + return finished(world, sord, EXIT_FAILURE); + } else if (lit_id2 != lit_id || !sord_node_equals(lit_id2, lit_id)) { + fprintf(stderr, "Fail: Literal interning failed (duplicates)\n"); + return finished(world, sord, EXIT_FAILURE); + } + + if (sord_num_nodes(world) != initial_num_nodes) { + return test_fail( + "Num nodes %zu != %zu\n", sord_num_nodes(world), initial_num_nodes); + } + + const uint8_t ni_hao[] = {0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD, 0}; + SordNode* chello = sord_new_literal(world, NULL, ni_hao, "cmn"); + + // Test literal length + size_t n_bytes; + size_t n_chars; + const uint8_t* str = sord_node_get_string_counted(lit_id2, &n_bytes); + if (strcmp((const char*)str, "hello")) { + return test_fail("Literal node corrupt\n"); + } else if (n_bytes != strlen("hello")) { + return test_fail("ASCII literal byte count incorrect\n"); + } + + str = sord_node_get_string_measured(lit_id2, &n_bytes, &n_chars); + if (n_bytes != strlen("hello") || n_chars != strlen("hello")) { + return test_fail("ASCII literal measured length incorrect\n"); + } else if (strcmp((const char*)str, "hello")) { + return test_fail("ASCII literal string incorrect\n"); + } + + str = sord_node_get_string_measured(chello, &n_bytes, &n_chars); + if (n_bytes != 6) { + return test_fail("Multi-byte literal byte count incorrect\n"); + } else if (n_chars != 2) { + return test_fail("Multi-byte literal character count incorrect\n"); + } else if (strcmp((const char*)str, (const char*)ni_hao)) { + return test_fail("Multi-byte literal string incorrect\n"); + } + + // Check interning doesn't clash non-equivalent values + SordNode* uri_id3 = sord_new_uri(world, USTR("http://example.orgX")); + SordNode* blank_id3 = sord_new_blank(world, USTR("testblankX")); + SordNode* lit_id3 = sord_new_literal(world, uri_id, USTR("helloX"), NULL); + if (uri_id3 == uri_id || sord_node_equals(uri_id3, uri_id)) { + fprintf(stderr, "Fail: URI interning failed (clash)\n"); + return finished(world, sord, EXIT_FAILURE); + } else if (blank_id3 == blank_id || sord_node_equals(blank_id3, blank_id)) { + fprintf(stderr, "Fail: Blank node interning failed (clash)\n"); + return finished(world, sord, EXIT_FAILURE); + } else if (lit_id3 == lit_id || sord_node_equals(lit_id3, lit_id)) { + fprintf(stderr, "Fail: Literal interning failed (clash)\n"); + return finished(world, sord, EXIT_FAILURE); + } + + // Check literal interning + SordNode* lit4 = sord_new_literal(world, NULL, USTR("hello"), NULL); + SordNode* lit5 = sord_new_literal(world, uri_id2, USTR("hello"), NULL); + SordNode* lit6 = sord_new_literal(world, NULL, USTR("hello"), "en-ca"); + if (lit4 == lit5 || sord_node_equals(lit4, lit5) || lit4 == lit6 || + sord_node_equals(lit4, lit6) || lit5 == lit6 || + sord_node_equals(lit5, lit6)) { + fprintf(stderr, "Fail: Literal interning failed (type/lang clash)\n"); + return finished(world, sord, EXIT_FAILURE); + } + + // Check relative URI construction + SordNode* reluri = + sord_new_relative_uri(world, USTR("a/b"), USTR("http://example.org/")); + if (strcmp((const char*)sord_node_get_string(reluri), + "http://example.org/a/b")) { + fprintf(stderr, + "Fail: Bad relative URI constructed: <%s>\n", + sord_node_get_string(reluri)); + return finished(world, sord, EXIT_FAILURE); + } + SordNode* reluri2 = sord_new_relative_uri( + world, USTR("http://drobilla.net/"), USTR("http://example.org/")); + if (strcmp((const char*)sord_node_get_string(reluri2), + "http://drobilla.net/")) { + fprintf(stderr, + "Fail: Bad relative URI constructed: <%s>\n", + sord_node_get_string(reluri)); + return finished(world, sord, EXIT_FAILURE); + } + + // Check comparison with NULL + sord_node_free(world, uri_id); + sord_node_free(world, blank_id); + sord_node_free(world, lit_id); + sord_node_free(world, uri_id2); + sord_node_free(world, blank_id2); + sord_node_free(world, lit_id2); + sord_node_free(world, uri_id3); + sord_node_free(world, blank_id3); + sord_node_free(world, lit_id3); + sord_free(sord); + + static const char* const index_names[6] = { + "spo", "sop", "ops", "osp", "pso", "pos"}; + + for (int i = 0; i < 6; ++i) { + sord = sord_new(world, (1 << i), false); + printf("Testing Index `%s'\n", index_names[i]); + generate(world, sord, n_quads, 0); + if (test_read(world, sord, 0, n_quads)) { + return finished(world, sord, EXIT_FAILURE); + } + sord_free(sord); + } + + static const char* const graph_index_names[6] = { + "gspo", "gsop", "gops", "gosp", "gpso", "gpos"}; + + for (int i = 0; i < 6; ++i) { + sord = sord_new(world, (1 << i), true); + printf("Testing Index `%s'\n", graph_index_names[i]); + SordNode* graph = uri(world, 42); + generate(world, sord, n_quads, graph); + if (test_read(world, sord, graph, n_quads)) { + return finished(world, sord, EXIT_FAILURE); + } + sord_free(sord); + } + + // Test removing + sord = sord_new(world, SORD_SPO, true); + tup[0] = uri(world, 1); + tup[1] = uri(world, 2); + tup[2] = sord_new_literal(world, 0, USTR("hello"), NULL); + tup[3] = 0; + sord_add(sord, tup); + if (!sord_ask(sord, tup[0], tup[1], tup[2], tup[3])) { + fprintf(stderr, "Failed to add tuple\n"); + return finished(world, sord, EXIT_FAILURE); + } + sord_node_free(world, (SordNode*)tup[2]); + tup[2] = sord_new_literal(world, 0, USTR("hi"), NULL); + sord_add(sord, tup); + sord_remove(sord, tup); + if (sord_num_quads(sord) != 1) { + fprintf( + stderr, "Remove failed (%zu quads, expected 1)\n", sord_num_quads(sord)); + return finished(world, sord, EXIT_FAILURE); + } + + iter = sord_find(sord, tup); + if (!sord_iter_end(iter)) { + fprintf(stderr, "Found removed tuple\n"); + return finished(world, sord, EXIT_FAILURE); + } + sord_iter_free(iter); + + // Test double remove (silent success) + sord_remove(sord, tup); + + // Load a couple graphs + SordNode* graph42 = uri(world, 42); + SordNode* graph43 = uri(world, 43); + generate(world, sord, 1, graph42); + generate(world, sord, 1, graph43); + + // Remove one graph via iterator + SerdStatus st; + iter = sord_search(sord, NULL, NULL, NULL, graph43); + while (!sord_iter_end(iter)) { + if ((st = sord_erase(sord, iter))) { + fprintf(stderr, "Remove by iterator failed (%s)\n", serd_strerror(st)); + return finished(world, sord, EXIT_FAILURE); + } + } + sord_iter_free(iter); + + // Erase the first tuple (an element in the default graph) + iter = sord_begin(sord); + if (sord_erase(sord, iter)) { + return test_fail("Failed to erase begin iterator on non-empty model\n"); + } + sord_iter_free(iter); + + // Ensure only the other graph is left + SordQuad quad; + SordQuad pat = {0, 0, 0, graph42}; + for (iter = sord_begin(sord); !sord_iter_end(iter); sord_iter_next(iter)) { + sord_iter_get(iter, quad); + if (!sord_quad_match(quad, pat)) { + fprintf(stderr, "Graph removal via iteration failed\n"); + return finished(world, sord, EXIT_FAILURE); + } + } + sord_iter_free(iter); + + // Load file into two separate graphs + sord_free(sord); + sord = sord_new(world, SORD_SPO, true); + env = serd_env_new(&base); + SordNode* graph1 = sord_new_uri(world, USTR("http://example.org/graph1")); + SordNode* graph2 = sord_new_uri(world, USTR("http://example.org/graph2")); + SerdReader* reader = sord_new_reader(sord, env, SERD_TURTLE, graph1); + if ((st = serd_reader_read_string(reader, USTR("

.")))) { + fprintf(stderr, "Failed to read string (%s)\n", serd_strerror(st)); + return finished(world, sord, EXIT_FAILURE); + } + serd_reader_free(reader); + reader = sord_new_reader(sord, env, SERD_TURTLE, graph2); + if ((st = serd_reader_read_string(reader, USTR("

.")))) { + fprintf(stderr, "Failed to re-read string (%s)\n", serd_strerror(st)); + return finished(world, sord, EXIT_FAILURE); + } + serd_reader_free(reader); + serd_env_free(env); + + // Ensure we only see triple once + size_t n_triples = 0; + for (iter = sord_begin(sord); !sord_iter_end(iter); sord_iter_next(iter)) { + fprintf(stderr, + "%s %s %s %s\n", + sord_node_get_string(sord_iter_get_node(iter, SORD_SUBJECT)), + sord_node_get_string(sord_iter_get_node(iter, SORD_PREDICATE)), + sord_node_get_string(sord_iter_get_node(iter, SORD_OBJECT)), + sord_node_get_string(sord_iter_get_node(iter, SORD_GRAPH))); + + ++n_triples; + } + sord_iter_free(iter); + if (n_triples != 1) { + fprintf(stderr, "Found duplicate triple\n"); + return finished(world, sord, EXIT_FAILURE); + } + + // Test SPO iteration on an SOP indexed store + sord_free(sord); + sord = sord_new(world, SORD_SOP, false); + generate(world, sord, 1, graph42); + for (iter = sord_begin(sord); !sord_iter_end(iter); sord_iter_next(iter)) { + ++n_triples; + } + sord_iter_free(iter); + + return finished(world, sord, EXIT_SUCCESS); +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c new file mode 100644 index 00000000..e30924a3 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sord_validate.c @@ -0,0 +1,804 @@ +/* + Copyright 2012-2021 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#define _BSD_SOURCE 1 // for realpath +#define _DEFAULT_SOURCE 1 // for realpath + +#include "serd/serd.h" +#include "sord/sord.h" +#include "sord_config.h" + +#if USE_PCRE +# include +#endif + +#ifdef _WIN32 +# include +#endif + +#include +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +# define SORD_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define SORD_LOG_FUNC(fmt, arg1) +#endif + +#define NS_foaf (const uint8_t*)"http://xmlns.com/foaf/0.1/" +#define NS_owl (const uint8_t*)"http://www.w3.org/2002/07/owl#" +#define NS_rdf (const uint8_t*)"http://www.w3.org/1999/02/22-rdf-syntax-ns#" +#define NS_rdfs (const uint8_t*)"http://www.w3.org/2000/01/rdf-schema#" +#define NS_xsd (const uint8_t*)"http://www.w3.org/2001/XMLSchema#" + +typedef struct { + SordNode* foaf_Document; + SordNode* owl_AnnotationProperty; + SordNode* owl_Class; + SordNode* owl_DatatypeProperty; + SordNode* owl_FunctionalProperty; + SordNode* owl_InverseFunctionalProperty; + SordNode* owl_ObjectProperty; + SordNode* owl_OntologyProperty; + SordNode* owl_Restriction; + SordNode* owl_Thing; + SordNode* owl_cardinality; + SordNode* owl_equivalentClass; + SordNode* owl_maxCardinality; + SordNode* owl_minCardinality; + SordNode* owl_onDatatype; + SordNode* owl_onProperty; + SordNode* owl_someValuesFrom; + SordNode* owl_withRestrictions; + SordNode* rdf_PlainLiteral; + SordNode* rdf_Property; + SordNode* rdf_first; + SordNode* rdf_rest; + SordNode* rdf_type; + SordNode* rdfs_Class; + SordNode* rdfs_Literal; + SordNode* rdfs_Resource; + SordNode* rdfs_domain; + SordNode* rdfs_label; + SordNode* rdfs_range; + SordNode* rdfs_subClassOf; + SordNode* xsd_anyURI; + SordNode* xsd_decimal; + SordNode* xsd_double; + SordNode* xsd_maxInclusive; + SordNode* xsd_minInclusive; + SordNode* xsd_pattern; + SordNode* xsd_string; +} URIs; + +static int n_errors = 0; +static int n_restrictions = 0; +static bool one_line_errors = false; + +static int +print_version(void) +{ + printf("sord_validate " SORD_VERSION + " \n"); + printf("Copyright 2012-2021 David Robillard .\n" + "License: \n" + "This is free software; you are free to change and redistribute it." + "\nThere is NO WARRANTY, to the extent permitted by law.\n"); + return 0; +} + +static int +print_usage(const char* name, bool error) +{ + FILE* const os = error ? stderr : stdout; + fprintf(os, "Usage: %s [OPTION]... INPUT...\n", name); + fprintf(os, "Validate RDF data\n\n"); + fprintf(os, " -h Display this help and exit\n"); + fprintf(os, " -l Print errors on a single line.\n"); + fprintf(os, " -v Display version information and exit\n"); + fprintf(os, + "Validate RDF data. This is a simple validator which checks\n" + "that all used properties are actually defined. It does not do\n" + "any fancy file retrieval, the files passed on the command line\n" + "are the only data that is read. In other words, you must pass\n" + "the definition of all vocabularies used on the command line.\n"); + return error ? 1 : 0; +} + +static uint8_t* +absolute_path(const uint8_t* path) +{ +#ifdef _WIN32 + char* out = (char*)malloc(MAX_PATH); + GetFullPathName((const char*)path, MAX_PATH, out, NULL); + return (uint8_t*)out; +#else + return (uint8_t*)realpath((const char*)path, NULL); +#endif +} + +SORD_LOG_FUNC(2, 3) +static int +errorf(const SordQuad quad, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, args); + va_end(args); + + const char* sep = one_line_errors ? "\t" : "\n "; + fprintf(stderr, + "%s%s%s%s%s%s\n", + sep, + (const char*)sord_node_get_string(quad[SORD_SUBJECT]), + sep, + (const char*)sord_node_get_string(quad[SORD_PREDICATE]), + sep, + (const char*)sord_node_get_string(quad[SORD_OBJECT])); + + ++n_errors; + return 1; +} + +static bool +is_descendant_of(SordModel* model, + const URIs* uris, + const SordNode* child, + const SordNode* parent, + const SordNode* pred) +{ + if (!child) { + return false; + } else if (sord_node_equals(child, parent) || + sord_ask(model, child, uris->owl_equivalentClass, parent, NULL)) { + return true; + } + + SordIter* i = sord_search(model, child, pred, NULL, NULL); + for (; !sord_iter_end(i); sord_iter_next(i)) { + const SordNode* o = sord_iter_get_node(i, SORD_OBJECT); + if (sord_node_equals(child, o)) { + continue; // Weird class is explicitly a descendent of itself + } + if (is_descendant_of(model, uris, o, parent, pred)) { + sord_iter_free(i); + return true; + } + } + sord_iter_free(i); + + return false; +} + +static bool +regexp_match(const uint8_t* pat, const char* str) +{ +#if USE_PCRE + // Append a $ to the pattern so we only match if the entire string matches + const size_t len = strlen((const char*)pat); + char* const regx = (char*)malloc(len + 2); + memcpy(regx, pat, len); + regx[len] = '$'; + regx[len + 1] = '\0'; + + const char* err; + int erroffset; + pcre* re = pcre_compile(regx, PCRE_ANCHORED, &err, &erroffset, NULL); + free(regx); + if (!re) { + fprintf( + stderr, "Error in pattern `%s' at offset %d (%s)\n", pat, erroffset, err); + return false; + } + + const bool ret = pcre_exec(re, NULL, str, strlen(str), 0, 0, NULL, 0) >= 0; + pcre_free(re); + return ret; +#endif // USE_PCRE + return true; +} + +static int +bound_cmp(SordModel* model, + const URIs* uris, + const SordNode* literal, + const SordNode* type, + const SordNode* bound) +{ + const char* str = (const char*)sord_node_get_string(literal); + const char* bound_str = (const char*)sord_node_get_string(bound); + const SordNode* pred = uris->owl_onDatatype; + const bool is_numeric = + is_descendant_of(model, uris, type, uris->xsd_decimal, pred) || + is_descendant_of(model, uris, type, uris->xsd_double, pred); + + if (is_numeric) { + const double fbound = serd_strtod(bound_str, NULL); + const double fliteral = serd_strtod(str, NULL); + return ((fliteral < fbound) ? -1 : (fliteral > fbound) ? 1 : 0); + } else { + return strcmp(str, bound_str); + } +} + +static bool +check_restriction(SordModel* model, + const URIs* uris, + const SordNode* literal, + const SordNode* type, + const SordNode* restriction) +{ + size_t len = 0; + const char* str = (const char*)sord_node_get_string_counted(literal, &len); + + // Check xsd:pattern + SordIter* p = sord_search(model, restriction, uris->xsd_pattern, 0, 0); + if (p) { + const SordNode* pat = sord_iter_get_node(p, SORD_OBJECT); + if (!regexp_match(sord_node_get_string(pat), str)) { + fprintf(stderr, + "`%s' does not match <%s> pattern `%s'\n", + sord_node_get_string(literal), + sord_node_get_string(type), + sord_node_get_string(pat)); + sord_iter_free(p); + return false; + } + sord_iter_free(p); + ++n_restrictions; + } + + // Check xsd:minInclusive + SordIter* l = sord_search(model, restriction, uris->xsd_minInclusive, 0, 0); + if (l) { + const SordNode* lower = sord_iter_get_node(l, SORD_OBJECT); + if (bound_cmp(model, uris, literal, type, lower) < 0) { + fprintf(stderr, + "`%s' is not >= <%s> minimum `%s'\n", + sord_node_get_string(literal), + sord_node_get_string(type), + sord_node_get_string(lower)); + sord_iter_free(l); + return false; + } + sord_iter_free(l); + ++n_restrictions; + } + + // Check xsd:maxInclusive + SordIter* u = sord_search(model, restriction, uris->xsd_maxInclusive, 0, 0); + if (u) { + const SordNode* upper = sord_iter_get_node(u, SORD_OBJECT); + if (bound_cmp(model, uris, literal, type, upper) > 0) { + fprintf(stderr, + "`%s' is not <= <%s> maximum `%s'\n", + sord_node_get_string(literal), + sord_node_get_string(type), + sord_node_get_string(upper)); + sord_iter_free(u); + return false; + } + sord_iter_free(u); + ++n_restrictions; + } + + return true; // Unknown restriction, be quietly tolerant +} + +static bool +literal_is_valid(SordModel* model, + const URIs* uris, + const SordQuad quad, + const SordNode* literal, + const SordNode* type) +{ + if (!type) { + return true; + } + + /* Check that literal data is related to required type. We don't do a + strict subtype check here because e.g. an xsd:decimal might be a valid + xsd:unsignedInt, which the pattern checks will verify, but if the + literal type is not related to the required type at all + (e.g. xsd:decimal and xsd:string) there is a problem. */ + const SordNode* datatype = sord_node_get_datatype(literal); + if (datatype && datatype != type) { + if (!is_descendant_of(model, uris, datatype, type, uris->owl_onDatatype) && + !is_descendant_of(model, uris, type, datatype, uris->owl_onDatatype) && + !(sord_node_equals(datatype, uris->xsd_decimal) && + is_descendant_of( + model, uris, type, uris->xsd_double, uris->owl_onDatatype))) { + errorf(quad, + "Literal `%s' datatype <%s> is not compatible with <%s>\n", + sord_node_get_string(literal), + sord_node_get_string(datatype), + sord_node_get_string(type)); + return false; + } + } + + // Find restrictions list + SordIter* rs = sord_search(model, type, uris->owl_withRestrictions, 0, 0); + if (sord_iter_end(rs)) { + return true; // No restrictions + } + + // Walk list, checking each restriction + const SordNode* head = sord_iter_get_node(rs, SORD_OBJECT); + while (head) { + SordIter* f = sord_search(model, head, uris->rdf_first, 0, 0); + if (!f) { + break; // Reached end of restrictions list without failure + } + + // Check this restriction + const bool good = check_restriction( + model, uris, literal, type, sord_iter_get_node(f, SORD_OBJECT)); + sord_iter_free(f); + + if (!good) { + sord_iter_free(rs); + return false; // Failed, literal is invalid + } + + // Seek to next list node + SordIter* n = sord_search(model, head, uris->rdf_rest, 0, 0); + head = n ? sord_iter_get_node(n, SORD_OBJECT) : NULL; + sord_iter_free(n); + } + + sord_iter_free(rs); + + SordIter* s = sord_search(model, type, uris->owl_onDatatype, 0, 0); + if (s) { + const SordNode* super = sord_iter_get_node(s, SORD_OBJECT); + const bool good = literal_is_valid(model, uris, quad, literal, super); + sord_iter_free(s); + return good; // Match iff literal also matches supertype + } + + return true; // Matches top level type +} + +static bool +check_type(SordModel* model, + const URIs* uris, + const SordQuad quad, + const SordNode* node, + const SordNode* type) +{ + if (sord_node_equals(type, uris->rdfs_Resource) || + sord_node_equals(type, uris->owl_Thing)) { + return true; + } + + if (sord_node_get_type(node) == SORD_LITERAL) { + if (sord_node_equals(type, uris->rdfs_Literal)) { + return true; + } else if (sord_node_equals(type, uris->rdf_PlainLiteral)) { + return !sord_node_get_language(node); + } else { + return literal_is_valid(model, uris, quad, node, type); + } + } else if (sord_node_get_type(node) == SORD_URI) { + if (sord_node_equals(type, uris->foaf_Document)) { + return true; // Questionable... + } else if (is_descendant_of( + model, uris, type, uris->xsd_anyURI, uris->owl_onDatatype)) { + /* Type is any URI and this is a URI, so pass. Restrictions on + anyURI subtypes are not currently checked (very uncommon). */ + return true; // Type is anyURI, and this is a URI + } else { + SordIter* t = sord_search(model, node, uris->rdf_type, NULL, NULL); + for (; !sord_iter_end(t); sord_iter_next(t)) { + if (is_descendant_of(model, + uris, + sord_iter_get_node(t, SORD_OBJECT), + type, + uris->rdfs_subClassOf)) { + sord_iter_free(t); + return true; + } + } + sord_iter_free(t); + return false; + } + } else { + return true; // Blanks often lack explicit types, ignore + } + + return false; +} + +static uint64_t +count_non_blanks(SordIter* i, SordQuadIndex field) +{ + uint64_t n = 0; + for (; !sord_iter_end(i); sord_iter_next(i)) { + const SordNode* node = sord_iter_get_node(i, field); + if (sord_node_get_type(node) != SORD_BLANK) { + ++n; + } + } + return n; +} + +static int +check_properties(SordModel* model, URIs* uris) +{ + int st = 0; + SordIter* i = sord_begin(model); + for (; !sord_iter_end(i); sord_iter_next(i)) { + SordQuad quad; + sord_iter_get(i, quad); + + const SordNode* subj = quad[SORD_SUBJECT]; + const SordNode* pred = quad[SORD_PREDICATE]; + const SordNode* obj = quad[SORD_OBJECT]; + + bool is_any_property = false; + SordIter* t = sord_search(model, pred, uris->rdf_type, NULL, NULL); + for (; !sord_iter_end(t); sord_iter_next(t)) { + if (is_descendant_of(model, + uris, + sord_iter_get_node(t, SORD_OBJECT), + uris->rdf_Property, + uris->rdfs_subClassOf)) { + is_any_property = true; + break; + } + } + sord_iter_free(t); + + const bool is_ObjectProperty = + sord_ask(model, pred, uris->rdf_type, uris->owl_ObjectProperty, 0); + const bool is_FunctionalProperty = + sord_ask(model, pred, uris->rdf_type, uris->owl_FunctionalProperty, 0); + const bool is_InverseFunctionalProperty = sord_ask( + model, pred, uris->rdf_type, uris->owl_InverseFunctionalProperty, 0); + const bool is_DatatypeProperty = + sord_ask(model, pred, uris->rdf_type, uris->owl_DatatypeProperty, 0); + + if (!is_any_property) { + st = errorf(quad, "Use of undefined property"); + } + + if (!sord_ask(model, pred, uris->rdfs_label, NULL, NULL)) { + st = + errorf(quad, "Property <%s> has no label", sord_node_get_string(pred)); + } + + if (is_DatatypeProperty && sord_node_get_type(obj) != SORD_LITERAL) { + st = errorf(quad, "Datatype property with non-literal value"); + } + + if (is_ObjectProperty && sord_node_get_type(obj) == SORD_LITERAL) { + st = errorf(quad, "Object property with literal value"); + } + + if (is_FunctionalProperty) { + SordIter* o = sord_search(model, subj, pred, NULL, NULL); + const unsigned n = count_non_blanks(o, SORD_OBJECT); + if (n > 1) { + st = errorf(quad, "Functional property with %u objects", n); + } + sord_iter_free(o); + } + + if (is_InverseFunctionalProperty) { + SordIter* s = sord_search(model, NULL, pred, obj, NULL); + const unsigned n = count_non_blanks(s, SORD_SUBJECT); + if (n > 1) { + st = errorf(quad, "Inverse functional property with %u subjects", n); + } + sord_iter_free(s); + } + + if (sord_node_equals(pred, uris->rdf_type) && + !sord_ask(model, obj, uris->rdf_type, uris->rdfs_Class, NULL) && + !sord_ask(model, obj, uris->rdf_type, uris->owl_Class, NULL)) { + st = errorf(quad, "Type is not a rdfs:Class or owl:Class"); + } + + if (sord_node_get_type(obj) == SORD_LITERAL && + !literal_is_valid( + model, uris, quad, obj, sord_node_get_datatype(obj))) { + st = errorf(quad, "Literal does not match datatype"); + } + + SordIter* r = sord_search(model, pred, uris->rdfs_range, NULL, NULL); + for (; !sord_iter_end(r); sord_iter_next(r)) { + const SordNode* range = sord_iter_get_node(r, SORD_OBJECT); + if (!check_type(model, uris, quad, obj, range)) { + st = errorf( + quad, "Object not in range <%s>\n", sord_node_get_string(range)); + } + } + sord_iter_free(r); + + SordIter* d = sord_search(model, pred, uris->rdfs_domain, NULL, NULL); + if (d) { + const SordNode* domain = sord_iter_get_node(d, SORD_OBJECT); + if (!check_type(model, uris, quad, subj, domain)) { + st = errorf( + quad, "Subject not in domain <%s>", sord_node_get_string(domain)); + } + sord_iter_free(d); + } + } + sord_iter_free(i); + + return st; +} + +static int +check_instance(SordModel* model, + const URIs* uris, + const SordNode* restriction, + const SordQuad quad) +{ + const SordNode* instance = quad[SORD_SUBJECT]; + int st = 0; + + const SordNode* prop = + sord_get(model, restriction, uris->owl_onProperty, NULL, NULL); + if (!prop) { + return 0; + } + + const unsigned values = sord_count(model, instance, prop, NULL, NULL); + + // Check exact cardinality + const SordNode* card = + sord_get(model, restriction, uris->owl_cardinality, NULL, NULL); + if (card) { + const unsigned c = atoi((const char*)sord_node_get_string(card)); + if (values != c) { + st = errorf(quad, + "Property %s on %s has %u != %u values", + sord_node_get_string(prop), + sord_node_get_string(instance), + values, + c); + } + } + + // Check minimum cardinality + const SordNode* minCard = + sord_get(model, restriction, uris->owl_minCardinality, NULL, NULL); + if (minCard) { + const unsigned m = atoi((const char*)sord_node_get_string(minCard)); + if (values < m) { + st = errorf(quad, + "Property %s on %s has %u < %u values", + sord_node_get_string(prop), + sord_node_get_string(instance), + values, + m); + } + } + + // Check maximum cardinality + const SordNode* maxCard = + sord_get(model, restriction, uris->owl_maxCardinality, NULL, NULL); + if (maxCard) { + const unsigned m = atoi((const char*)sord_node_get_string(maxCard)); + if (values < m) { + st = errorf(quad, + "Property %s on %s has %u > %u values", + sord_node_get_string(prop), + sord_node_get_string(instance), + values, + m); + } + } + + // Check someValuesFrom + SordIter* sf = + sord_search(model, restriction, uris->owl_someValuesFrom, NULL, NULL); + if (sf) { + const SordNode* type = sord_iter_get_node(sf, SORD_OBJECT); + + SordIter* v = sord_search(model, instance, prop, NULL, NULL); + bool found = false; + for (; !sord_iter_end(v); sord_iter_next(v)) { + const SordNode* value = sord_iter_get_node(v, SORD_OBJECT); + if (check_type(model, uris, quad, value, type)) { + found = true; + break; + } + } + if (!found) { + st = errorf(quad, + "%s has no <%s> values of type <%s>\n", + sord_node_get_string(instance), + sord_node_get_string(prop), + sord_node_get_string(type)); + } + sord_iter_free(v); + } + sord_iter_free(sf); + + return st; +} + +static int +check_class_instances(SordModel* model, + const URIs* uris, + const SordNode* restriction, + const SordNode* klass) +{ + // Check immediate instances of this class + SordIter* i = sord_search(model, NULL, uris->rdf_type, klass, NULL); + for (; !sord_iter_end(i); sord_iter_next(i)) { + SordQuad quad; + sord_iter_get(i, quad); + check_instance(model, uris, restriction, quad); + } + sord_iter_free(i); + + // Check instances of all subclasses recursively + SordIter* s = sord_search(model, NULL, uris->rdfs_subClassOf, klass, NULL); + for (; !sord_iter_end(s); sord_iter_next(s)) { + const SordNode* subklass = sord_iter_get_node(s, SORD_SUBJECT); + check_class_instances(model, uris, restriction, subklass); + } + sord_iter_free(s); + + return 0; +} + +static int +check_instances(SordModel* model, const URIs* uris) +{ + int st = 0; + SordIter* r = + sord_search(model, NULL, uris->rdf_type, uris->owl_Restriction, NULL); + for (; !sord_iter_end(r); sord_iter_next(r)) { + const SordNode* restriction = sord_iter_get_node(r, SORD_SUBJECT); + const SordNode* prop = + sord_get(model, restriction, uris->owl_onProperty, NULL, NULL); + if (!prop) { + continue; + } + + SordIter* c = + sord_search(model, NULL, uris->rdfs_subClassOf, restriction, NULL); + for (; !sord_iter_end(c); sord_iter_next(c)) { + const SordNode* klass = sord_iter_get_node(c, SORD_SUBJECT); + check_class_instances(model, uris, restriction, klass); + } + sord_iter_free(c); + } + sord_iter_free(r); + + return st; +} + +int +main(int argc, char** argv) +{ + if (argc < 2) { + return print_usage(argv[0], true); + } + + int a = 1; + for (; a < argc && argv[a][0] == '-'; ++a) { + if (argv[a][1] == 'l') { + one_line_errors = true; + } else if (argv[a][1] == 'v') { + return print_version(); + } else { + fprintf(stderr, "%s: Unknown option `%s'\n", argv[0], argv[a]); + return print_usage(argv[0], true); + } + } + + SordWorld* world = sord_world_new(); + SordModel* model = sord_new(world, SORD_SPO | SORD_OPS, false); + SerdEnv* env = serd_env_new(&SERD_NODE_NULL); + SerdReader* reader = sord_new_reader(model, env, SERD_TURTLE, NULL); + + for (; a < argc; ++a) { + const uint8_t* input = (const uint8_t*)argv[a]; + uint8_t* rel_in_path = serd_file_uri_parse(input, NULL); + uint8_t* in_path = absolute_path(rel_in_path); + + free(rel_in_path); + if (!in_path) { + fprintf(stderr, "Skipping file %s\n", input); + continue; + } + + SerdURI base_uri; + SerdNode base_uri_node = + serd_node_new_file_uri(in_path, NULL, &base_uri, true); + + serd_env_set_base_uri(env, &base_uri_node); + const SerdStatus st = serd_reader_read_file(reader, in_path); + if (st) { + fprintf(stderr, "error reading %s: %s\n", in_path, serd_strerror(st)); + } + + serd_node_free(&base_uri_node); + free(in_path); + } + serd_reader_free(reader); + serd_env_free(env); + +#define URI(prefix, suffix) \ + uris.prefix##_##suffix = sord_new_uri(world, NS_##prefix #suffix) + + URIs uris; + URI(foaf, Document); + URI(owl, AnnotationProperty); + URI(owl, Class); + URI(owl, DatatypeProperty); + URI(owl, FunctionalProperty); + URI(owl, InverseFunctionalProperty); + URI(owl, ObjectProperty); + URI(owl, OntologyProperty); + URI(owl, Restriction); + URI(owl, Thing); + URI(owl, cardinality); + URI(owl, equivalentClass); + URI(owl, maxCardinality); + URI(owl, minCardinality); + URI(owl, onDatatype); + URI(owl, onProperty); + URI(owl, someValuesFrom); + URI(owl, withRestrictions); + URI(rdf, PlainLiteral); + URI(rdf, Property); + URI(rdf, first); + URI(rdf, rest); + URI(rdf, type); + URI(rdfs, Class); + URI(rdfs, Literal); + URI(rdfs, Resource); + URI(rdfs, domain); + URI(rdfs, label); + URI(rdfs, range); + URI(rdfs, subClassOf); + URI(xsd, anyURI); + URI(xsd, decimal); + URI(xsd, double); + URI(xsd, maxInclusive); + URI(xsd, minInclusive); + URI(xsd, pattern); + URI(xsd, string); + +#if !USE_PCRE + fprintf(stderr, "warning: Built without PCRE, datatypes not checked.\n"); +#endif + + const int prop_st = check_properties(model, &uris); + const int inst_st = check_instances(model, &uris); + + printf("Found %d errors among %d files (checked %d restrictions)\n", + n_errors, + argc - 1, + n_restrictions); + + sord_free(model); + sord_world_free(world); + return prop_st || inst_st; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c new file mode 100644 index 00000000..2e96f929 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordi.c @@ -0,0 +1,216 @@ +/* + Copyright 2011-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "serd/serd.h" +#include "sord/sord.h" +#include "sord_config.h" + +#ifdef _WIN32 +# include +#endif + +#include +#include +#include +#include +#include + +#define SORDI_ERROR(msg) fprintf(stderr, "sordi: " msg) +#define SORDI_ERRORF(fmt, ...) fprintf(stderr, "sordi: " fmt, __VA_ARGS__) + +typedef struct { + SerdWriter* writer; + SerdEnv* env; + SerdNode base_uri_node; + SerdURI base_uri; + SordModel* sord; +} State; + +static int +print_version(void) +{ + printf("sordi " SORD_VERSION " \n"); + printf("Copyright 2011-2021 David Robillard .\n" + "License: \n" + "This is free software; you are free to change and redistribute it." + "\nThere is NO WARRANTY, to the extent permitted by law.\n"); + return 0; +} + +static int +print_usage(const char* name, bool error) +{ + FILE* const os = error ? stderr : stdout; + fprintf(os, "%s", error ? "\n" : ""); + fprintf(os, "Usage: %s [OPTION]... INPUT [BASE_URI]\n", name); + fprintf(os, "Load and re-serialise RDF data.\n"); + fprintf(os, "Use - for INPUT to read from standard input.\n\n"); + fprintf(os, " -h Display this help and exit\n"); + fprintf(os, " -i SYNTAX Input syntax (`turtle' or `ntriples')\n"); + fprintf(os, " -o SYNTAX Output syntax (`turtle' or `ntriples')\n"); + fprintf(os, " -s INPUT Parse INPUT as string (terminates options)\n"); + fprintf(os, " -v Display version information and exit\n"); + return error ? 1 : 0; +} + +static bool +set_syntax(SerdSyntax* syntax, const char* name) +{ + if (!strcmp(name, "turtle")) { + *syntax = SERD_TURTLE; + } else if (!strcmp(name, "ntriples")) { + *syntax = SERD_NTRIPLES; + } else { + SORDI_ERRORF("unknown syntax `%s'\n", name); + return false; + } + return true; +} + +int +main(int argc, char** argv) +{ + if (argc < 2) { + return print_usage(argv[0], true); + } + + FILE* in_fd = NULL; + SerdSyntax input_syntax = SERD_TURTLE; + SerdSyntax output_syntax = SERD_NTRIPLES; + bool from_file = true; + const uint8_t* in_name = NULL; + int a = 1; + for (; a < argc && argv[a][0] == '-'; ++a) { + if (argv[a][1] == '\0') { + in_name = (const uint8_t*)"(stdin)"; + in_fd = stdin; + break; + } else if (argv[a][1] == 'h') { + return print_usage(argv[0], false); + } else if (argv[a][1] == 'v') { + return print_version(); + } else if (argv[a][1] == 's') { + in_name = (const uint8_t*)"(string)"; + from_file = false; + ++a; + break; + } else if (argv[a][1] == 'i') { + if (++a == argc) { + SORDI_ERROR("option requires an argument -- 'i'\n\n"); + return print_usage(argv[0], true); + } + if (!set_syntax(&input_syntax, argv[a])) { + return print_usage(argv[0], true); + } + } else if (argv[a][1] == 'o') { + if (++a == argc) { + SORDI_ERROR("option requires an argument -- 'o'\n\n"); + return print_usage(argv[0], true); + } + if (!set_syntax(&output_syntax, argv[a])) { + return print_usage(argv[0], true); + } + } else { + SORDI_ERRORF("invalid option -- '%s'\n", argv[a] + 1); + return print_usage(argv[0], true); + } + } + + if (a == argc) { + SORDI_ERROR("missing input\n"); + return print_usage(argv[0], true); + } + + uint8_t* input_path = NULL; + const uint8_t* input = (const uint8_t*)argv[a++]; + if (from_file) { + in_name = in_name ? in_name : input; + if (!in_fd) { + if (!strncmp((const char*)input, "file:", 5)) { + input_path = serd_file_uri_parse(input, NULL); + input = input_path; + } + if (!input || !(in_fd = fopen((const char*)input, "rb"))) { + return 1; + } + } + } + + SerdURI base_uri = SERD_URI_NULL; + SerdNode base = SERD_NODE_NULL; + if (a < argc) { // Base URI given on command line + base = + serd_node_new_uri_from_string((const uint8_t*)argv[a], NULL, &base_uri); + } else if (from_file && in_fd != stdin) { // Use input file URI + base = serd_node_new_file_uri(input, NULL, &base_uri, true); + } + + SordWorld* world = sord_world_new(); + SordModel* sord = sord_new(world, SORD_SPO | SORD_OPS, false); + SerdEnv* env = serd_env_new(&base); + SerdReader* reader = sord_new_reader(sord, env, input_syntax, NULL); + + SerdStatus status = (from_file) + ? serd_reader_read_file_handle(reader, in_fd, in_name) + : serd_reader_read_string(reader, input); + + serd_reader_free(reader); + + FILE* out_fd = stdout; + SerdEnv* write_env = serd_env_new(&base); + + int output_style = SERD_STYLE_RESOLVED; + if (output_syntax == SERD_NTRIPLES) { + output_style |= SERD_STYLE_ASCII; + } else { + output_style |= SERD_STYLE_CURIED | SERD_STYLE_ABBREVIATED; + } + + SerdWriter* writer = serd_writer_new(output_syntax, + (SerdStyle)output_style, + write_env, + &base_uri, + serd_file_sink, + stdout); + + // Write @prefix directives + serd_env_foreach(env, (SerdPrefixSink)serd_writer_set_prefix, writer); + + // Write statements + sord_write(sord, writer, NULL); + + serd_writer_finish(writer); + serd_writer_free(writer); + + serd_env_free(env); + serd_env_free(write_env); + serd_node_free(&base); + free(input_path); + + sord_free(sord); + sord_world_free(world); + + if (from_file) { + fclose(in_fd); + } + + if (fclose(out_fd)) { + perror("sordi: write error"); + status = SERD_ERR_UNKNOWN; + } + + return (status > SERD_FAILURE) ? 1 : 0; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp new file mode 100644 index 00000000..41cb3220 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/sordmm_test.cpp @@ -0,0 +1,25 @@ +/* + Copyright 2011 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "sord/sordmm.hpp" + +int +main() +{ + Sord::World world; + Sord::Model model(world, "http://example.org/"); + return 0; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c new file mode 100644 index 00000000..4dfa0a81 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/syntax.c @@ -0,0 +1,203 @@ +/* + Copyright 2011-2015 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "serd/serd.h" +#include "sord/sord.h" + +#include +#include +#include +#include + +struct SordInserterImpl { + SordModel* model; + SerdEnv* env; +}; + +SordInserter* +sord_inserter_new(SordModel* model, SerdEnv* env) +{ + SordInserter* inserter = (SordInserter*)malloc(sizeof(SordInserter)); + inserter->model = model; + inserter->env = env; + return inserter; +} + +void +sord_inserter_free(SordInserter* inserter) +{ + free(inserter); +} + +SerdStatus +sord_inserter_set_base_uri(SordInserter* inserter, const SerdNode* uri) +{ + return serd_env_set_base_uri(inserter->env, uri); +} + +SerdStatus +sord_inserter_set_prefix(SordInserter* inserter, + const SerdNode* name, + const SerdNode* uri) +{ + return serd_env_set_prefix(inserter->env, name, uri); +} + +SerdStatus +sord_inserter_write_statement(SordInserter* inserter, + SerdStatementFlags flags, + const SerdNode* graph, + const SerdNode* subject, + const SerdNode* predicate, + const SerdNode* object, + const SerdNode* object_datatype, + const SerdNode* object_lang) +{ + SordWorld* world = sord_get_world(inserter->model); + SerdEnv* env = inserter->env; + + SordNode* g = sord_node_from_serd_node(world, env, graph, NULL, NULL); + SordNode* s = sord_node_from_serd_node(world, env, subject, NULL, NULL); + SordNode* p = sord_node_from_serd_node(world, env, predicate, NULL, NULL); + SordNode* o = + sord_node_from_serd_node(world, env, object, object_datatype, object_lang); + + if (!s || !p || !o) { + return SERD_ERR_BAD_ARG; + } + + const SordQuad tup = {s, p, o, g}; + sord_add(inserter->model, tup); + + sord_node_free(world, o); + sord_node_free(world, p); + sord_node_free(world, s); + sord_node_free(world, g); + + return SERD_SUCCESS; +} + +SORD_API +SerdReader* +sord_new_reader(SordModel* model, + SerdEnv* env, + SerdSyntax syntax, + SordNode* graph) +{ + SordInserter* inserter = sord_inserter_new(model, env); + + SerdReader* reader = + serd_reader_new(syntax, + inserter, + (void (*)(void* ptr))sord_inserter_free, + (SerdBaseSink)sord_inserter_set_base_uri, + (SerdPrefixSink)sord_inserter_set_prefix, + (SerdStatementSink)sord_inserter_write_statement, + NULL); + + if (graph) { + serd_reader_set_default_graph(reader, sord_node_to_serd_node(graph)); + } + + return reader; +} + +static SerdStatus +write_statement(SordModel* sord, + SerdWriter* writer, + SordQuad tup, + SerdStatementFlags flags) +{ + const SordNode* s = tup[SORD_SUBJECT]; + const SordNode* p = tup[SORD_PREDICATE]; + const SordNode* o = tup[SORD_OBJECT]; + const SordNode* d = sord_node_get_datatype(o); + const SerdNode* ss = sord_node_to_serd_node(s); + const SerdNode* sp = sord_node_to_serd_node(p); + const SerdNode* so = sord_node_to_serd_node(o); + const SerdNode* sd = sord_node_to_serd_node(d); + + const char* lang_str = sord_node_get_language(o); + size_t lang_len = lang_str ? strlen(lang_str) : 0; + SerdNode language = SERD_NODE_NULL; + if (lang_str) { + language.type = SERD_LITERAL; + language.n_bytes = lang_len; + language.n_chars = lang_len; + language.buf = (const uint8_t*)lang_str; + } + + // TODO: Subject abbreviation + + if (sord_node_is_inline_object(s) && !(flags & SERD_ANON_CONT)) { + return SERD_SUCCESS; + } + + SerdStatus st = SERD_SUCCESS; + if (sord_node_is_inline_object(o)) { + SordQuad sub_pat = {o, 0, 0, 0}; + SordIter* sub_iter = sord_find(sord, sub_pat); + + SerdStatementFlags start_flags = + flags | ((sub_iter) ? SERD_ANON_O_BEGIN : SERD_EMPTY_O); + + st = serd_writer_write_statement( + writer, start_flags, NULL, ss, sp, so, sd, &language); + + if (!st && sub_iter) { + flags |= SERD_ANON_CONT; + for (; !st && !sord_iter_end(sub_iter); sord_iter_next(sub_iter)) { + SordQuad sub_tup; + sord_iter_get(sub_iter, sub_tup); + st = write_statement(sord, writer, sub_tup, flags); + } + sord_iter_free(sub_iter); + serd_writer_end_anon(writer, so); + } + } else { + st = serd_writer_write_statement( + writer, flags, NULL, ss, sp, so, sd, &language); + } + + return st; +} + +bool +sord_write(SordModel* model, SerdWriter* writer, SordNode* graph) +{ + SordQuad pat = {0, 0, 0, graph}; + SordIter* iter = sord_find(model, pat); + return sord_write_iter(iter, writer); +} + +bool +sord_write_iter(SordIter* iter, SerdWriter* writer) +{ + if (!iter) { + return false; + } + + SordModel* model = (SordModel*)sord_iter_get_model(iter); + SerdStatus st = SERD_SUCCESS; + for (; !st && !sord_iter_end(iter); sord_iter_next(iter)) { + SordQuad tup; + sord_iter_get(iter, tup); + st = write_statement(model, writer, tup, 0); + } + sord_iter_free(iter); + + return !st; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c new file mode 100644 index 00000000..7926a56a --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.c @@ -0,0 +1,936 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "zix/btree.h" + +#include +#include +#include +#include + +// #define ZIX_BTREE_DEBUG 1 +// #define ZIX_BTREE_SORTED_CHECK 1 + +#ifndef ZIX_BTREE_PAGE_SIZE +# define ZIX_BTREE_PAGE_SIZE 4096 +#endif + +#define ZIX_BTREE_NODE_SPACE (ZIX_BTREE_PAGE_SIZE - 2 * sizeof(uint16_t)) +#define ZIX_BTREE_LEAF_VALS ((ZIX_BTREE_NODE_SPACE / sizeof(void*)) - 1) +#define ZIX_BTREE_INODE_VALS (ZIX_BTREE_LEAF_VALS / 2) + +struct ZixBTreeImpl { + ZixBTreeNode* root; + ZixDestroyFunc destroy; + ZixComparator cmp; + const void* cmp_data; + size_t size; + unsigned height; ///< Number of levels, i.e. root only has height 1 +}; + +struct ZixBTreeNodeImpl { + uint16_t is_leaf; + uint16_t n_vals; + // On 64-bit we rely on some padding here to get page-sized nodes + union { + struct { + void* vals[ZIX_BTREE_LEAF_VALS]; + } leaf; + + struct { + void* vals[ZIX_BTREE_INODE_VALS]; + ZixBTreeNode* children[ZIX_BTREE_INODE_VALS + 1]; + } inode; + } data; +}; + +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112l) || \ + (defined(__cplusplus) && __cplusplus >= 201103L) +static_assert(sizeof(ZixBTreeNode) == ZIX_BTREE_PAGE_SIZE, ""); +#endif + +typedef struct { + ZixBTreeNode* node; + unsigned index; +} ZixBTreeIterFrame; + +struct ZixBTreeIterImpl { + unsigned n_levels; ///< Maximum depth of stack + unsigned level; ///< Current level in stack + ZixBTreeIterFrame stack[]; ///< Position stack +}; + +#ifdef ZIX_BTREE_DEBUG + +static void +print_node(const ZixBTreeNode* n, const char* prefix) +{ + printf("%s[", prefix); + for (uint16_t v = 0; v < n->n_vals; ++v) { + printf(" %lu", (uintptr_t)n->vals[v]); + } + printf(" ]\n"); +} + +static void +print_tree(const ZixBTreeNode* parent, const ZixBTreeNode* node, int level) +{ + if (node) { + if (!parent) { + printf("TREE {\n"); + } + for (int i = 0; i < level + 1; ++i) { + printf(" "); + } + print_node(node, ""); + if (!node->is_leaf) { + for (uint16_t i = 0; i < node->n_vals + 1; ++i) { + print_tree(node, node->data.inode.children[i], level + 1); + } + } + if (!parent) { + printf("}\n"); + } + } +} + +#endif // ZIX_BTREE_DEBUG + +static ZixBTreeNode* +zix_btree_node_new(const bool leaf) +{ +#if !((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112l) || \ + (defined(__cplusplus) && __cplusplus >= 201103L)) + assert(sizeof(ZixBTreeNode) == ZIX_BTREE_PAGE_SIZE); +#endif + + ZixBTreeNode* node = (ZixBTreeNode*)malloc(sizeof(ZixBTreeNode)); + if (node) { + node->is_leaf = leaf; + node->n_vals = 0; + } + return node; +} + +static void* +zix_btree_value(const ZixBTreeNode* const node, const unsigned i) +{ + assert(i < node->n_vals); + return node->is_leaf ? node->data.leaf.vals[i] : node->data.inode.vals[i]; +} + +static ZixBTreeNode* +zix_btree_child(const ZixBTreeNode* const node, const unsigned i) +{ + assert(!node->is_leaf); + assert(i <= ZIX_BTREE_INODE_VALS); + return node->data.inode.children[i]; +} + +ZixBTree* +zix_btree_new(const ZixComparator cmp, + const void* const cmp_data, + const ZixDestroyFunc destroy) +{ + ZixBTree* t = (ZixBTree*)malloc(sizeof(ZixBTree)); + if (t) { + t->root = zix_btree_node_new(true); + t->destroy = destroy; + t->cmp = cmp; + t->cmp_data = cmp_data; + t->size = 0; + t->height = 1; + if (!t->root) { + free(t); + return NULL; + } + } + return t; +} + +static void +zix_btree_free_rec(ZixBTree* const t, ZixBTreeNode* const n) +{ + if (n) { + if (n->is_leaf) { + if (t->destroy) { + for (uint16_t i = 0; i < n->n_vals; ++i) { + t->destroy(n->data.leaf.vals[i]); + } + } + } else { + if (t->destroy) { + for (uint16_t i = 0; i < n->n_vals; ++i) { + t->destroy(n->data.inode.vals[i]); + } + } + + for (uint16_t i = 0; i < n->n_vals + 1; ++i) { + zix_btree_free_rec(t, zix_btree_child(n, i)); + } + } + + free(n); + } +} + +void +zix_btree_free(ZixBTree* const t) +{ + if (t) { + zix_btree_free_rec(t, t->root); + free(t); + } +} + +size_t +zix_btree_size(const ZixBTree* const t) +{ + return t->size; +} + +static uint16_t +zix_btree_max_vals(const ZixBTreeNode* const node) +{ + return node->is_leaf ? ZIX_BTREE_LEAF_VALS : ZIX_BTREE_INODE_VALS; +} + +static uint16_t +zix_btree_min_vals(const ZixBTreeNode* const node) +{ + return (uint16_t)(((zix_btree_max_vals(node) + 1U) / 2U) - 1U); +} + +/** Shift pointers in `array` of length `n` right starting at `i`. */ +static void +zix_btree_ainsert(void** const array, + const unsigned n, + const unsigned i, + void* const e) +{ + memmove(array + i + 1, array + i, (n - i) * sizeof(e)); + array[i] = e; +} + +/** Erase element `i` in `array` of length `n` and return erased element. */ +static void* +zix_btree_aerase(void** const array, const unsigned n, const unsigned i) +{ + void* const ret = array[i]; + memmove(array + i, array + i + 1, (n - i) * sizeof(ret)); + return ret; +} + +/** Split lhs, the i'th child of `n`, into two nodes. */ +static ZixBTreeNode* +zix_btree_split_child(ZixBTreeNode* const n, + const unsigned i, + ZixBTreeNode* const lhs) +{ + assert(lhs->n_vals == zix_btree_max_vals(lhs)); + assert(n->n_vals < ZIX_BTREE_INODE_VALS); + assert(i < n->n_vals + 1U); + assert(zix_btree_child(n, i) == lhs); + + const uint16_t max_n_vals = zix_btree_max_vals(lhs); + ZixBTreeNode* rhs = zix_btree_node_new(lhs->is_leaf); + if (!rhs) { + return NULL; + } + + // LHS and RHS get roughly half, less the middle value which moves up + lhs->n_vals = max_n_vals / 2U; + rhs->n_vals = (uint16_t)(max_n_vals - lhs->n_vals - 1); + + if (lhs->is_leaf) { + // Copy large half from LHS to new RHS node + memcpy(rhs->data.leaf.vals, + lhs->data.leaf.vals + lhs->n_vals + 1, + rhs->n_vals * sizeof(void*)); + + // Move middle value up to parent + zix_btree_ainsert( + n->data.inode.vals, n->n_vals, i, lhs->data.leaf.vals[lhs->n_vals]); + } else { + // Copy large half from LHS to new RHS node + memcpy(rhs->data.inode.vals, + lhs->data.inode.vals + lhs->n_vals + 1, + rhs->n_vals * sizeof(void*)); + memcpy(rhs->data.inode.children, + lhs->data.inode.children + lhs->n_vals + 1, + (rhs->n_vals + 1U) * sizeof(ZixBTreeNode*)); + + // Move middle value up to parent + zix_btree_ainsert( + n->data.inode.vals, n->n_vals, i, lhs->data.inode.vals[lhs->n_vals]); + } + + // Insert new RHS node in parent at position i + zix_btree_ainsert((void**)n->data.inode.children, ++n->n_vals, i + 1U, rhs); + + return rhs; +} + +#ifdef ZIX_BTREE_SORTED_CHECK +/** Check that `n` is sorted with respect to search key `e`. */ +static bool +zix_btree_node_is_sorted_with_respect_to(const ZixBTree* const t, + const ZixBTreeNode* const n, + const void* const e) +{ + if (n->n_vals <= 1) { + return true; + } + + int cmp = t->cmp(zix_btree_value(n, 0), e, t->cmp_data); + for (uint16_t i = 1; i < n->n_vals; ++i) { + const int next_cmp = t->cmp(zix_btree_value(n, i), e, t->cmp_data); + if ((cmp >= 0 && next_cmp < 0) || (cmp > 0 && next_cmp <= 0)) { + return false; + } + cmp = next_cmp; + } + + return true; +} +#endif + +/** Find the first value in `n` that is not less than `e` (lower bound). */ +static unsigned +zix_btree_node_find(const ZixBTree* const t, + const ZixBTreeNode* const n, + const void* const e, + bool* const equal) +{ +#ifdef ZIX_BTREE_SORTED_CHECK + assert(zix_btree_node_is_sorted_with_respect_to(t, n, e)); +#endif + + unsigned first = 0U; + unsigned len = n->n_vals; + while (len > 0) { + const unsigned half = len >> 1U; + const unsigned i = first + half; + const int cmp = t->cmp(zix_btree_value(n, i), e, t->cmp_data); + if (cmp == 0) { + *equal = true; + len = half; // Keep searching for wildcard matches + } else if (cmp < 0) { + const unsigned chop = half + 1U; + first += chop; + len -= chop; + } else { + len = half; + } + } + + assert(!*equal || t->cmp(zix_btree_value(n, first), e, t->cmp_data) == 0); + return first; +} + +ZixStatus +zix_btree_insert(ZixBTree* const t, void* const e) +{ + ZixBTreeNode* parent = NULL; // Parent of n + ZixBTreeNode* n = t->root; // Current node + unsigned i = 0; // Index of n in parent + while (n) { + if (n->n_vals == zix_btree_max_vals(n)) { + // Node is full, split to ensure there is space for a leaf split + if (!parent) { + // Root is full, grow tree upwards + if (!(parent = zix_btree_node_new(false))) { + return ZIX_STATUS_NO_MEM; + } + t->root = parent; + parent->data.inode.children[0] = n; + ++t->height; + } + + ZixBTreeNode* const rhs = zix_btree_split_child(parent, i, n); + if (!rhs) { + return ZIX_STATUS_NO_MEM; + } + + const int cmp = t->cmp(parent->data.inode.vals[i], e, t->cmp_data); + if (cmp == 0) { + return ZIX_STATUS_EXISTS; + } + + if (cmp < 0) { + // Move to new RHS + n = rhs; + ++i; + } + } + + assert(!parent || zix_btree_child(parent, i) == n); + + bool equal = false; + i = zix_btree_node_find(t, n, e, &equal); + if (equal) { + return ZIX_STATUS_EXISTS; + } + + if (!n->is_leaf) { + // Descend to child node left of value + parent = n; + n = zix_btree_child(n, i); + } else { + // Insert into internal node + zix_btree_ainsert(n->data.leaf.vals, n->n_vals++, i, e); + break; + } + } + + ++t->size; + + return ZIX_STATUS_SUCCESS; +} + +static ZixBTreeIter* +zix_btree_iter_new(const ZixBTree* const t) +{ + const size_t s = t->height * sizeof(ZixBTreeIterFrame); + + ZixBTreeIter* i = (ZixBTreeIter*)calloc(1, sizeof(ZixBTreeIter) + s); + if (i) { + i->n_levels = t->height; + } + return i; +} + +static void +zix_btree_iter_set_frame(ZixBTreeIter* const ti, + ZixBTreeNode* const n, + const unsigned i) +{ + if (ti) { + ti->stack[ti->level].node = n; + ti->stack[ti->level].index = i; + } +} + +static bool +zix_btree_node_is_minimal(ZixBTreeNode* const n) +{ + assert(n->n_vals >= zix_btree_min_vals(n)); + return n->n_vals == zix_btree_min_vals(n); +} + +/** Enlarge left child by stealing a value from its right sibling. */ +static ZixBTreeNode* +zix_btree_rotate_left(ZixBTreeNode* const parent, const unsigned i) +{ + ZixBTreeNode* const lhs = zix_btree_child(parent, i); + ZixBTreeNode* const rhs = zix_btree_child(parent, i + 1); + + assert(lhs->is_leaf == rhs->is_leaf); + + if (lhs->is_leaf) { + // Move parent value to end of LHS + lhs->data.leaf.vals[lhs->n_vals++] = parent->data.inode.vals[i]; + + // Move first value in RHS to parent + parent->data.inode.vals[i] = + zix_btree_aerase(rhs->data.leaf.vals, rhs->n_vals, 0); + } else { + // Move parent value to end of LHS + lhs->data.inode.vals[lhs->n_vals++] = parent->data.inode.vals[i]; + + // Move first value in RHS to parent + parent->data.inode.vals[i] = + zix_btree_aerase(rhs->data.inode.vals, rhs->n_vals, 0); + + // Move first child pointer from RHS to end of LHS + lhs->data.inode.children[lhs->n_vals] = (ZixBTreeNode*)zix_btree_aerase( + (void**)rhs->data.inode.children, rhs->n_vals, 0); + } + + --rhs->n_vals; + + return lhs; +} + +/** Enlarge right child by stealing a value from its left sibling. */ +static ZixBTreeNode* +zix_btree_rotate_right(ZixBTreeNode* const parent, const unsigned i) +{ + ZixBTreeNode* const lhs = zix_btree_child(parent, i - 1); + ZixBTreeNode* const rhs = zix_btree_child(parent, i); + + assert(lhs->is_leaf == rhs->is_leaf); + + if (lhs->is_leaf) { + // Prepend parent value to RHS + zix_btree_ainsert( + rhs->data.leaf.vals, rhs->n_vals++, 0, parent->data.inode.vals[i - 1]); + + // Move last value from LHS to parent + parent->data.inode.vals[i - 1] = lhs->data.leaf.vals[--lhs->n_vals]; + } else { + // Prepend parent value to RHS + zix_btree_ainsert( + rhs->data.inode.vals, rhs->n_vals++, 0, parent->data.inode.vals[i - 1]); + + // Move last child pointer from LHS and prepend to RHS + zix_btree_ainsert((void**)rhs->data.inode.children, + rhs->n_vals, + 0, + lhs->data.inode.children[lhs->n_vals]); + + // Move last value from LHS to parent + parent->data.inode.vals[i - 1] = lhs->data.inode.vals[--lhs->n_vals]; + } + + return rhs; +} + +/** Move n[i] down, merge the left and right child, return the merged node. */ +static ZixBTreeNode* +zix_btree_merge(ZixBTree* const t, ZixBTreeNode* const n, const unsigned i) +{ + ZixBTreeNode* const lhs = zix_btree_child(n, i); + ZixBTreeNode* const rhs = zix_btree_child(n, i + 1); + + assert(lhs->is_leaf == rhs->is_leaf); + assert(zix_btree_node_is_minimal(lhs)); + assert(lhs->n_vals + rhs->n_vals < zix_btree_max_vals(lhs)); + + // Move parent value to end of LHS + if (lhs->is_leaf) { + lhs->data.leaf.vals[lhs->n_vals++] = + zix_btree_aerase(n->data.inode.vals, n->n_vals, i); + } else { + lhs->data.inode.vals[lhs->n_vals++] = + zix_btree_aerase(n->data.inode.vals, n->n_vals, i); + } + + // Erase corresponding child pointer (to RHS) in parent + zix_btree_aerase((void**)n->data.inode.children, n->n_vals, i + 1U); + + // Add everything from RHS to end of LHS + if (lhs->is_leaf) { + memcpy(lhs->data.leaf.vals + lhs->n_vals, + rhs->data.leaf.vals, + rhs->n_vals * sizeof(void*)); + } else { + memcpy(lhs->data.inode.vals + lhs->n_vals, + rhs->data.inode.vals, + rhs->n_vals * sizeof(void*)); + memcpy(lhs->data.inode.children + lhs->n_vals, + rhs->data.inode.children, + (rhs->n_vals + 1U) * sizeof(void*)); + } + + lhs->n_vals = (uint16_t)(lhs->n_vals + rhs->n_vals); + + if (--n->n_vals == 0) { + // Root is now empty, replace it with its only child + assert(n == t->root); + t->root = lhs; + free(n); + } + + free(rhs); + return lhs; +} + +/** Remove and return the min value from the subtree rooted at `n`. */ +static void* +zix_btree_remove_min(ZixBTree* const t, ZixBTreeNode* n) +{ + while (!n->is_leaf) { + if (zix_btree_node_is_minimal(zix_btree_child(n, 0))) { + // Leftmost child is minimal, must expand + if (!zix_btree_node_is_minimal(zix_btree_child(n, 1))) { + // Child's right sibling has at least one key to steal + n = zix_btree_rotate_left(n, 0); + } else { + // Both child and right sibling are minimal, merge + n = zix_btree_merge(t, n, 0); + } + } else { + n = zix_btree_child(n, 0); + } + } + + return zix_btree_aerase(n->data.leaf.vals, --n->n_vals, 0); +} + +/** Remove and return the max value from the subtree rooted at `n`. */ +static void* +zix_btree_remove_max(ZixBTree* const t, ZixBTreeNode* n) +{ + while (!n->is_leaf) { + if (zix_btree_node_is_minimal(zix_btree_child(n, n->n_vals))) { + // Leftmost child is minimal, must expand + if (!zix_btree_node_is_minimal(zix_btree_child(n, n->n_vals - 1))) { + // Child's left sibling has at least one key to steal + n = zix_btree_rotate_right(n, n->n_vals); + } else { + // Both child and left sibling are minimal, merge + n = zix_btree_merge(t, n, n->n_vals - 1U); + } + } else { + n = zix_btree_child(n, n->n_vals); + } + } + + return n->data.leaf.vals[--n->n_vals]; +} + +ZixStatus +zix_btree_remove(ZixBTree* const t, + const void* const e, + void** const out, + ZixBTreeIter** const next) +{ + ZixBTreeNode* n = t->root; + ZixBTreeIter* ti = NULL; + const bool user_iter = next && *next; + if (next) { + if (!*next && !(*next = zix_btree_iter_new(t))) { + return ZIX_STATUS_NO_MEM; + } + ti = *next; + ti->level = 0; + } + + while (true) { + /* To remove in a single walk down, the tree is adjusted along the way + so that the current node always has at least one more value than the + minimum required in general. Thus, there is always room to remove + without adjusting on the way back up. */ + assert(n == t->root || !zix_btree_node_is_minimal(n)); + + bool equal = false; + const unsigned i = zix_btree_node_find(t, n, e, &equal); + zix_btree_iter_set_frame(ti, n, i); + if (n->is_leaf) { + if (equal) { + // Found in leaf node + *out = zix_btree_aerase(n->data.leaf.vals, --n->n_vals, i); + if (ti && i == n->n_vals) { + if (i == 0) { + ti->level = 0; + ti->stack[0].node = NULL; + } else { + --ti->stack[ti->level].index; + zix_btree_iter_increment(ti); + } + } + --t->size; + return ZIX_STATUS_SUCCESS; + } + + // Not found in leaf node, or tree + if (ti && !user_iter) { + zix_btree_iter_free(ti); + *next = NULL; + } + + return ZIX_STATUS_NOT_FOUND; + } + + if (equal) { + // Found in internal node + ZixBTreeNode* const lhs = zix_btree_child(n, i); + ZixBTreeNode* const rhs = zix_btree_child(n, i + 1); + const size_t l_size = lhs->n_vals; + const size_t r_size = rhs->n_vals; + if (zix_btree_node_is_minimal(lhs) && zix_btree_node_is_minimal(rhs)) { + // Both preceding and succeeding child are minimal + n = zix_btree_merge(t, n, i); + } else if (l_size >= r_size) { + // Left child can remove without merge + assert(!zix_btree_node_is_minimal(lhs)); + *out = n->data.inode.vals[i]; + n->data.inode.vals[i] = zix_btree_remove_max(t, lhs); + --t->size; + return ZIX_STATUS_SUCCESS; + } else { + // Right child can remove without merge + assert(!zix_btree_node_is_minimal(rhs)); + *out = n->data.inode.vals[i]; + n->data.inode.vals[i] = zix_btree_remove_min(t, rhs); + --t->size; + return ZIX_STATUS_SUCCESS; + } + } else { + // Not found in internal node, key is in/under children[i] + if (zix_btree_node_is_minimal(zix_btree_child(n, i))) { + if (i > 0 && !zix_btree_node_is_minimal(zix_btree_child(n, i - 1))) { + // Steal a key from child's left sibling + n = zix_btree_rotate_right(n, i); + } else if (i < n->n_vals && + !zix_btree_node_is_minimal(zix_btree_child(n, i + 1))) { + // Steal a key from child's right sibling + n = zix_btree_rotate_left(n, i); + } else if (n == t->root && n->n_vals == 1) { + // Root has two children, both minimal, delete it + assert(i == 0 || i == 1); + const uint16_t counts[2] = {zix_btree_child(n, 0)->n_vals, + zix_btree_child(n, 1)->n_vals}; + + n = zix_btree_merge(t, n, 0); + if (ti) { + ti->stack[ti->level].node = n; + ti->stack[ti->level].index = counts[i]; + } + } else { + // Both child's siblings are minimal, merge them + if (i < n->n_vals) { + n = zix_btree_merge(t, n, i); + } else { + n = zix_btree_merge(t, n, i - 1U); + if (ti) { + --ti->stack[ti->level].index; + } + } + } + } else { + n = zix_btree_child(n, i); + } + } + if (ti) { + ++ti->level; + } + } + + assert(false); // Not reached + return ZIX_STATUS_ERROR; +} + +ZixStatus +zix_btree_find(const ZixBTree* const t, + const void* const e, + ZixBTreeIter** const ti) +{ + ZixBTreeNode* n = t->root; + if (!(*ti = zix_btree_iter_new(t))) { + return ZIX_STATUS_NO_MEM; + } + + while (n) { + bool equal = false; + const unsigned i = zix_btree_node_find(t, n, e, &equal); + + zix_btree_iter_set_frame(*ti, n, i); + + if (equal) { + return ZIX_STATUS_SUCCESS; + } + + if (n->is_leaf) { + break; + } + + ++(*ti)->level; + n = zix_btree_child(n, i); + } + + zix_btree_iter_free(*ti); + *ti = NULL; + return ZIX_STATUS_NOT_FOUND; +} + +ZixStatus +zix_btree_lower_bound(const ZixBTree* const t, + const void* const e, + ZixBTreeIter** const ti) +{ + if (!t) { + *ti = NULL; + return ZIX_STATUS_BAD_ARG; + } + + if (!t->root) { + *ti = NULL; + return ZIX_STATUS_SUCCESS; + } + + ZixBTreeNode* n = t->root; + bool found = false; + unsigned found_level = 0; + if (!(*ti = zix_btree_iter_new(t))) { + return ZIX_STATUS_NO_MEM; + } + + while (n) { + bool equal = false; + const unsigned i = zix_btree_node_find(t, n, e, &equal); + + zix_btree_iter_set_frame(*ti, n, i); + + if (equal) { + found_level = (*ti)->level; + found = true; + } + + if (n->is_leaf) { + break; + } + + ++(*ti)->level; + n = zix_btree_child(n, i); + assert(n); + } + + const ZixBTreeIterFrame* const frame = &(*ti)->stack[(*ti)->level]; + assert(frame->node); + if (frame->index == frame->node->n_vals) { + if (found) { + // Found on a previous level but went too far + (*ti)->level = found_level; + } else { + // Reached end (key is greater than everything in tree) + (*ti)->level = 0; + (*ti)->stack[0].node = NULL; + } + } + + return ZIX_STATUS_SUCCESS; +} + +void* +zix_btree_get(const ZixBTreeIter* const ti) +{ + const ZixBTreeIterFrame* const frame = &ti->stack[ti->level]; + assert(frame->node); + assert(frame->index < frame->node->n_vals); + return zix_btree_value(frame->node, frame->index); +} + +ZixBTreeIter* +zix_btree_begin(const ZixBTree* const t) +{ + ZixBTreeIter* const i = zix_btree_iter_new(t); + if (!i) { + return NULL; + } + + if (t->size == 0) { + i->level = 0; + i->stack[0].node = NULL; + } else { + ZixBTreeNode* n = t->root; + i->stack[0].node = n; + i->stack[0].index = 0; + while (!n->is_leaf) { + n = zix_btree_child(n, 0); + ++i->level; + i->stack[i->level].node = n; + i->stack[i->level].index = 0; + } + } + + return i; +} + +ZixBTreeIter* +zix_btree_end(const ZixBTree* const t) +{ + return zix_btree_iter_new(t); +} + +ZixBTreeIter* +zix_btree_iter_copy(const ZixBTreeIter* const i) +{ + if (!i) { + return NULL; + } + + const size_t s = i->n_levels * sizeof(ZixBTreeIterFrame); + ZixBTreeIter* j = (ZixBTreeIter*)calloc(1, sizeof(ZixBTreeIter) + s); + if (j) { + memcpy(j, i, sizeof(ZixBTreeIter) + s); + } + + return j; +} + +bool +zix_btree_iter_is_end(const ZixBTreeIter* const i) +{ + return !i || (i->level == 0 && i->stack[0].node == NULL); +} + +bool +zix_btree_iter_equals(const ZixBTreeIter* const lhs, + const ZixBTreeIter* const rhs) +{ + if (zix_btree_iter_is_end(lhs) && zix_btree_iter_is_end(rhs)) { + return true; + } + + if (zix_btree_iter_is_end(lhs) || zix_btree_iter_is_end(rhs) || + lhs->level != rhs->level) { + return false; + } + + return !memcmp(lhs, + rhs, + sizeof(ZixBTreeIter) + + (lhs->level + 1) * sizeof(ZixBTreeIterFrame)); +} + +void +zix_btree_iter_increment(ZixBTreeIter* const i) +{ + ZixBTreeIterFrame* f = &i->stack[i->level]; + if (f->node->is_leaf) { + // Leaf, move right + assert(f->index < f->node->n_vals); + if (++f->index == f->node->n_vals) { + // Reached end of leaf, move up + f = &i->stack[i->level]; + while (i->level > 0 && f->index == f->node->n_vals) { + f = &i->stack[--i->level]; + assert(f->index <= f->node->n_vals); + } + + if (f->index == f->node->n_vals) { + // Reached end of tree + assert(i->level == 0); + f->node = NULL; + f->index = 0; + } + } + } else { + // Internal node, move down to next child + assert(f->index < f->node->n_vals); + ZixBTreeNode* child = zix_btree_child(f->node, ++f->index); + + f = &i->stack[++i->level]; + f->node = child; + f->index = 0; + + // Move down and left until we hit a leaf + while (!f->node->is_leaf) { + child = zix_btree_child(f->node, 0); + f = &i->stack[++i->level]; + f->node = child; + f->index = 0; + } + } +} + +void +zix_btree_iter_free(ZixBTreeIter* const i) +{ + free(i); +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h new file mode 100644 index 00000000..bec06988 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/btree.h @@ -0,0 +1,187 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef ZIX_BTREE_H +#define ZIX_BTREE_H + +#include "zix/common.h" + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + @addtogroup zix + @{ + @name BTree + @{ +*/ + +/** + A B-Tree. +*/ +typedef struct ZixBTreeImpl ZixBTree; + +/** + A B-Tree node (opaque). +*/ +typedef struct ZixBTreeNodeImpl ZixBTreeNode; + +/** + An iterator over a B-Tree. + + Note that modifying the trees invalidates all iterators, so all iterators + are const iterators. +*/ +typedef struct ZixBTreeIterImpl ZixBTreeIter; + +/** + Create a new (empty) B-Tree. +*/ +ZIX_API +ZixBTree* +zix_btree_new(ZixComparator cmp, const void* cmp_data, ZixDestroyFunc destroy); + +/** + Free `t`. +*/ +ZIX_API +void +zix_btree_free(ZixBTree* t); + +/** + Return the number of elements in `t`. +*/ +ZIX_PURE_API +size_t +zix_btree_size(const ZixBTree* t); + +/** + Insert the element `e` into `t`. +*/ +ZIX_API +ZixStatus +zix_btree_insert(ZixBTree* t, void* e); + +/** + Remove the value `e` from `t`. + + @param t Tree to remove from. + + @param e Value to remove. + + @param out Set to point to the removed pointer (which may not equal `e`). + + @param next If non-NULL, pointed to the value following `e`. If *next is + also non-NULL, the iterator is reused, otherwise a new one is allocated. To + reuse an iterator, no items may have been added since its creation. +*/ +ZIX_API +ZixStatus +zix_btree_remove(ZixBTree* t, const void* e, void** out, ZixBTreeIter** next); + +/** + Set `ti` to an element equal to `e` in `t`. + If no such item exists, `ti` is set to NULL. +*/ +ZIX_API +ZixStatus +zix_btree_find(const ZixBTree* t, const void* e, ZixBTreeIter** ti); + +/** + Set `ti` to the smallest element in `t` that is not less than `e`. + + Wildcards are supported, so if the search key `e` compares equal to many + values in the tree, `ti` will be set to the least such element. The search + key `e` is always passed as the second argument to the comparator. +*/ +ZIX_API +ZixStatus +zix_btree_lower_bound(const ZixBTree* t, const void* e, ZixBTreeIter** ti); + +/** + Return the data associated with the given tree item. +*/ +ZIX_PURE_API +void* +zix_btree_get(const ZixBTreeIter* ti); + +/** + Return an iterator to the first (smallest) element in `t`. + + The returned iterator must be freed with zix_btree_iter_free(). +*/ +ZIX_PURE_API +ZixBTreeIter* +zix_btree_begin(const ZixBTree* t); + +/** + Return an iterator to the end of `t` (one past the last element). + + The returned iterator must be freed with zix_btree_iter_free(). +*/ +ZIX_API +ZixBTreeIter* +zix_btree_end(const ZixBTree* t); + +/** + Return a new copy of `i`. +*/ +ZIX_API +ZixBTreeIter* +zix_btree_iter_copy(const ZixBTreeIter* i); + +/** + Return true iff `lhs` is equal to `rhs`. +*/ +ZIX_PURE_API +bool +zix_btree_iter_equals(const ZixBTreeIter* lhs, const ZixBTreeIter* rhs); + +/** + Return true iff `i` is an iterator to the end of its tree. +*/ +ZIX_PURE_API +bool +zix_btree_iter_is_end(const ZixBTreeIter* i); + +/** + Increment `i` to point to the next element in the tree. +*/ +ZIX_API +void +zix_btree_iter_increment(ZixBTreeIter* i); + +/** + Free `i`. +*/ +ZIX_API +void +zix_btree_iter_free(ZixBTreeIter* i); + +/** + @} + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_BTREE_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h new file mode 100644 index 00000000..d47586c6 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/common.h @@ -0,0 +1,138 @@ +/* + Copyright 2016-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef ZIX_COMMON_H +#define ZIX_COMMON_H + +#include + +/** + @addtogroup zix + @{ +*/ + +/** @cond */ +#if defined(_WIN32) && !defined(ZIX_STATIC) && defined(ZIX_INTERNAL) +# define ZIX_API __declspec(dllexport) +#elif defined(_WIN32) && !defined(ZIX_STATIC) +# define ZIX_API __declspec(dllimport) +#elif defined(__GNUC__) +# define ZIX_API __attribute__((visibility("default"))) +#else +# define ZIX_API +#endif + +#ifdef __GNUC__ +# define ZIX_PURE_FUNC __attribute__((pure)) +# define ZIX_CONST_FUNC __attribute__((const)) +# define ZIX_MALLOC_FUNC __attribute__((malloc)) +#else +# define ZIX_PURE_FUNC +# define ZIX_CONST_FUNC +# define ZIX_MALLOC_FUNC +#endif + +#define ZIX_PURE_API \ + ZIX_API \ + ZIX_PURE_FUNC + +#define ZIX_CONST_API \ + ZIX_API \ + ZIX_CONST_FUNC + +#define ZIX_MALLOC_API \ + ZIX_API \ + ZIX_MALLOC_FUNC + +/** @endcond */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __GNUC__ +# define ZIX_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define ZIX_LOG_FUNC(fmt, arg1) +#endif + +// Unused parameter macro to suppresses warnings and make it impossible to use +#if defined(__cplusplus) +# define ZIX_UNUSED(name) +#elif defined(__GNUC__) +# define ZIX_UNUSED(name) name##_unused __attribute__((__unused__)) +#else +# define ZIX_UNUSED(name) name +#endif + +typedef enum { + ZIX_STATUS_SUCCESS, + ZIX_STATUS_ERROR, + ZIX_STATUS_NO_MEM, + ZIX_STATUS_NOT_FOUND, + ZIX_STATUS_EXISTS, + ZIX_STATUS_BAD_ARG, + ZIX_STATUS_BAD_PERMS +} ZixStatus; + +static inline const char* +zix_strerror(const ZixStatus status) +{ + switch (status) { + case ZIX_STATUS_SUCCESS: + return "Success"; + case ZIX_STATUS_ERROR: + return "Unknown error"; + case ZIX_STATUS_NO_MEM: + return "Out of memory"; + case ZIX_STATUS_NOT_FOUND: + return "Not found"; + case ZIX_STATUS_EXISTS: + return "Exists"; + case ZIX_STATUS_BAD_ARG: + return "Bad argument"; + case ZIX_STATUS_BAD_PERMS: + return "Bad permissions"; + } + return "Unknown error"; +} + +/** + Function for comparing two elements. +*/ +typedef int (*ZixComparator)(const void* a, + const void* b, + const void* user_data); + +/** + Function for testing equality of two elements. +*/ +typedef bool (*ZixEqualFunc)(const void* a, const void* b); + +/** + Function to destroy an element. +*/ +typedef void (*ZixDestroyFunc)(void* ptr); + +/** + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_COMMON_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c new file mode 100644 index 00000000..47d27b94 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.c @@ -0,0 +1,141 @@ +/* + Copyright 2012-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "zix/digest.h" + +#ifdef __SSE4_2__ +# include +#endif + +#include +#include + +#ifdef __SSE4_2__ + +// SSE 4.2 CRC32 + +uint32_t +zix_digest_start(void) +{ + return 1; +} + +uint32_t +zix_digest_add(uint32_t hash, const void* const buf, const size_t len) +{ + const uint8_t* str = (const uint8_t*)buf; + +# ifdef __x86_64__ + for (size_t i = 0; i < (len / sizeof(uint64_t)); ++i) { + hash = (uint32_t)_mm_crc32_u64(hash, *(const uint64_t*)str); + str += sizeof(uint64_t); + } + if (len & sizeof(uint32_t)) { + hash = _mm_crc32_u32(hash, *(const uint32_t*)str); + str += sizeof(uint32_t); + } +# else + for (size_t i = 0; i < (len / sizeof(uint32_t)); ++i) { + hash = _mm_crc32_u32(hash, *(const uint32_t*)str); + str += sizeof(uint32_t); + } +# endif + if (len & sizeof(uint16_t)) { + hash = _mm_crc32_u16(hash, *(const uint16_t*)str); + str += sizeof(uint16_t); + } + if (len & sizeof(uint8_t)) { + hash = _mm_crc32_u8(hash, *(const uint8_t*)str); + } + + return hash; +} + +uint32_t +zix_digest_add_64(uint32_t hash, const void* const buf, const size_t len) +{ + assert((uintptr_t)buf % sizeof(uint64_t) == 0); + assert(len % sizeof(uint64_t) == 0); + +# ifdef __x86_64__ + const uint64_t* ptr = (const uint64_t*)buf; + + for (size_t i = 0; i < (len / sizeof(uint64_t)); ++i) { + hash = (uint32_t)_mm_crc32_u64(hash, *ptr); + ++ptr; + } + + return hash; +# else + const uint32_t* ptr = (const uint32_t*)buf; + + for (size_t i = 0; i < (len / sizeof(uint32_t)); ++i) { + hash = _mm_crc32_u32(hash, *ptr); + ++ptr; + } + + return hash; +# endif +} + +uint32_t +zix_digest_add_ptr(const uint32_t hash, const void* const ptr) +{ +# ifdef __x86_64__ + return (uint32_t)_mm_crc32_u64(hash, (uintptr_t)ptr); +# else + return _mm_crc32_u32(hash, (uintptr_t)ptr); +# endif +} + +#else + +// Classic DJB hash + +uint32_t +zix_digest_start(void) +{ + return 5381; +} + +uint32_t +zix_digest_add(uint32_t hash, const void* const buf, const size_t len) +{ + const uint8_t* str = (const uint8_t*)buf; + + for (size_t i = 0; i < len; ++i) { + hash = (hash << 5u) + hash + str[i]; + } + + return hash; +} + +uint32_t +zix_digest_add_64(uint32_t hash, const void* const buf, const size_t len) +{ + assert((uintptr_t)buf % sizeof(uint64_t) == 0); + assert(len % sizeof(uint64_t) == 0); + + return zix_digest_add(hash, buf, len); +} + +uint32_t +zix_digest_add_ptr(const uint32_t hash, const void* const ptr) +{ + return zix_digest_add(hash, &ptr, sizeof(ptr)); +} + +#endif diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h new file mode 100644 index 00000000..1fde77a9 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/digest.h @@ -0,0 +1,67 @@ +/* + Copyright 2012-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef ZIX_DIGEST_H +#define ZIX_DIGEST_H + +#include "zix/common.h" + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Return an initial empty digest value. +*/ +ZIX_CONST_API +uint32_t +zix_digest_start(void); + +/** + Update `hash` to include `buf`, a buffer of `len` bytes. + + This can be used for any size or alignment. +*/ +ZIX_PURE_API +uint32_t +zix_digest_add(uint32_t hash, const void* buf, size_t len); + +/** + Update `hash` to include `buf`, a 64-bit aligned buffer of `len` bytes. + + Both `buf` and `len` must be evenly divisible by 8 (64 bits). +*/ +ZIX_PURE_API +uint32_t +zix_digest_add_64(uint32_t hash, const void* buf, size_t len); + +/** + Update `hash` to include `ptr`. + + This hashes the value of the pointer itself, and does not dereference `ptr`. +*/ +ZIX_CONST_API +uint32_t +zix_digest_add_ptr(uint32_t hash, const void* ptr); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_DIGEST_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c new file mode 100644 index 00000000..81830820 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.c @@ -0,0 +1,230 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "zix/hash.h" + +#include +#include +#include + +/** + Primes, each slightly less than twice its predecessor, and as far away + from powers of two as possible. +*/ +static const unsigned sizes[] = { + 53, 97, 193, 389, 769, 1543, 3079, + 6151, 12289, 24593, 49157, 98317, 196613, 393241, + 786433, 1572869, 3145739, 6291469, 12582917, 25165843, 50331653, + 100663319, 201326611, 402653189, 805306457, 1610612741, 0}; + +typedef struct ZixHashEntry { + struct ZixHashEntry* next; ///< Next entry in bucket + uint32_t hash; ///< Non-modulo hash value + // Value follows here (access with zix_hash_value) +} ZixHashEntry; + +struct ZixHashImpl { + ZixHashFunc hash_func; + ZixEqualFunc equal_func; + ZixHashEntry** buckets; + const unsigned* n_buckets; + size_t value_size; + unsigned count; +}; + +static inline void* +zix_hash_value(ZixHashEntry* entry) +{ + return entry + 1; +} + +ZixHash* +zix_hash_new(ZixHashFunc hash_func, ZixEqualFunc equal_func, size_t value_size) +{ + ZixHash* hash = (ZixHash*)malloc(sizeof(ZixHash)); + if (hash) { + hash->hash_func = hash_func; + hash->equal_func = equal_func; + hash->n_buckets = &sizes[0]; + hash->value_size = value_size; + hash->count = 0; + if (!(hash->buckets = + (ZixHashEntry**)calloc(*hash->n_buckets, sizeof(ZixHashEntry*)))) { + free(hash); + return NULL; + } + } + return hash; +} + +void +zix_hash_free(ZixHash* hash) +{ + if (!hash) { + return; + } + + for (unsigned b = 0; b < *hash->n_buckets; ++b) { + ZixHashEntry* bucket = hash->buckets[b]; + for (ZixHashEntry* e = bucket; e;) { + ZixHashEntry* next = e->next; + free(e); + e = next; + } + } + + free(hash->buckets); + free(hash); +} + +size_t +zix_hash_size(const ZixHash* hash) +{ + return hash->count; +} + +static inline void +insert_entry(ZixHashEntry** bucket, ZixHashEntry* entry) +{ + entry->next = *bucket; + *bucket = entry; +} + +static inline ZixStatus +rehash(ZixHash* hash, unsigned new_n_buckets) +{ + ZixHashEntry** new_buckets = + (ZixHashEntry**)calloc(new_n_buckets, sizeof(ZixHashEntry*)); + if (!new_buckets) { + return ZIX_STATUS_NO_MEM; + } + + const unsigned old_n_buckets = *hash->n_buckets; + for (unsigned b = 0; b < old_n_buckets; ++b) { + for (ZixHashEntry* e = hash->buckets[b]; e;) { + ZixHashEntry* const next = e->next; + const unsigned h = e->hash % new_n_buckets; + insert_entry(&new_buckets[h], e); + e = next; + } + } + + free(hash->buckets); + hash->buckets = new_buckets; + + return ZIX_STATUS_SUCCESS; +} + +static inline ZixHashEntry* +find_entry(const ZixHash* hash, + const void* key, + const unsigned h, + const unsigned h_nomod) +{ + for (ZixHashEntry* e = hash->buckets[h]; e; e = e->next) { + if (e->hash == h_nomod && hash->equal_func(zix_hash_value(e), key)) { + return e; + } + } + return NULL; +} + +void* +zix_hash_find(const ZixHash* hash, const void* value) +{ + const unsigned h_nomod = hash->hash_func(value); + const unsigned h = h_nomod % *hash->n_buckets; + ZixHashEntry* const entry = find_entry(hash, value, h, h_nomod); + return entry ? zix_hash_value(entry) : 0; +} + +ZixStatus +zix_hash_insert(ZixHash* hash, const void* value, void** inserted) +{ + unsigned h_nomod = hash->hash_func(value); + unsigned h = h_nomod % *hash->n_buckets; + + ZixHashEntry* elem = find_entry(hash, value, h, h_nomod); + if (elem) { + assert(elem->hash == h_nomod); + if (inserted) { + *inserted = zix_hash_value(elem); + } + return ZIX_STATUS_EXISTS; + } + + elem = (ZixHashEntry*)malloc(sizeof(ZixHashEntry) + hash->value_size); + if (!elem) { + return ZIX_STATUS_NO_MEM; + } + elem->next = NULL; + elem->hash = h_nomod; + memcpy(elem + 1, value, hash->value_size); + + const unsigned next_n_buckets = *(hash->n_buckets + 1); + if (next_n_buckets != 0 && (hash->count + 1) >= next_n_buckets) { + if (!rehash(hash, next_n_buckets)) { + h = h_nomod % *(++hash->n_buckets); + } + } + + insert_entry(&hash->buckets[h], elem); + ++hash->count; + if (inserted) { + *inserted = zix_hash_value(elem); + } + return ZIX_STATUS_SUCCESS; +} + +ZixStatus +zix_hash_remove(ZixHash* hash, const void* value) +{ + const unsigned h_nomod = hash->hash_func(value); + const unsigned h = h_nomod % *hash->n_buckets; + + ZixHashEntry** next_ptr = &hash->buckets[h]; + for (ZixHashEntry* e = hash->buckets[h]; e; e = e->next) { + if (h_nomod == e->hash && hash->equal_func(zix_hash_value(e), value)) { + *next_ptr = e->next; + free(e); + return ZIX_STATUS_SUCCESS; + } + next_ptr = &e->next; + } + + if (hash->n_buckets != sizes) { + const unsigned prev_n_buckets = *(hash->n_buckets - 1); + if (hash->count - 1 <= prev_n_buckets) { + if (!rehash(hash, prev_n_buckets)) { + --hash->n_buckets; + } + } + } + + --hash->count; + return ZIX_STATUS_NOT_FOUND; +} + +void +zix_hash_foreach(ZixHash* hash, ZixHashVisitFunc f, void* user_data) +{ + for (unsigned b = 0; b < *hash->n_buckets; ++b) { + ZixHashEntry* bucket = hash->buckets[b]; + for (ZixHashEntry* e = bucket; e; e = e->next) { + f(zix_hash_value(e), user_data); + } + } +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h new file mode 100644 index 00000000..39050381 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord/src/zix/hash.h @@ -0,0 +1,138 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef ZIX_HASH_H +#define ZIX_HASH_H + +#include "zix/common.h" + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + @addtogroup zix + @{ + @name Hash + @{ +*/ + +typedef struct ZixHashImpl ZixHash; + +/** + Function for computing the hash of an element. +*/ +typedef uint32_t (*ZixHashFunc)(const void* value); + +/** + Function to visit a hash element. +*/ +typedef void (*ZixHashVisitFunc)(void* value, void* user_data); + +/** + Create a new hash table. + + To minimize space overhead, unlike many hash tables this stores a single + value, not a key and a value. Any size of value can be stored, but all the + values in the hash table must be the same size, and the values must be safe + to copy with memcpy. To get key:value behaviour, simply insert a struct + with a key and value into the hash. + + @param hash_func The hashing function. + @param equal_func A function to test value equality. + @param value_size The size of the values to be stored. +*/ +ZIX_API +ZixHash* +zix_hash_new(ZixHashFunc hash_func, ZixEqualFunc equal_func, size_t value_size); + +/** + Free `hash`. +*/ +ZIX_API +void +zix_hash_free(ZixHash* hash); + +/** + Return the number of elements in `hash`. +*/ +ZIX_PURE_API +size_t +zix_hash_size(const ZixHash* hash); + +/** + Insert an item into `hash`. + + If no matching value is found, ZIX_STATUS_SUCCESS will be returned, and @p + inserted will be pointed to the copy of `value` made in the new hash node. + + If a matching value already exists, ZIX_STATUS_EXISTS will be returned, and + `inserted` will be pointed to the existing value. + + @param hash The hash table. + @param value The value to be inserted. + @param inserted The copy of `value` in the hash table. + @return ZIX_STATUS_SUCCESS, ZIX_STATUS_EXISTS, or ZIX_STATUS_NO_MEM. +*/ +ZIX_API +ZixStatus +zix_hash_insert(ZixHash* hash, const void* value, void** inserted); + +/** + Remove an item from `hash`. + + @param hash The hash table. + @param value The value to remove. + @return ZIX_STATUS_SUCCES or ZIX_STATUS_NOT_FOUND. +*/ +ZIX_API +ZixStatus +zix_hash_remove(ZixHash* hash, const void* value); + +/** + Search for an item in `hash`. + + @param hash The hash table. + @param value The value to search for. +*/ +ZIX_API +void* +zix_hash_find(const ZixHash* hash, const void* value); + +/** + Call `f` on each value in `hash`. + + @param hash The hash table. + @param f The function to call on each value. + @param user_data The user_data parameter passed to `f`. +*/ +ZIX_API +void +zix_hash_foreach(ZixHash* hash, ZixHashVisitFunc f, void* user_data); + +/** + @} + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_HASH_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h b/modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h new file mode 100644 index 00000000..1a3e2865 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sord_config.h @@ -0,0 +1,33 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +/* + Instead of providing a config header per lv2-related library, we put all + of the config in a single file, which is included below. +*/ + +#pragma once + +#include "juce_lv2_config.h" diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sratom/COPYING b/modules/juce_audio_processors/format_types/LV2_SDK/sratom/COPYING new file mode 100644 index 00000000..4d998ccc --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sratom/COPYING @@ -0,0 +1,13 @@ +Copyright 2012-2021 David Robillard + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h b/modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h new file mode 100644 index 00000000..26966ee3 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sratom/sratom/sratom.h @@ -0,0 +1,220 @@ +/* + Copyright 2012-2021 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file sratom.h API for Sratom, an LV2 Atom RDF serialisation library. +*/ + +#ifndef SRATOM_SRATOM_H +#define SRATOM_SRATOM_H + +#include "lv2/atom/atom.h" +#include "lv2/atom/forge.h" +#include "lv2/urid/urid.h" +#include "serd/serd.h" +#include "sord/sord.h" + +#include +#include + +#if defined(_WIN32) && !defined(SRATOM_STATIC) && defined(SRATOM_INTERNAL) +# define SRATOM_API __declspec(dllexport) +#elif defined(_WIN32) && !defined(SRATOM_STATIC) +# define SRATOM_API __declspec(dllimport) +#elif defined(__GNUC__) +# define SRATOM_API __attribute__((visibility("default"))) +#else +# define SRATOM_API +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + @defgroup sratom Sratom + + A library for serialising LV2 Atoms. + + @{ +*/ + +/** + Atom serialiser. +*/ +typedef struct SratomImpl Sratom; + +/** + Mode for reading resources to LV2 Objects. + + This affects how resources (which are either blank nodes or have URIs) are + read by sratom_read(), since they may be read as simple references (a URI or + blank node ID) or a complete description (an atom "Object"). + + Currently, blank nodes are always read as Objects, but support for reading + blank node IDs may be added in the future. +*/ +typedef enum { + /** + Read blank nodes as Objects, and named resources as URIs. + */ + SRATOM_OBJECT_MODE_BLANK, + + /** + Read blank nodes and the main subject as Objects, and any other named + resources as URIs. The "main subject" is the subject parameter passed + to sratom_read(); if this is a resource it will be read as an Object, + but all other named resources encountered will be read as URIs. + */ + SRATOM_OBJECT_MODE_BLANK_SUBJECT +} SratomObjectMode; + +/** + Create a new Atom serialiser. +*/ +SRATOM_API +Sratom* +sratom_new(LV2_URID_Map* map); + +/** + Free an Atom serialisation. +*/ +SRATOM_API +void +sratom_free(Sratom* sratom); + +/** + Set the environment for reading or writing Turtle. + + This can be used to set namespace prefixes and a base URI for + sratom_to_turtle() and sratom_from_turtle(). +*/ +SRATOM_API +void +sratom_set_env(Sratom* sratom, SerdEnv* env); + +/** + Set the sink(s) where sratom will write its output. + + This must be called before calling sratom_write(). +*/ +SRATOM_API +void +sratom_set_sink(Sratom* sratom, + const char* base_uri, + SerdStatementSink sink, + SerdEndSink end_sink, + void* handle); + +/** + Write pretty numeric literals. + + If `pretty_numbers` is true, numbers will be written as pretty Turtle + literals, rather than string literals with precise types. The cost of this + is that the types might get fudged on a round-trip to RDF and back. +*/ +SRATOM_API +void +sratom_set_pretty_numbers(Sratom* sratom, bool pretty_numbers); + +/** + Configure how resources will be read to form LV2 Objects. +*/ +SRATOM_API +void +sratom_set_object_mode(Sratom* sratom, SratomObjectMode object_mode); + +/** + Write an Atom to RDF. + The serialised atom is written to the sink set by sratom_set_sink(). + @return 0 on success, or a non-zero error code otherwise. +*/ +SRATOM_API +int +sratom_write(Sratom* sratom, + LV2_URID_Unmap* unmap, + uint32_t flags, + const SerdNode* subject, + const SerdNode* predicate, + uint32_t type_urid, + uint32_t size, + const void* body); + +/** + Read an Atom from RDF. + The resulting atom will be written to `forge`. +*/ +SRATOM_API +void +sratom_read(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node); + +/** + Serialise an Atom to a Turtle string. + The returned string must be free()'d by the caller. +*/ +SRATOM_API +char* +sratom_to_turtle(Sratom* sratom, + LV2_URID_Unmap* unmap, + const char* base_uri, + const SerdNode* subject, + const SerdNode* predicate, + uint32_t type, + uint32_t size, + const void* body); + +/** + Read an Atom from a Turtle string. + The returned atom must be free()'d by the caller. +*/ +SRATOM_API +LV2_Atom* +sratom_from_turtle(Sratom* sratom, + const char* base_uri, + const SerdNode* subject, + const SerdNode* predicate, + const char* str); + +/** + A convenient resizing sink for LV2_Atom_Forge. + The handle must point to an initialized SerdChunk. +*/ +SRATOM_API +LV2_Atom_Forge_Ref +sratom_forge_sink(LV2_Atom_Forge_Sink_Handle handle, + const void* buf, + uint32_t size); + +/** + The corresponding deref function for sratom_forge_sink. +*/ +SRATOM_API +LV2_Atom* +sratom_forge_deref(LV2_Atom_Forge_Sink_Handle handle, LV2_Atom_Forge_Ref ref); + +/** + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* SRATOM_SRATOM_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c b/modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c new file mode 100644 index 00000000..df743384 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/sratom/src/sratom.c @@ -0,0 +1,919 @@ +/* + Copyright 2012-2021 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "sratom/sratom.h" + +#include "lv2/atom/atom.h" +#include "lv2/atom/forge.h" +#include "lv2/atom/util.h" +#include "lv2/midi/midi.h" +#include "lv2/urid/urid.h" + +#include +#include +#include +#include +#include + +#define NS_RDF (const uint8_t*)"http://www.w3.org/1999/02/22-rdf-syntax-ns#" +#define NS_XSD (const uint8_t*)"http://www.w3.org/2001/XMLSchema#" + +#define USTR(str) ((const uint8_t*)(str)) + +static const SerdStyle style = + (SerdStyle)(SERD_STYLE_ABBREVIATED | SERD_STYLE_RESOLVED | SERD_STYLE_CURIED); + +typedef enum { MODE_SUBJECT, MODE_BODY, MODE_SEQUENCE } ReadMode; + +struct SratomImpl { + LV2_URID_Map* map; + LV2_Atom_Forge forge; + SerdEnv* env; + SerdNode base_uri; + SerdURI base; + SerdStatementSink write_statement; + SerdEndSink end_anon; + void* handle; + LV2_URID atom_Event; + LV2_URID atom_frameTime; + LV2_URID atom_beatTime; + LV2_URID midi_MidiEvent; + unsigned next_id; + SratomObjectMode object_mode; + uint32_t seq_unit; + struct { + SordNode* atom_childType; + SordNode* atom_frameTime; + SordNode* atom_beatTime; + SordNode* rdf_first; + SordNode* rdf_rest; + SordNode* rdf_type; + SordNode* rdf_value; + SordNode* xsd_base64Binary; + } nodes; + + bool pretty_numbers; +}; + +static void +read_node(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node, + ReadMode mode); + +Sratom* +sratom_new(LV2_URID_Map* map) +{ + Sratom* sratom = (Sratom*)calloc(1, sizeof(Sratom)); + if (sratom) { + sratom->map = map; + sratom->atom_Event = map->map(map->handle, LV2_ATOM__Event); + sratom->atom_frameTime = map->map(map->handle, LV2_ATOM__frameTime); + sratom->atom_beatTime = map->map(map->handle, LV2_ATOM__beatTime); + sratom->midi_MidiEvent = map->map(map->handle, LV2_MIDI__MidiEvent); + sratom->object_mode = SRATOM_OBJECT_MODE_BLANK; + lv2_atom_forge_init(&sratom->forge, map); + } + return sratom; +} + +void +sratom_free(Sratom* sratom) +{ + if (sratom) { + serd_node_free(&sratom->base_uri); + free(sratom); + } +} + +void +sratom_set_env(Sratom* sratom, SerdEnv* env) +{ + sratom->env = env; +} + +void +sratom_set_sink(Sratom* sratom, + const char* base_uri, + SerdStatementSink sink, + SerdEndSink end_sink, + void* handle) +{ + if (base_uri) { + serd_node_free(&sratom->base_uri); + sratom->base_uri = + serd_node_new_uri_from_string(USTR(base_uri), NULL, NULL); + serd_uri_parse(sratom->base_uri.buf, &sratom->base); + } + sratom->write_statement = sink; + sratom->end_anon = end_sink; + sratom->handle = handle; +} + +void +sratom_set_pretty_numbers(Sratom* sratom, bool pretty_numbers) +{ + sratom->pretty_numbers = pretty_numbers; +} + +void +sratom_set_object_mode(Sratom* sratom, SratomObjectMode object_mode) +{ + sratom->object_mode = object_mode; +} + +static void +gensym(SerdNode* out, char c, unsigned num) +{ + out->n_bytes = out->n_chars = snprintf((char*)out->buf, 10, "%c%u", c, num); +} + +static void +list_append(Sratom* sratom, + LV2_URID_Unmap* unmap, + unsigned* flags, + SerdNode* s, + SerdNode* p, + SerdNode* node, + uint32_t size, + uint32_t type, + const void* body) +{ + // Generate a list node + gensym(node, 'l', sratom->next_id); + sratom->write_statement(sratom->handle, *flags, NULL, s, p, node, NULL, NULL); + + // _:node rdf:first value + *flags = SERD_LIST_CONT; + *p = serd_node_from_string(SERD_URI, NS_RDF "first"); + sratom_write(sratom, unmap, *flags, node, p, type, size, body); + + // Set subject to node and predicate to rdf:rest for next time + gensym(node, 'l', ++sratom->next_id); + *s = *node; + *p = serd_node_from_string(SERD_URI, NS_RDF "rest"); +} + +static void +list_end(SerdStatementSink sink, + void* handle, + const unsigned flags, + SerdNode* s, + SerdNode* p) +{ + // _:node rdf:rest rdf:nil + const SerdNode nil = serd_node_from_string(SERD_URI, NS_RDF "nil"); + sink(handle, flags, NULL, s, p, &nil, NULL, NULL); +} + +static void +start_object(Sratom* sratom, + uint32_t* flags, + const SerdNode* subject, + const SerdNode* predicate, + const SerdNode* node, + const char* type) +{ + if (subject && predicate) { + sratom->write_statement(sratom->handle, + *flags | SERD_ANON_O_BEGIN, + NULL, + subject, + predicate, + node, + NULL, + NULL); + // Start abbreviating object properties + *flags |= SERD_ANON_CONT; + + // Object is in a list, stop list abbreviating if necessary + *flags &= ~SERD_LIST_CONT; + } + + if (type) { + SerdNode p = serd_node_from_string(SERD_URI, NS_RDF "type"); + SerdNode o = serd_node_from_string(SERD_URI, USTR(type)); + sratom->write_statement( + sratom->handle, *flags, NULL, node, &p, &o, NULL, NULL); + } +} + +static bool +path_is_absolute(const char* path) +{ + return (path[0] == '/' || (isalpha(path[0]) && path[1] == ':' && + (path[2] == '/' || path[2] == '\\'))); +} + +static SerdNode +number_type(const Sratom* sratom, const uint8_t* type) +{ + if (sratom->pretty_numbers && + (!strcmp((const char*)type, (const char*)NS_XSD "int") || + !strcmp((const char*)type, (const char*)NS_XSD "long"))) { + return serd_node_from_string(SERD_URI, NS_XSD "integer"); + } + + if (sratom->pretty_numbers && + (!strcmp((const char*)type, (const char*)NS_XSD "float") || + !strcmp((const char*)type, (const char*)NS_XSD "double"))) { + return serd_node_from_string(SERD_URI, NS_XSD "decimal"); + } + + return serd_node_from_string(SERD_URI, type); +} + +int +sratom_write(Sratom* sratom, + LV2_URID_Unmap* unmap, + uint32_t flags, + const SerdNode* subject, + const SerdNode* predicate, + uint32_t type_urid, + uint32_t size, + const void* body) +{ + const char* const type = unmap->unmap(unmap->handle, type_urid); + uint8_t idbuf[12] = "b0000000000"; + SerdNode id = serd_node_from_string(SERD_BLANK, idbuf); + uint8_t nodebuf[12] = "b0000000000"; + SerdNode node = serd_node_from_string(SERD_BLANK, nodebuf); + SerdNode object = SERD_NODE_NULL; + SerdNode datatype = SERD_NODE_NULL; + SerdNode language = SERD_NODE_NULL; + bool new_node = false; + if (type_urid == 0 && size == 0) { + object = serd_node_from_string(SERD_URI, USTR(NS_RDF "nil")); + } else if (type_urid == sratom->forge.String) { + object = serd_node_from_string(SERD_LITERAL, (const uint8_t*)body); + } else if (type_urid == sratom->forge.Chunk) { + datatype = serd_node_from_string(SERD_URI, NS_XSD "base64Binary"); + object = serd_node_new_blob(body, size, true); + new_node = true; + } else if (type_urid == sratom->forge.Literal) { + const LV2_Atom_Literal_Body* lit = (const LV2_Atom_Literal_Body*)body; + const uint8_t* str = USTR(lit + 1); + + object = serd_node_from_string(SERD_LITERAL, str); + if (lit->datatype) { + datatype = serd_node_from_string( + SERD_URI, USTR(unmap->unmap(unmap->handle, lit->datatype))); + } else if (lit->lang) { + const char* lang = unmap->unmap(unmap->handle, lit->lang); + const char* prefix = "http://lexvo.org/id/iso639-3/"; + const size_t prefix_len = strlen(prefix); + if (lang && !strncmp(lang, prefix, prefix_len)) { + language = serd_node_from_string(SERD_LITERAL, USTR(lang + prefix_len)); + } else { + fprintf(stderr, "Unknown language URID %u\n", lit->lang); + } + } + } else if (type_urid == sratom->forge.URID) { + const uint32_t urid = *(const uint32_t*)body; + const uint8_t* str = USTR(unmap->unmap(unmap->handle, urid)); + + object = serd_node_from_string(SERD_URI, str); + } else if (type_urid == sratom->forge.Path) { + const uint8_t* str = USTR(body); + if (path_is_absolute((const char*)str)) { + new_node = true; + object = serd_node_new_file_uri(str, NULL, NULL, true); + } else { + if (!sratom->base_uri.buf || + strncmp((const char*)sratom->base_uri.buf, "file://", 7)) { + fprintf(stderr, "warning: Relative path but base is not a file URI.\n"); + fprintf(stderr, "warning: Writing ambiguous atom:Path literal.\n"); + object = serd_node_from_string(SERD_LITERAL, str); + datatype = serd_node_from_string(SERD_URI, USTR(LV2_ATOM__Path)); + } else { + new_node = true; + SerdNode rel = serd_node_new_file_uri(str, NULL, NULL, true); + object = serd_node_new_uri_from_node(&rel, &sratom->base, NULL); + serd_node_free(&rel); + } + } + } else if (type_urid == sratom->forge.URI) { + object = serd_node_from_string(SERD_URI, USTR(body)); + } else if (type_urid == sratom->forge.Int) { + new_node = true; + object = serd_node_new_integer(*(const int32_t*)body); + datatype = number_type(sratom, NS_XSD "int"); + } else if (type_urid == sratom->forge.Long) { + new_node = true; + object = serd_node_new_integer(*(const int64_t*)body); + datatype = number_type(sratom, NS_XSD "long"); + } else if (type_urid == sratom->forge.Float) { + new_node = true; + object = serd_node_new_decimal(*(const float*)body, 8); + datatype = number_type(sratom, NS_XSD "float"); + } else if (type_urid == sratom->forge.Double) { + new_node = true; + object = serd_node_new_decimal(*(const double*)body, 16); + datatype = number_type(sratom, NS_XSD "double"); + } else if (type_urid == sratom->forge.Bool) { + const int32_t val = *(const int32_t*)body; + + datatype = serd_node_from_string(SERD_URI, NS_XSD "boolean"); + object = serd_node_from_string(SERD_LITERAL, USTR(val ? "true" : "false")); + } else if (type_urid == sratom->midi_MidiEvent) { + new_node = true; + datatype = serd_node_from_string(SERD_URI, USTR(LV2_MIDI__MidiEvent)); + + uint8_t* str = (uint8_t*)calloc(size * 2 + 1, 1); + for (uint32_t i = 0; i < size; ++i) { + snprintf((char*)str + (2 * i), + size * 2 + 1, + "%02X", + (unsigned)*((const uint8_t*)body + i)); + } + object = serd_node_from_string(SERD_LITERAL, USTR(str)); + } else if (type_urid == sratom->atom_Event) { + const LV2_Atom_Event* ev = (const LV2_Atom_Event*)body; + gensym(&id, 'e', sratom->next_id++); + start_object(sratom, &flags, subject, predicate, &id, NULL); + SerdNode time; + SerdNode p; + if (sratom->seq_unit == sratom->atom_beatTime) { + time = serd_node_new_decimal(ev->time.beats, 16); + p = serd_node_from_string(SERD_URI, USTR(LV2_ATOM__beatTime)); + datatype = number_type(sratom, NS_XSD "double"); + } else { + time = serd_node_new_integer(ev->time.frames); + p = serd_node_from_string(SERD_URI, USTR(LV2_ATOM__frameTime)); + datatype = number_type(sratom, NS_XSD "long"); + } + sratom->write_statement(sratom->handle, + SERD_ANON_CONT, + NULL, + &id, + &p, + &time, + &datatype, + &language); + serd_node_free(&time); + + p = serd_node_from_string(SERD_URI, NS_RDF "value"); + sratom_write(sratom, + unmap, + SERD_ANON_CONT, + &id, + &p, + ev->body.type, + ev->body.size, + LV2_ATOM_BODY(&ev->body)); + if (sratom->end_anon) { + sratom->end_anon(sratom->handle, &id); + } + } else if (type_urid == sratom->forge.Tuple) { + gensym(&id, 't', sratom->next_id++); + start_object(sratom, &flags, subject, predicate, &id, type); + SerdNode p = serd_node_from_string(SERD_URI, NS_RDF "value"); + flags |= SERD_LIST_O_BEGIN; + LV2_ATOM_TUPLE_BODY_FOREACH (body, size, i) { + list_append(sratom, + unmap, + &flags, + &id, + &p, + &node, + i->size, + i->type, + LV2_ATOM_BODY(i)); + } + list_end(sratom->write_statement, sratom->handle, flags, &id, &p); + if (sratom->end_anon) { + sratom->end_anon(sratom->handle, &id); + } + } else if (type_urid == sratom->forge.Vector) { + const LV2_Atom_Vector_Body* vec = (const LV2_Atom_Vector_Body*)body; + gensym(&id, 'v', sratom->next_id++); + start_object(sratom, &flags, subject, predicate, &id, type); + SerdNode p = + serd_node_from_string(SERD_URI, (const uint8_t*)LV2_ATOM__childType); + SerdNode child_type = serd_node_from_string( + SERD_URI, (const uint8_t*)unmap->unmap(unmap->handle, vec->child_type)); + sratom->write_statement( + sratom->handle, flags, NULL, &id, &p, &child_type, NULL, NULL); + p = serd_node_from_string(SERD_URI, NS_RDF "value"); + flags |= SERD_LIST_O_BEGIN; + for (const char* i = (const char*)(vec + 1); i < (const char*)vec + size; + i += vec->child_size) { + list_append(sratom, + unmap, + &flags, + &id, + &p, + &node, + vec->child_size, + vec->child_type, + i); + } + list_end(sratom->write_statement, sratom->handle, flags, &id, &p); + if (sratom->end_anon) { + sratom->end_anon(sratom->handle, &id); + } + } else if (lv2_atom_forge_is_object_type(&sratom->forge, type_urid)) { + const LV2_Atom_Object_Body* obj = (const LV2_Atom_Object_Body*)body; + const char* otype = unmap->unmap(unmap->handle, obj->otype); + + if (lv2_atom_forge_is_blank(&sratom->forge, type_urid, obj)) { + gensym(&id, 'b', sratom->next_id++); + start_object(sratom, &flags, subject, predicate, &id, otype); + } else { + id = serd_node_from_string( + SERD_URI, (const uint8_t*)unmap->unmap(unmap->handle, obj->id)); + flags = 0; + start_object(sratom, &flags, NULL, NULL, &id, otype); + } + LV2_ATOM_OBJECT_BODY_FOREACH (obj, size, prop) { + const char* const key = unmap->unmap(unmap->handle, prop->key); + SerdNode pred = serd_node_from_string(SERD_URI, USTR(key)); + sratom_write(sratom, + unmap, + flags, + &id, + &pred, + prop->value.type, + prop->value.size, + LV2_ATOM_BODY(&prop->value)); + } + if (sratom->end_anon && (flags & SERD_ANON_CONT)) { + sratom->end_anon(sratom->handle, &id); + } + } else if (type_urid == sratom->forge.Sequence) { + const LV2_Atom_Sequence_Body* seq = (const LV2_Atom_Sequence_Body*)body; + gensym(&id, 'v', sratom->next_id++); + start_object(sratom, &flags, subject, predicate, &id, type); + SerdNode p = serd_node_from_string(SERD_URI, NS_RDF "value"); + flags |= SERD_LIST_O_BEGIN; + LV2_ATOM_SEQUENCE_BODY_FOREACH (seq, size, ev) { + sratom->seq_unit = seq->unit; + list_append(sratom, + unmap, + &flags, + &id, + &p, + &node, + sizeof(LV2_Atom_Event) + ev->body.size, + sratom->atom_Event, + ev); + } + list_end(sratom->write_statement, sratom->handle, flags, &id, &p); + if (sratom->end_anon && subject && predicate) { + sratom->end_anon(sratom->handle, &id); + } + } else { + gensym(&id, 'b', sratom->next_id++); + start_object(sratom, &flags, subject, predicate, &id, type); + SerdNode p = serd_node_from_string(SERD_URI, NS_RDF "value"); + SerdNode o = serd_node_new_blob(body, size, true); + datatype = serd_node_from_string(SERD_URI, NS_XSD "base64Binary"); + sratom->write_statement( + sratom->handle, flags, NULL, &id, &p, &o, &datatype, NULL); + if (sratom->end_anon && subject && predicate) { + sratom->end_anon(sratom->handle, &id); + } + serd_node_free(&o); + } + + if (object.buf) { + SerdNode def_s = serd_node_from_string(SERD_BLANK, USTR("atom")); + SerdNode def_p = serd_node_from_string(SERD_URI, USTR(NS_RDF "value")); + + if (!subject) { + subject = &def_s; + } + + if (!predicate) { + predicate = &def_p; + } + + sratom->write_statement(sratom->handle, + flags, + NULL, + subject, + predicate, + &object, + &datatype, + &language); + } + + if (new_node) { + serd_node_free(&object); + } + + return 0; +} + +char* +sratom_to_turtle(Sratom* sratom, + LV2_URID_Unmap* unmap, + const char* base_uri, + const SerdNode* subject, + const SerdNode* predicate, + uint32_t type, + uint32_t size, + const void* body) +{ + SerdURI buri = SERD_URI_NULL; + SerdNode base = + serd_node_new_uri_from_string(USTR(base_uri), &sratom->base, &buri); + SerdEnv* env = sratom->env ? sratom->env : serd_env_new(NULL); + SerdChunk str = {NULL, 0}; + SerdWriter* writer = + serd_writer_new(SERD_TURTLE, style, env, &buri, serd_chunk_sink, &str); + + serd_env_set_base_uri(env, &base); + sratom_set_sink(sratom, + base_uri, + (SerdStatementSink)serd_writer_write_statement, + (SerdEndSink)serd_writer_end_anon, + writer); + sratom_write( + sratom, unmap, SERD_EMPTY_S, subject, predicate, type, size, body); + serd_writer_finish(writer); + + serd_writer_free(writer); + if (!sratom->env) { + serd_env_free(env); + } + + serd_node_free(&base); + return (char*)serd_chunk_sink_finish(&str); +} + +static void +read_list_value(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node, + ReadMode mode) +{ + SordNode* fst = sord_get(model, node, sratom->nodes.rdf_first, NULL, NULL); + SordNode* rst = sord_get(model, node, sratom->nodes.rdf_rest, NULL, NULL); + if (fst && rst) { + read_node(sratom, forge, world, model, fst, mode); + read_list_value(sratom, forge, world, model, rst, mode); + } + + sord_node_free(world, rst); + sord_node_free(world, fst); +} + +static void +read_resource(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node, + LV2_URID otype) +{ + LV2_URID_Map* map = sratom->map; + SordQuad q = {node, NULL, NULL, NULL}; + SordIter* i = sord_find(model, q); + SordQuad match; + for (; !sord_iter_end(i); sord_iter_next(i)) { + sord_iter_get(i, match); + const SordNode* p = match[SORD_PREDICATE]; + const SordNode* o = match[SORD_OBJECT]; + const char* p_uri = (const char*)sord_node_get_string(p); + uint32_t p_urid = map->map(map->handle, p_uri); + if (!(sord_node_equals(p, sratom->nodes.rdf_type) && + sord_node_get_type(o) == SORD_URI && + map->map(map->handle, (const char*)sord_node_get_string(o)) == + otype)) { + lv2_atom_forge_key(forge, p_urid); + read_node(sratom, forge, world, model, o, MODE_BODY); + } + } + sord_iter_free(i); +} + +static uint32_t +atom_size(Sratom* sratom, uint32_t type_urid) +{ + if (type_urid == sratom->forge.Int || type_urid == sratom->forge.Bool) { + return sizeof(int32_t); + } + + if (type_urid == sratom->forge.Long) { + return sizeof(int64_t); + } + + if (type_urid == sratom->forge.Float) { + return sizeof(float); + } + + if (type_urid == sratom->forge.Double) { + return sizeof(double); + } + + if (type_urid == sratom->forge.URID) { + return sizeof(uint32_t); + } + + return 0; +} + +static void +read_literal(Sratom* sratom, LV2_Atom_Forge* forge, const SordNode* node) +{ + assert(sord_node_get_type(node) == SORD_LITERAL); + + size_t len = 0; + const char* str = (const char*)sord_node_get_string_counted(node, &len); + SordNode* datatype = sord_node_get_datatype(node); + const char* language = sord_node_get_language(node); + if (datatype) { + const char* type_uri = (const char*)sord_node_get_string(datatype); + if (!strcmp(type_uri, (const char*)NS_XSD "int") || + !strcmp(type_uri, (const char*)NS_XSD "integer")) { + lv2_atom_forge_int(forge, strtol(str, NULL, 10)); + } else if (!strcmp(type_uri, (const char*)NS_XSD "long")) { + lv2_atom_forge_long(forge, strtol(str, NULL, 10)); + } else if (!strcmp(type_uri, (const char*)NS_XSD "float") || + !strcmp(type_uri, (const char*)NS_XSD "decimal")) { + lv2_atom_forge_float(forge, (float)serd_strtod(str, NULL)); + } else if (!strcmp(type_uri, (const char*)NS_XSD "double")) { + lv2_atom_forge_double(forge, serd_strtod(str, NULL)); + } else if (!strcmp(type_uri, (const char*)NS_XSD "boolean")) { + lv2_atom_forge_bool(forge, !strcmp(str, "true")); + } else if (!strcmp(type_uri, (const char*)NS_XSD "base64Binary")) { + size_t size = 0; + void* body = serd_base64_decode(USTR(str), len, &size); + lv2_atom_forge_atom(forge, size, forge->Chunk); + lv2_atom_forge_write(forge, body, size); + free(body); + } else if (!strcmp(type_uri, LV2_ATOM__Path)) { + lv2_atom_forge_path(forge, str, len); + } else if (!strcmp(type_uri, LV2_MIDI__MidiEvent)) { + lv2_atom_forge_atom(forge, len / 2, sratom->midi_MidiEvent); + for (const char* s = str; s < str + len; s += 2) { + unsigned num = 0u; + sscanf(s, "%2X", &num); + const uint8_t c = num; + lv2_atom_forge_raw(forge, &c, 1); + } + lv2_atom_forge_pad(forge, len / 2); + } else { + lv2_atom_forge_literal( + forge, str, len, sratom->map->map(sratom->map->handle, type_uri), 0); + } + } else if (language) { + const char* prefix = "http://lexvo.org/id/iso639-3/"; + const size_t lang_len = strlen(prefix) + strlen(language); + char* lang_uri = (char*)calloc(lang_len + 1, 1); + snprintf(lang_uri, lang_len + 1, "%s%s", prefix, language); + lv2_atom_forge_literal( + forge, str, len, 0, sratom->map->map(sratom->map->handle, lang_uri)); + free(lang_uri); + } else { + lv2_atom_forge_string(forge, str, len); + } +} + +static void +read_object(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node, + ReadMode mode) +{ + LV2_URID_Map* map = sratom->map; + size_t len = 0; + const char* str = (const char*)sord_node_get_string_counted(node, &len); + + SordNode* type = sord_get(model, node, sratom->nodes.rdf_type, NULL, NULL); + SordNode* value = sord_get(model, node, sratom->nodes.rdf_value, NULL, NULL); + + const uint8_t* type_uri = NULL; + uint32_t type_urid = 0; + if (type) { + type_uri = sord_node_get_string(type); + type_urid = map->map(map->handle, (const char*)type_uri); + } + + LV2_Atom_Forge_Frame frame = {0, 0}; + if (mode == MODE_SEQUENCE) { + SordNode* time = + sord_get(model, node, sratom->nodes.atom_beatTime, NULL, NULL); + uint32_t seq_unit = 0u; + if (time) { + const char* time_str = (const char*)sord_node_get_string(time); + lv2_atom_forge_beat_time(forge, serd_strtod(time_str, NULL)); + seq_unit = sratom->atom_beatTime; + } else { + time = sord_get(model, node, sratom->nodes.atom_frameTime, NULL, NULL); + const char* time_str = + time ? (const char*)sord_node_get_string(time) : ""; + lv2_atom_forge_frame_time(forge, serd_strtod(time_str, NULL)); + seq_unit = sratom->atom_frameTime; + } + read_node(sratom, forge, world, model, value, MODE_BODY); + sord_node_free(world, time); + sratom->seq_unit = seq_unit; + } else if (type_urid == sratom->forge.Tuple) { + lv2_atom_forge_tuple(forge, &frame); + read_list_value(sratom, forge, world, model, value, MODE_BODY); + } else if (type_urid == sratom->forge.Sequence) { + const LV2_Atom_Forge_Ref ref = + lv2_atom_forge_sequence_head(forge, &frame, 0); + sratom->seq_unit = 0; + read_list_value(sratom, forge, world, model, value, MODE_SEQUENCE); + + LV2_Atom_Sequence* seq = + (LV2_Atom_Sequence*)lv2_atom_forge_deref(forge, ref); + seq->body.unit = + (sratom->seq_unit == sratom->atom_frameTime) ? 0 : sratom->seq_unit; + } else if (type_urid == sratom->forge.Vector) { + SordNode* child_type_node = + sord_get(model, node, sratom->nodes.atom_childType, NULL, NULL); + uint32_t child_type = + map->map(map->handle, (const char*)sord_node_get_string(child_type_node)); + uint32_t child_size = atom_size(sratom, child_type); + if (child_size > 0) { + LV2_Atom_Forge_Ref ref = + lv2_atom_forge_vector_head(forge, &frame, child_size, child_type); + read_list_value(sratom, forge, world, model, value, MODE_BODY); + lv2_atom_forge_pop(forge, &frame); + frame.ref = 0; + lv2_atom_forge_pad(forge, lv2_atom_forge_deref(forge, ref)->size); + } + sord_node_free(world, child_type_node); + } else if (value && sord_node_equals(sord_node_get_datatype(value), + sratom->nodes.xsd_base64Binary)) { + size_t vlen = 0; + const uint8_t* vstr = sord_node_get_string_counted(value, &vlen); + size_t size = 0; + void* body = serd_base64_decode(vstr, vlen, &size); + lv2_atom_forge_atom(forge, size, type_urid); + lv2_atom_forge_write(forge, body, size); + free(body); + } else if (sord_node_get_type(node) == SORD_URI) { + lv2_atom_forge_object(forge, &frame, map->map(map->handle, str), type_urid); + read_resource(sratom, forge, world, model, node, type_urid); + } else { + lv2_atom_forge_object(forge, &frame, 0, type_urid); + read_resource(sratom, forge, world, model, node, type_urid); + } + + if (frame.ref) { + lv2_atom_forge_pop(forge, &frame); + } + sord_node_free(world, value); + sord_node_free(world, type); +} + +static void +read_node(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node, + ReadMode mode) +{ + LV2_URID_Map* map = sratom->map; + size_t len = 0; + const char* str = (const char*)sord_node_get_string_counted(node, &len); + if (sord_node_get_type(node) == SORD_LITERAL) { + read_literal(sratom, forge, node); + } else if (sord_node_get_type(node) == SORD_URI && + !(sratom->object_mode == SRATOM_OBJECT_MODE_BLANK_SUBJECT && + mode == MODE_SUBJECT)) { + if (!strcmp(str, (const char*)NS_RDF "nil")) { + lv2_atom_forge_atom(forge, 0, 0); + } else if (!strncmp(str, "file://", 7)) { + SerdURI uri; + serd_uri_parse((const uint8_t*)str, &uri); + + SerdNode rel = + serd_node_new_relative_uri(&uri, &sratom->base, NULL, NULL); + uint8_t* path = serd_file_uri_parse(rel.buf, NULL); + if (path) { + lv2_atom_forge_path( + forge, (const char*)path, strlen((const char*)path)); + serd_free(path); + } else { + // FIXME: Report errors (required API change) + lv2_atom_forge_atom(forge, 0, 0); + } + serd_node_free(&rel); + } else { + lv2_atom_forge_urid(forge, map->map(map->handle, str)); + } + } else { + read_object(sratom, forge, world, model, node, mode); + } +} + +void +sratom_read(Sratom* sratom, + LV2_Atom_Forge* forge, + SordWorld* world, + SordModel* model, + const SordNode* node) +{ + sratom->nodes.atom_childType = sord_new_uri(world, USTR(LV2_ATOM__childType)); + sratom->nodes.atom_frameTime = sord_new_uri(world, USTR(LV2_ATOM__frameTime)); + sratom->nodes.atom_beatTime = sord_new_uri(world, USTR(LV2_ATOM__beatTime)); + sratom->nodes.rdf_first = sord_new_uri(world, NS_RDF "first"); + sratom->nodes.rdf_rest = sord_new_uri(world, NS_RDF "rest"); + sratom->nodes.rdf_type = sord_new_uri(world, NS_RDF "type"); + sratom->nodes.rdf_value = sord_new_uri(world, NS_RDF "value"); + sratom->nodes.xsd_base64Binary = sord_new_uri(world, NS_XSD "base64Binary"); + + sratom->next_id = 1; + read_node(sratom, forge, world, model, node, MODE_SUBJECT); + + sord_node_free(world, sratom->nodes.xsd_base64Binary); + sord_node_free(world, sratom->nodes.rdf_value); + sord_node_free(world, sratom->nodes.rdf_type); + sord_node_free(world, sratom->nodes.rdf_rest); + sord_node_free(world, sratom->nodes.rdf_first); + sord_node_free(world, sratom->nodes.atom_frameTime); + sord_node_free(world, sratom->nodes.atom_beatTime); + sord_node_free(world, sratom->nodes.atom_childType); + memset(&sratom->nodes, 0, sizeof(sratom->nodes)); +} + +LV2_Atom_Forge_Ref +sratom_forge_sink(LV2_Atom_Forge_Sink_Handle handle, + const void* buf, + uint32_t size) +{ + SerdChunk* chunk = (SerdChunk*)handle; + const LV2_Atom_Forge_Ref ref = chunk->len + 1; + serd_chunk_sink(buf, size, chunk); + return ref; +} + +LV2_Atom* +sratom_forge_deref(LV2_Atom_Forge_Sink_Handle handle, LV2_Atom_Forge_Ref ref) +{ + SerdChunk* chunk = (SerdChunk*)handle; + return (LV2_Atom*)(chunk->buf + ref - 1); +} + +LV2_Atom* +sratom_from_turtle(Sratom* sratom, + const char* base_uri, + const SerdNode* subject, + const SerdNode* predicate, + const char* str) +{ + SerdChunk out = {NULL, 0}; + SerdNode base = + serd_node_new_uri_from_string(USTR(base_uri), &sratom->base, NULL); + SordWorld* world = sord_world_new(); + SordModel* model = sord_new(world, SORD_SPO, false); + SerdEnv* env = sratom->env ? sratom->env : serd_env_new(&base); + SerdReader* reader = sord_new_reader(model, env, SERD_TURTLE, NULL); + + if (!serd_reader_read_string(reader, (const uint8_t*)str)) { + SordNode* s = sord_node_from_serd_node(world, env, subject, 0, 0); + lv2_atom_forge_set_sink( + &sratom->forge, sratom_forge_sink, sratom_forge_deref, &out); + if (subject && predicate) { + SordNode* p = sord_node_from_serd_node(world, env, predicate, 0, 0); + SordNode* o = sord_get(model, s, p, NULL, NULL); + if (o) { + sratom_read(sratom, &sratom->forge, world, model, o); + sord_node_free(world, o); + } else { + fprintf(stderr, "Failed to find node\n"); + } + } else { + sratom_read(sratom, &sratom->forge, world, model, s); + } + } else { + fprintf(stderr, "Failed to read Turtle\n"); + } + + serd_reader_free(reader); + if (!sratom->env) { + serd_env_free(env); + } + + sord_free(model); + sord_world_free(world); + serd_node_free(&base); + + return (LV2_Atom*)out.buf; +} diff --git a/modules/juce_audio_processors/format_types/juce_ARACommon.cpp b/modules/juce_audio_processors/format_types/juce_ARACommon.cpp new file mode 100644 index 00000000..d118366f --- /dev/null +++ b/modules/juce_audio_processors/format_types/juce_ARACommon.cpp @@ -0,0 +1,76 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS)) + +#include + +namespace juce +{ + +static void dummyARAInterfaceAssert (ARA::ARAAssertCategory, const void*, const char*) +{} + +static ARA::ARAInterfaceConfiguration createInterfaceConfig (const ARA::ARAFactory* araFactory) +{ + static auto* assertFunction = &dummyARAInterfaceAssert; + + #if ARA_VALIDATE_API_CALLS + assertFunction = &::ARA::ARAInterfaceAssert; + static std::once_flag flag; + std::call_once (flag, [] { ARA::ARASetExternalAssertReference (&assertFunction); }); + #endif + + return makeARASizedStruct (&ARA::ARAInterfaceConfiguration::assertFunctionAddress, + jmin (araFactory->highestSupportedApiGeneration, (ARA::ARAAPIGeneration) ARA::kARAAPIGeneration_2_X_Draft), + &assertFunction); +} + +static std::shared_ptr getOrCreateARAFactory (const ARA::ARAFactory* ptr, + std::function onDelete) +{ + JUCE_ASSERT_MESSAGE_THREAD + + static std::unordered_map> cache; + + auto& cachePtr = cache[ptr]; + + if (const auto obj = cachePtr.lock()) + return obj; + + const auto interfaceConfig = createInterfaceConfig (ptr); + ptr->initializeARAWithConfiguration (&interfaceConfig); + const auto obj = std::shared_ptr (ptr, [deleter = std::move (onDelete)] (const ARA::ARAFactory* factory) + { + factory->uninitializeARA(); + deleter (factory); + }); + cachePtr = obj; + return obj; +} + +} + +#endif diff --git a/modules/juce_audio_processors/format_types/juce_ARACommon.h b/modules/juce_audio_processors/format_types/juce_ARACommon.h new file mode 100644 index 00000000..4811733b --- /dev/null +++ b/modules/juce_audio_processors/format_types/juce_ARACommon.h @@ -0,0 +1,85 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#pragma once + +namespace ARA +{ + struct ARAFactory; +} + +namespace juce +{ + +/** Encapsulates an ARAFactory pointer and makes sure that it remains in a valid state + for the lifetime of the ARAFactoryWrapper object. + + @tags{ARA} +*/ +class ARAFactoryWrapper +{ +public: + ARAFactoryWrapper() = default; + + /** @internal + + Used by the framework to encapsulate ARAFactory pointers loaded from plugins. + */ + explicit ARAFactoryWrapper (std::shared_ptr factoryIn) : factory (std::move (factoryIn)) {} + + /** Returns the contained ARAFactory pointer, which can be a nullptr. + + The validity of the returned pointer is only guaranteed for the lifetime of this wrapper. + */ + const ARA::ARAFactory* get() const noexcept { return factory.get(); } + +private: + std::shared_ptr factory; +}; + +/** Represents the result of AudioPluginFormatManager::createARAFactoryAsync(). + + If the operation fails then #araFactory will contain `nullptr`, and #errorMessage may + contain a reason for the failure. + + The araFactory member ensures that the module necessary for the correct functioning + of the factory will remain loaded. + + @tags{ARA} +*/ +struct ARAFactoryResult +{ + ARAFactoryWrapper araFactory; + String errorMessage; +}; + +template +constexpr Obj makeARASizedStruct (Member Obj::* member, Ts&&... ts) +{ + return { reinterpret_cast (&(static_cast (nullptr)->*member)) + sizeof (Member), + std::forward (ts)... }; +} + +} // namespace juce diff --git a/modules/juce_audio_processors/format_types/juce_ARAHosting.cpp b/modules/juce_audio_processors/format_types/juce_ARAHosting.cpp new file mode 100644 index 00000000..d406ffd2 --- /dev/null +++ b/modules/juce_audio_processors/format_types/juce_ARAHosting.cpp @@ -0,0 +1,458 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS)) + +#include "juce_ARAHosting.h" +#include + +#include + +namespace juce +{ +struct ARAEditGuardState +{ +public: + /* Returns true if this controller wasn't previously present. */ + bool add (ARA::Host::DocumentController& dc) + { + const std::lock_guard lock (mutex); + return ++counts[&dc] == 1; + } + + /* Returns true if this controller is no longer present. */ + bool remove (ARA::Host::DocumentController& dc) + { + const std::lock_guard lock (mutex); + return --counts[&dc] == 0; + } + +private: + std::map counts; + std::mutex mutex; +}; + +static ARAEditGuardState editGuardState; + +ARAEditGuard::ARAEditGuard (ARA::Host::DocumentController& dcIn) : dc (dcIn) +{ + if (editGuardState.add (dc)) + dc.beginEditing(); +} + +ARAEditGuard::~ARAEditGuard() +{ + if (editGuardState.remove (dc)) + dc.endEditing(); +} + +//============================================================================== +namespace ARAHostModel +{ + +//============================================================================== +AudioSource::AudioSource (ARA::ARAAudioSourceHostRef hostRef, + ARA::Host::DocumentController& dc, + const ARA::ARAAudioSourceProperties& props) + : ManagedARAHandle (dc, [&] + { + const ARAEditGuard guard (dc); + return dc.createAudioSource (hostRef, &props); + }()) +{ +} + +void AudioSource::update (const ARA::ARAAudioSourceProperties& props) +{ + const ARAEditGuard guard (getDocumentController()); + getDocumentController().updateAudioSourceProperties (getPluginRef(), &props); +} + +void AudioSource::enableAudioSourceSamplesAccess (bool x) +{ + const ARAEditGuard guard (getDocumentController()); + getDocumentController().enableAudioSourceSamplesAccess (getPluginRef(), x); +} + +void AudioSource::destroy (ARA::Host::DocumentController& dc, Ptr ptr) +{ + dc.destroyAudioSource (ptr); +} + +//============================================================================== +AudioModification::AudioModification (ARA::ARAAudioModificationHostRef hostRef, + ARA::Host::DocumentController& dc, + AudioSource& s, + const ARA::ARAAudioModificationProperties& props) + : ManagedARAHandle (dc, [&] + { + const ARAEditGuard guard (dc); + return dc.createAudioModification (s.getPluginRef(), hostRef, &props); + }()), + source (s) +{ +} + +void AudioModification::update (const ARA::ARAAudioModificationProperties& props) +{ + const ARAEditGuard guard (getDocumentController()); + getDocumentController().updateAudioModificationProperties (getPluginRef(), &props); +} + +void AudioModification::destroy (ARA::Host::DocumentController& dc, Ptr ptr) +{ + dc.destroyAudioModification (ptr); +} + +//============================================================================== +class PlaybackRegion::Impl : public ManagedARAHandle, + public DeletionListener +{ +public: + Impl (ARA::ARAPlaybackRegionHostRef hostRef, + ARA::Host::DocumentController& dc, + AudioModification& m, + const ARA::ARAPlaybackRegionProperties& props); + + ~Impl() override + { + for (const auto& l : listeners) + l->removeListener (*this); + } + + /* Updates the state of the corresponding %ARA model object. + + Places the DocumentController in editable state. + + You can use getEmptyProperties() to acquire a properties struct where the `structSize` + field has already been correctly set. + */ + void update (const ARA::ARAPlaybackRegionProperties& props); + + auto& getAudioModification() const { return modification; } + + static void destroy (ARA::Host::DocumentController&, Ptr); + + void addListener (DeletionListener& l) { listeners.insert (&l); } + void removeListener (DeletionListener& l) noexcept override { listeners.erase (&l); } + +private: + AudioModification* modification = nullptr; + std::unordered_set listeners; +}; + +PlaybackRegion::Impl::Impl (ARA::ARAPlaybackRegionHostRef hostRef, + ARA::Host::DocumentController& dc, + AudioModification& m, + const ARA::ARAPlaybackRegionProperties& props) + : ManagedARAHandle (dc, [&] + { + const ARAEditGuard guard (dc); + return dc.createPlaybackRegion (m.getPluginRef(), hostRef, &props); + }()), + modification (&m) +{ +} + +PlaybackRegion::~PlaybackRegion() = default; + +void PlaybackRegion::Impl::update (const ARA::ARAPlaybackRegionProperties& props) +{ + const ARAEditGuard guard (getDocumentController()); + getDocumentController().updatePlaybackRegionProperties (getPluginRef(), &props); +} + +void PlaybackRegion::Impl::destroy (ARA::Host::DocumentController& dc, Ptr ptr) +{ + dc.destroyPlaybackRegion (ptr); +} + +PlaybackRegion::PlaybackRegion (ARA::ARAPlaybackRegionHostRef hostRef, + ARA::Host::DocumentController& dc, + AudioModification& m, + const ARA::ARAPlaybackRegionProperties& props) + : impl (std::make_unique (hostRef, dc, m, props)) +{ +} + +void PlaybackRegion::update (const ARA::ARAPlaybackRegionProperties& props) { impl->update (props); } + +void PlaybackRegion::addListener (DeletionListener& x) { impl->addListener (x); } + +auto& PlaybackRegion::getAudioModification() const { return impl->getAudioModification(); } + +ARA::ARAPlaybackRegionRef PlaybackRegion::getPluginRef() const noexcept { return impl->getPluginRef(); } + +DeletionListener& PlaybackRegion::getDeletionListener() const noexcept { return *impl.get(); } + +//============================================================================== +MusicalContext::MusicalContext (ARA::ARAMusicalContextHostRef hostRef, + ARA::Host::DocumentController& dc, + const ARA::ARAMusicalContextProperties& props) + : ManagedARAHandle (dc, [&] + { + const ARAEditGuard guard (dc); + return dc.createMusicalContext (hostRef, &props); + }()) +{ +} + +void MusicalContext::update (const ARA::ARAMusicalContextProperties& props) +{ + const ARAEditGuard guard (getDocumentController()); + return getDocumentController().updateMusicalContextProperties (getPluginRef(), &props); +} + +void MusicalContext::destroy (ARA::Host::DocumentController& dc, Ptr ptr) +{ + dc.destroyMusicalContext (ptr); +} + +//============================================================================== +RegionSequence::RegionSequence (ARA::ARARegionSequenceHostRef hostRef, + ARA::Host::DocumentController& dc, + const ARA::ARARegionSequenceProperties& props) + : ManagedARAHandle (dc, [&] + { + const ARAEditGuard guard (dc); + return dc.createRegionSequence (hostRef, &props); + }()) +{ +} + +void RegionSequence::update (const ARA::ARARegionSequenceProperties& props) +{ + const ARAEditGuard guard (getDocumentController()); + return getDocumentController().updateRegionSequenceProperties (getPluginRef(), &props); +} + +void RegionSequence::destroy (ARA::Host::DocumentController& dc, Ptr ptr) +{ + dc.destroyRegionSequence (ptr); +} + +//============================================================================== +PlaybackRendererInterface PlugInExtensionInstance::getPlaybackRendererInterface() const +{ + if (instance != nullptr) + return PlaybackRendererInterface (instance->playbackRendererRef, instance->playbackRendererInterface); + + return {}; +} + +EditorRendererInterface PlugInExtensionInstance::getEditorRendererInterface() const +{ + if (instance != nullptr) + return EditorRendererInterface (instance->editorRendererRef, instance->editorRendererInterface); + + return {}; +} + +} // namespace ARAHostModel + +//============================================================================== +class ARAHostDocumentController::Impl +{ +public: + Impl (ARAFactoryWrapper araFactoryIn, + std::unique_ptr&& dcHostInstanceIn, + const ARA::ARADocumentControllerInstance* documentControllerInstance) + : araFactory (std::move (araFactoryIn)), + dcHostInstance (std::move (dcHostInstanceIn)), + documentController (documentControllerInstance) + { + } + + ~Impl() + { + documentController.destroyDocumentController(); + } + + static std::unique_ptr + createImpl (ARAFactoryWrapper araFactory, + const String& documentName, + std::unique_ptr&& audioAccessController, + std::unique_ptr&& archivingController, + std::unique_ptr&& contentAccessController, + std::unique_ptr&& modelUpdateController, + std::unique_ptr&& playbackController) + { + std::unique_ptr dcHostInstance = + std::make_unique (audioAccessController.release(), + archivingController.release(), + contentAccessController.release(), + modelUpdateController.release(), + playbackController.release()); + + const auto documentProperties = makeARASizedStruct (&ARA::ARADocumentProperties::name, documentName.toRawUTF8()); + + if (auto* dci = araFactory.get()->createDocumentControllerWithDocument (dcHostInstance.get(), &documentProperties)) + return std::make_unique (std::move (araFactory), std::move (dcHostInstance), dci); + + return {}; + } + + ARAHostModel::PlugInExtensionInstance bindDocumentToPluginInstance (AudioPluginInstance& instance, + ARA::ARAPlugInInstanceRoleFlags knownRoles, + ARA::ARAPlugInInstanceRoleFlags assignedRoles) + { + + const auto makeVisitor = [] (auto vst3Fn, auto auFn) + { + using Vst3Fn = decltype (vst3Fn); + using AuFn = decltype (auFn); + + struct Visitor : ExtensionsVisitor, Vst3Fn, AuFn + { + explicit Visitor (Vst3Fn vst3Fn, AuFn auFn) : Vst3Fn (std::move (vst3Fn)), AuFn (std::move (auFn)) {} + void visitVST3Client (const VST3Client& x) override { Vst3Fn::operator() (x); } + void visitAudioUnitClient (const AudioUnitClient& x) override { AuFn::operator() (x); } + }; + + return Visitor { std::move (vst3Fn), std::move (auFn) }; + }; + + const ARA::ARAPlugInExtensionInstance* pei = nullptr; + auto visitor = makeVisitor ([this, &pei, knownRoles, assignedRoles] (const ExtensionsVisitor::VST3Client& vst3Client) + { + auto* iComponentPtr = vst3Client.getIComponentPtr(); + VSTComSmartPtr araEntryPoint; + + if (araEntryPoint.loadFrom (iComponentPtr)) + pei = araEntryPoint->bindToDocumentControllerWithRoles (documentController.getRef(), knownRoles, assignedRoles); + }, + #if JUCE_PLUGINHOST_AU && JUCE_MAC + [this, &pei, knownRoles, assignedRoles] (const ExtensionsVisitor::AudioUnitClient& auClient) + { + auto audioUnit = auClient.getAudioUnitHandle(); + auto propertySize = (UInt32) sizeof (ARA::ARAAudioUnitPlugInExtensionBinding); + const auto expectedPropertySize = propertySize; + ARA::ARAAudioUnitPlugInExtensionBinding audioUnitBinding { ARA::kARAAudioUnitMagic, + documentController.getRef(), + nullptr, + knownRoles, + assignedRoles }; + + auto status = AudioUnitGetProperty (audioUnit, + ARA::kAudioUnitProperty_ARAPlugInExtensionBindingWithRoles, + kAudioUnitScope_Global, + 0, + &audioUnitBinding, + &propertySize); + + if (status == noErr + && propertySize == expectedPropertySize + && audioUnitBinding.inOutMagicNumber == ARA::kARAAudioUnitMagic + && audioUnitBinding.inDocumentControllerRef == documentController.getRef() + && audioUnitBinding.outPlugInExtension != nullptr) + { + pei = audioUnitBinding.outPlugInExtension; + } + else + jassertfalse; + } + #else + [] (const auto&) {} + #endif + ); + + instance.getExtensions (visitor); + return ARAHostModel::PlugInExtensionInstance { pei }; + } + + auto& getDocumentController() { return documentController; } + +private: + ARAFactoryWrapper araFactory; + std::unique_ptr dcHostInstance; + ARA::Host::DocumentController documentController; +}; + +ARAHostDocumentController::ARAHostDocumentController (std::unique_ptr&& implIn) + : impl { std::move (implIn) } +{} + +std::unique_ptr ARAHostDocumentController::create (ARAFactoryWrapper factory, + const String& documentName, + std::unique_ptr audioAccessController, + std::unique_ptr archivingController, + std::unique_ptr contentAccessController, + std::unique_ptr modelUpdateController, + std::unique_ptr playbackController) +{ + if (auto impl = Impl::createImpl (std::move (factory), + documentName, + std::move (audioAccessController), + std::move (archivingController), + std::move (contentAccessController), + std::move (modelUpdateController), + std::move (playbackController))) + { + return rawToUniquePtr (new ARAHostDocumentController (std::move (impl))); + } + + return {}; +} + +ARAHostDocumentController::~ARAHostDocumentController() = default; + +ARA::Host::DocumentController& ARAHostDocumentController::getDocumentController() const +{ + return impl->getDocumentController(); +} + +ARAHostModel::PlugInExtensionInstance ARAHostDocumentController::bindDocumentToPluginInstance (AudioPluginInstance& instance, + ARA::ARAPlugInInstanceRoleFlags knownRoles, + ARA::ARAPlugInInstanceRoleFlags assignedRoles) +{ + return impl->bindDocumentToPluginInstance (instance, knownRoles, assignedRoles); +} + +void createARAFactoryAsync (AudioPluginInstance& instance, std::function cb) +{ + if (! instance.getPluginDescription().hasARAExtension) + cb (ARAFactoryWrapper{}); + + struct Extensions : public ExtensionsVisitor + { + Extensions (std::function callbackIn) + : callback (std::move (callbackIn)) + {} + + void visitARAClient (const ARAClient& araClient) override + { + araClient.createARAFactoryAsync (std::move (callback)); + } + + std::function callback; + }; + + Extensions extensions { std::move(cb) }; + instance.getExtensions (extensions); +} + +} // namespace juce + +#endif diff --git a/modules/juce_audio_processors/format_types/juce_ARAHosting.h b/modules/juce_audio_processors/format_types/juce_ARAHosting.h new file mode 100644 index 00000000..632cb824 --- /dev/null +++ b/modules/juce_audio_processors/format_types/juce_ARAHosting.h @@ -0,0 +1,771 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#pragma once + +#if (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU) && (JUCE_MAC || JUCE_WINDOWS)) || DOXYGEN + +// Include ARA SDK headers +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments") + +#include +#include + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +//============================================================================== +namespace juce +{ +/** Reference counting helper class to ensure that the DocumentController is in editable state. + + When adding, removing or modifying %ARA model objects the enclosing DocumentController must be + in editable state. + + You can achieve this by using the %ARA Library calls + ARA::Host::DocumentController::beginEditing() and ARA::Host::DocumentController::endEditing(). + + However, putting the DocumentController in and out of editable state is a potentially costly + operation, thus it makes sense to group multiple modifications together and change the editable + state only once. + + ARAEditGuard keeps track of all scopes that want to edit a particular DocumentController and + will trigger beginEditing() and endEditing() only for the outermost scope. This allows you to + merge multiple editing operations into one by putting ARAEditGuard in their enclosing scope. + + @tags{ARA} +*/ +class ARAEditGuard +{ +public: + explicit ARAEditGuard (ARA::Host::DocumentController& dcIn); + ~ARAEditGuard(); + +private: + ARA::Host::DocumentController& dc; +}; + +namespace ARAHostModel +{ + +//============================================================================== +/** Allows converting, without warnings, between pointers of two unrelated types. + + This is a bit like ARA_MAP_HOST_REF, but not macro-based. + + To use it, add a line like this to a type that needs to deal in host references: + @code + using Converter = ConversionFunctions; + @endcode + + Now, you can convert back and forth with host references by calling + Converter::toHostRef() and Converter::fromHostRef(). + + @tags{ARA} +*/ +template +struct ConversionFunctions +{ + static_assert (sizeof (A) <= sizeof (B), + "It is only possible to convert between types of the same size"); + + static B toHostRef (A value) + { + return readUnaligned (&value); + } + + static A fromHostRef (B value) + { + return readUnaligned (&value); + } +}; + +//============================================================================== +/** This class is used by the various ARA model object helper classes, such as MusicalContext, + AudioSource etc. It helps with deregistering the model objects from the DocumentController + when the lifetime of the helper class object ends. + + You shouldn't use this class directly but instead inherit from the helper classes. +*/ +template +class ManagedARAHandle +{ +public: + using Ptr = PtrIn; + + /** Constructor. */ + ManagedARAHandle (ARA::Host::DocumentController& dc, Ptr ptr) noexcept + : handle (ptr, Deleter { dc }) {} + + /** Returns the host side DocumentController reference. */ + auto& getDocumentController() const { return handle.get_deleter().documentController; } + + /** Returns the plugin side reference to the model object. */ + Ptr getPluginRef() const { return handle.get(); } + +private: + struct Deleter + { + void operator() (Ptr ptr) const noexcept + { + const ARAEditGuard guard (documentController); + Base::destroy (documentController, ptr); + } + + ARA::Host::DocumentController& documentController; + }; + + std::unique_ptr, Deleter> handle; +}; + +//============================================================================== +/** Helper class for the host side implementation of the %ARA %AudioSource model object. + + Its intended use is to add a member variable of this type to your host side %AudioSource + implementation. Then it provides a RAII approach to managing the lifetime of the corresponding + objects created inside the DocumentController. When the host side object is instantiated an ARA + model object is also created in the DocumentController. When the host side object is deleted it + will be removed from the DocumentController as well. + + The class will automatically put the DocumentController into editable state for operations that + mandate this e.g. creation, deletion or updating. + + You can encapsulate multiple such operations into a scope with an ARAEditGuard in order to invoke + the editable state of the DocumentController only once. + + @tags{ARA} +*/ +class AudioSource : public ManagedARAHandle +{ +public: + /** Returns an %ARA versioned struct with the `structSize` correctly set for the currently + used SDK version. + + You should leave `structSize` unchanged, and fill out the rest of the fields appropriately + for the host implementation of the %ARA model object. + */ + static constexpr auto getEmptyProperties() { return makeARASizedStruct (&ARA::ARAAudioSourceProperties::merits64BitSamples); } + + /** Creates an AudioSource object. During construction it registers an %ARA %AudioSource model + object with the DocumentController that refers to the provided hostRef. When this object + is deleted the corresponding DocumentController model object will also be deregistered. + + You can acquire a correctly versioned `ARA::ARAAudioSourceProperties` struct by calling + getEmptyProperties(). + + Places the DocumentController in editable state. + + @see ARAEditGuard + */ + AudioSource (ARA::ARAAudioSourceHostRef hostRef, + ARA::Host::DocumentController& dc, + const ARA::ARAAudioSourceProperties& props); + + /** Destructor. Temporarily places the DocumentController in an editable state. */ + ~AudioSource() = default; + + /** Updates the state of the corresponding %ARA model object. + + Places the DocumentController in editable state. + + You can use getEmptyProperties() to acquire a properties struct where the `structSize` + field has already been correctly set. + */ + void update (const ARA::ARAAudioSourceProperties& props); + + /** Changes the plugin's access to the %AudioSource samples through the DocumentController. + + Places the DocumentController in editable state. + */ + void enableAudioSourceSamplesAccess (bool); + + /** Called by ManagedARAHandle to deregister the model object during the destruction of + AudioSource. + + You shouldn't call this function manually. + */ + static void destroy (ARA::Host::DocumentController&, Ptr); +}; + +/** Helper class for the host side implementation of the %ARA %AudioModification model object. + + Its intended use is to add a member variable of this type to your host side %AudioModification + implementation. Then it provides a RAII approach to managing the lifetime of the corresponding + objects created inside the DocumentController. When the host side object is instantiated an ARA + model object is also created in the DocumentController. When the host side object is deleted it + will be removed from the DocumentController as well. + + The class will automatically put the DocumentController into editable state for operations that + mandate this e.g. creation, deletion or updating. + + You can encapsulate multiple such operations into a scope with an ARAEditGuard in order to invoke + the editable state of the DocumentController only once. + + @tags{ARA} +*/ +class AudioModification : public ManagedARAHandle +{ +public: + /** Returns an %ARA versioned struct with the `structSize` correctly set for the currently + used SDK version. + + You should leave `structSize` unchanged, and fill out the rest of the fields appropriately + for the host implementation of the %ARA model object. + */ + static constexpr auto getEmptyProperties() + { + return makeARASizedStruct (&ARA::ARAAudioModificationProperties::persistentID); + } + + /** Creates an AudioModification object. During construction it registers an %ARA %AudioModification model + object with the DocumentController that refers to the provided hostRef. When this object + is deleted the corresponding DocumentController model object will also be deregistered. + + You can acquire a correctly versioned `ARA::ARAAudioModificationProperties` struct by calling + getEmptyProperties(). + + Places the DocumentController in editable state. + + @see ARAEditGuard + */ + AudioModification (ARA::ARAAudioModificationHostRef hostRef, + ARA::Host::DocumentController& dc, + AudioSource& s, + const ARA::ARAAudioModificationProperties& props); + + /** Updates the state of the corresponding %ARA model object. + + Places the DocumentController in editable state. + + You can use getEmptyProperties() to acquire a properties struct where the `structSize` + field has already been correctly set. + */ + void update (const ARA::ARAAudioModificationProperties& props); + + /** Returns the AudioSource containing this AudioModification. */ + auto& getAudioSource() const { return source; } + + /** Called by ManagedARAHandle to deregister the model object during the destruction of + AudioModification. + + You shouldn't call this function manually. + */ + static void destroy (ARA::Host::DocumentController&, Ptr); + +private: + AudioSource& source; +}; + +/** This class is used internally by PlaybackRegionRegistry to be notified when a PlaybackRegion + object is deleted. +*/ +struct DeletionListener +{ + /** Destructor. */ + virtual ~DeletionListener() = default; + + /** Removes another DeletionListener object from this DeletionListener. */ + virtual void removeListener (DeletionListener& other) noexcept = 0; +}; + +/** Helper class for the host side implementation of the %ARA %PlaybackRegion model object. + + Its intended use is to add a member variable of this type to your host side %PlaybackRegion + implementation. Then it provides a RAII approach to managing the lifetime of the corresponding + objects created inside the DocumentController. When the host side object is instantiated an ARA + model object is also created in the DocumentController. When the host side object is deleted it + will be removed from the DocumentController as well. + + The class will automatically put the DocumentController into editable state for operations that + mandate this e.g. creation, deletion or updating. + + You can encapsulate multiple such operations into a scope with an ARAEditGuard in order to invoke + the editable state of the DocumentController only once. + + @tags{ARA} +*/ +struct PlaybackRegion +{ +public: + /** Returns an %ARA versioned struct with the `structSize` correctly set for the currently + used SDK version. + + You should leave `structSize` unchanged, and fill out the rest of the fields appropriately + for the host implementation of the %ARA model object. + */ + static constexpr auto getEmptyProperties() + { + return makeARASizedStruct (&ARA::ARAPlaybackRegionProperties::color); + } + + PlaybackRegion (ARA::ARAPlaybackRegionHostRef hostRef, + ARA::Host::DocumentController& dc, + AudioModification& m, + const ARA::ARAPlaybackRegionProperties& props); + + ~PlaybackRegion(); + + /** Updates the state of the corresponding %ARA model object. + + Places the DocumentController in editable state. + + You can use getEmptyProperties() to acquire a properties struct where the `structSize` + field has already been correctly set. + */ + void update (const ARA::ARAPlaybackRegionProperties& props); + + /** Adds a DeletionListener object that will be notified when the PlaybackRegion object + is deleted. + + Used by the PlaybackRegionRegistry. + + @see PlaybackRendererInterface, EditorRendererInterface + */ + void addListener (DeletionListener& x); + + /** Returns the AudioModification containing this PlaybackRegion. */ + auto& getAudioModification() const; + + /** Returns the plugin side reference to the PlaybackRegion */ + ARA::ARAPlaybackRegionRef getPluginRef() const noexcept; + DeletionListener& getDeletionListener() const noexcept; + +private: + class Impl; + + std::unique_ptr impl; +}; + +/** Helper class for the host side implementation of the %ARA %MusicalContext model object. + + Its intended use is to add a member variable of this type to your host side %MusicalContext + implementation. Then it provides a RAII approach to managing the lifetime of the corresponding + objects created inside the DocumentController. When the host side object is instantiated an ARA + model object is also created in the DocumentController. When the host side object is deleted it + will be removed from the DocumentController as well. + + The class will automatically put the DocumentController into editable state for operations that + mandate this e.g. creation, deletion or updating. + + You can encapsulate multiple such operations into a scope with an ARAEditGuard in order to invoke + the editable state of the DocumentController only once. + + @tags{ARA} +*/ +class MusicalContext : public ManagedARAHandle +{ +public: + /** Returns an %ARA versioned struct with the `structSize` correctly set for the currently + used SDK version. + + You should leave `structSize` unchanged, and fill out the rest of the fields appropriately + for the host implementation of the %ARA model object. + */ + static constexpr auto getEmptyProperties() + { + return makeARASizedStruct (&ARA::ARAMusicalContextProperties::color); + } + + /** Creates a MusicalContext object. During construction it registers an %ARA %MusicalContext model + object with the DocumentController that refers to the provided hostRef. When this object + is deleted the corresponding DocumentController model object will also be deregistered. + + You can acquire a correctly versioned `ARA::ARAMusicalContextProperties` struct by calling + getEmptyProperties(). + + Places the DocumentController in editable state. + + @see ARAEditGuard + */ + MusicalContext (ARA::ARAMusicalContextHostRef hostRef, + ARA::Host::DocumentController& dc, + const ARA::ARAMusicalContextProperties& props); + + /** Updates the state of the corresponding %ARA model object. + + Places the DocumentController in editable state. + + You can use getEmptyProperties() to acquire a properties struct where the `structSize` + field has already been correctly set. + */ + void update (const ARA::ARAMusicalContextProperties& props); + + /** Called by ManagedARAHandle to deregister the model object during the destruction of + AudioModification. + + You shouldn't call this function manually. + */ + static void destroy (ARA::Host::DocumentController&, Ptr); +}; + +/** Helper class for the host side implementation of the %ARA %RegionSequence model object. + + Its intended use is to add a member variable of this type to your host side %RegionSequence + implementation. Then it provides a RAII approach to managing the lifetime of the corresponding + objects created inside the DocumentController. When the host side object is instantiated an ARA + model object is also created in the DocumentController. When the host side object is deleted it + will be removed from the DocumentController as well. + + The class will automatically put the DocumentController into editable state for operations that + mandate this e.g. creation, deletion or updating. + + You can encapsulate multiple such operations into a scope with an ARAEditGuard in order to invoke + the editable state of the DocumentController only once. + + @tags{ARA} +*/ +class RegionSequence : public ManagedARAHandle +{ +public: + /** Returns an %ARA versioned struct with the `structSize` correctly set for the currently + used SDK version. + + You should leave `structSize` unchanged, and fill out the rest of the fields appropriately + for the host implementation of the %ARA model object. + */ + static constexpr auto getEmptyProperties() + { + return makeARASizedStruct (&ARA::ARARegionSequenceProperties::color); + } + + /** Creates a RegionSequence object. During construction it registers an %ARA %RegionSequence model + object with the DocumentController that refers to the provided hostRef. When this object + is deleted the corresponding DocumentController model object will also be deregistered. + + You can acquire a correctly versioned `ARA::ARARegionSequenceProperties` struct by calling + getEmptyProperties(). + + Places the DocumentController in editable state. + + @see ARAEditGuard + */ + RegionSequence (ARA::ARARegionSequenceHostRef hostRef, + ARA::Host::DocumentController& dc, + const ARA::ARARegionSequenceProperties& props); + + /** Updates the state of the corresponding %ARA model object. + + Places the DocumentController in editable state. + + You can use getEmptyProperties() to acquire a properties struct where the `structSize` + field has already been correctly set. + */ + void update (const ARA::ARARegionSequenceProperties& props); + + /** Called by ManagedARAHandle to deregister the model object during the destruction of + AudioModification. + + You shouldn't call this function manually. + */ + static void destroy (ARA::Host::DocumentController&, Ptr); +}; + +//============================================================================== +/** Base class used by the ::PlaybackRendererInterface and ::EditorRendererInterface + plugin extension interfaces. + + Hosts will want to create one or typically more %ARA plugin extension instances per plugin for + the purpose of playback and editor rendering. The PlaybackRegions created by the host then have + to be assigned to these instances through the appropriate interfaces. + + Whether a PlaybackRegion or an assigned RendererInterface is deleted first depends on the host + implementation and exact use case. + + By using these helper classes you can ensure that the %ARA DocumentController remains in a + valid state in both situations. In order to use them acquire an object from + PlugInExtensionInstance::getPlaybackRendererInterface() or + PlugInExtensionInstance::getEditorRendererInterface(). + + Then call add() to register a PlaybackRegion with that particular PlugInExtensionInstance's + interface. + + Now when you delete that PlaybackRegion it will be deregistered from that extension instance. + If however you want to delete the plugin extension instance before the PlaybackRegion, you can + delete the PlaybackRegionRegistry instance before deleting the plugin extension instance, which + takes care of deregistering all PlaybackRegions. + + When adding or removing PlaybackRegions the plugin instance must be in an unprepared state i.e. + before AudioProcessor::prepareToPlay() or after AudioProcessor::releaseResources(). + + @code + auto playbackRenderer = std::make_unique (plugInExtensionInstance.getPlaybackRendererInterface()); + auto playbackRegion = std::make_unique (documentController, regionSequence, audioModification, audioSource); + + // Either of the following three code variations are valid + // (1) =================================================== + playbackRenderer.add (playbackRegion); + playbackRenderer.remove (playbackRegion); + + // (2) =================================================== + playbackRenderer.add (playbackRegion); + playbackRegion.reset(); + + // (3) =================================================== + playbackRenderer.add (playbackRegion); + playbackRenderer.reset(); + @endcode + + @see PluginExtensionInstance + + @tags{ARA} +*/ +template +class PlaybackRegionRegistry +{ +public: + PlaybackRegionRegistry() = default; + + PlaybackRegionRegistry (RendererRef rendererRefIn, const Interface* interfaceIn) + : registry (std::make_unique (rendererRefIn, interfaceIn)) + { + } + + /** Adds a PlaybackRegion to the corresponding ::PlaybackRendererInterface or ::EditorRendererInterface. + + The plugin instance must be in an unprepared state i.e. before AudioProcessor::prepareToPlay() or + after AudioProcessor::releaseResources(). + */ + void add (PlaybackRegion& region) { registry->add (region); } + + /** Removes a PlaybackRegion from the corresponding ::PlaybackRendererInterface or ::EditorRendererInterface. + + The plugin instance must be in an unprepared state i.e. before AudioProcessor::prepareToPlay() or + after AudioProcessor::releaseResources(). + */ + void remove (PlaybackRegion& region) { registry->remove (region); } + + /** Returns true if the underlying %ARA plugin extension instance fulfills the corresponding role. */ + bool isValid() { return registry->isValid(); } + +private: + class Registry : private DeletionListener + { + public: + Registry (RendererRef rendererRefIn, const Interface* interfaceIn) + : rendererRef (rendererRefIn), rendererInterface (interfaceIn) + { + } + + Registry (const Registry&) = delete; + Registry (Registry&&) noexcept = delete; + + Registry& operator= (const Registry&) = delete; + Registry& operator= (Registry&&) noexcept = delete; + + ~Registry() override + { + for (const auto& region : regions) + doRemoveListener (*region.first); + } + + bool isValid() { return rendererRef != nullptr && rendererInterface != nullptr; } + + void add (PlaybackRegion& region) + { + if (isValid()) + rendererInterface->addPlaybackRegion (rendererRef, region.getPluginRef()); + + regions.emplace (®ion.getDeletionListener(), region.getPluginRef()); + region.addListener (*this); + } + + void remove (PlaybackRegion& region) + { + doRemoveListener (region.getDeletionListener()); + } + + private: + void doRemoveListener (DeletionListener& listener) noexcept + { + listener.removeListener (*this); + removeListener (listener); + } + + void removeListener (DeletionListener& listener) noexcept override + { + const auto it = regions.find (&listener); + + if (it == regions.end()) + { + jassertfalse; + return; + } + + if (isValid()) + rendererInterface->removePlaybackRegion (rendererRef, it->second); + + regions.erase (it); + } + + RendererRef rendererRef = nullptr; + const Interface* rendererInterface = nullptr; + std::map regions; + }; + + std::unique_ptr registry; +}; + +//============================================================================== +/** Helper class for managing the lifetimes of %ARA plugin extension instances and PlaybackRegions. + + You can read more about its usage at PlaybackRegionRegistry. + + @see PlaybackRegion, PlaybackRegionRegistry + + @tags{ARA} +*/ +using PlaybackRendererInterface = PlaybackRegionRegistry; + +//============================================================================== +/** Helper class for managing the lifetimes of %ARA plugin extension instances and PlaybackRegions. + + You can read more about its usage at PlaybackRegionRegistry. + + @see PlaybackRegion, PlaybackRegionRegistry + + @tags{ARA} +*/ +using EditorRendererInterface = PlaybackRegionRegistry; + +//============================================================================== +/** Wrapper class for `ARA::ARAPlugInExtensionInstance*`. + + Returned by ARAHostDocumentController::bindDocumentToPluginInstance(). The corresponding + ARAHostDocumentController must remain valid as long as the plugin extension is in use. +*/ +class PlugInExtensionInstance final +{ +public: + /** Creates an empty PlugInExtensionInstance object. + + Calling isValid() on such an object will return false. + */ + PlugInExtensionInstance() = default; + + /** Creates a PlugInExtensionInstance object that wraps a `const ARA::ARAPlugInExtensionInstance*`. + + The intended way to obtain a PlugInExtensionInstance object is to call + ARAHostDocumentController::bindDocumentToPluginInstance(), which is using this constructor. + */ + explicit PlugInExtensionInstance (const ARA::ARAPlugInExtensionInstance* instanceIn) + : instance (instanceIn) + { + } + + /** Returns the PlaybackRendererInterface for the extension instance. + + Depending on what roles were passed into + ARAHostDocumentController::bindDocumentToPluginInstance() one particular instance may not + fulfill a given role. You can use PlaybackRendererInterface::isValid() to see if this + interface was provided by the instance. + */ + PlaybackRendererInterface getPlaybackRendererInterface() const; + + /** Returns the EditorRendererInterface for the extension instance. + + Depending on what roles were passed into + ARAHostDocumentController::bindDocumentToPluginInstance() one particular instance may not + fulfill a given role. You can use EditorRendererInterface::isValid() to see if this + interface was provided by the instance. + */ + EditorRendererInterface getEditorRendererInterface() const; + + /** Returns false if the PlugInExtensionInstance was default constructed and represents + no binding to an ARAHostDocumentController. + */ + bool isValid() const noexcept { return instance != nullptr; } + +private: + const ARA::ARAPlugInExtensionInstance* instance = nullptr; +}; + +} // namespace ARAHostModel + +//============================================================================== +/** Wrapper class for `ARA::Host::DocumentController`. + + In order to create an ARAHostDocumentController from an ARAFactoryWrapper you must + provide at least two mandatory host side interfaces. You can create these implementations + by inheriting from the base classes in the `ARA::Host` namespace. + + @tags{ARA} +*/ +class ARAHostDocumentController final +{ +public: + /** Factory function. + + You must check if the returned pointer is valid. + */ + static std::unique_ptr + create (ARAFactoryWrapper factory, + const String& documentName, + std::unique_ptr audioAccessController, + std::unique_ptr archivingController, + std::unique_ptr contentAccessController = nullptr, + std::unique_ptr modelUpdateController = nullptr, + std::unique_ptr playbackController = nullptr); + + ~ARAHostDocumentController(); + + /** Returns the underlying ARA::Host::DocumentController reference. */ + ARA::Host::DocumentController& getDocumentController() const; + + /** Binds the ARAHostDocumentController and its enclosed document to a plugin instance. + + The resulting ARAHostModel::PlugInExtensionInstance is responsible for fulfilling the + ARA specific roles of the plugin. + + A single DocumentController can be bound to multiple plugin instances, which is a typical + practice among hosts. + */ + ARAHostModel::PlugInExtensionInstance bindDocumentToPluginInstance (AudioPluginInstance& instance, + ARA::ARAPlugInInstanceRoleFlags knownRoles, + ARA::ARAPlugInInstanceRoleFlags assignedRoles); + +private: + class Impl; + std::unique_ptr impl; + + explicit ARAHostDocumentController (std::unique_ptr&& implIn); +}; + +/** Calls the provided callback with an ARAFactoryWrapper object obtained from the provided + AudioPluginInstance. + + If the provided AudioPluginInstance has no ARA extensions, the callback will be called with an + ARAFactoryWrapper that wraps a nullptr. + + The object passed to the callback must be checked even if the plugin instance reports having + ARA extensions. +*/ +void createARAFactoryAsync (AudioPluginInstance& instance, std::function cb); + +} // namespace juce + +//============================================================================== +#undef ARA_REF +#undef ARA_HOST_REF + +#endif diff --git a/modules/juce_audio_processors/format_types/juce_AU_Shared.h b/modules/juce_audio_processors/format_types/juce_AU_Shared.h index 06e739d8..5ef274d0 100644 --- a/modules/juce_audio_processors/format_types/juce_AU_Shared.h +++ b/modules/juce_audio_processors/format_types/juce_AU_Shared.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,6 +23,8 @@ ============================================================================== */ +#ifndef DOXYGEN + // This macro can be set if you need to override this internal name for some reason.. #ifndef JUCE_STATE_DICTIONARY_KEY #define JUCE_STATE_DICTIONARY_KEY "jucePluginState" @@ -31,8 +33,6 @@ namespace juce { -#ifndef DOXYGEN - struct AudioUnitHelpers { class ChannelRemapper @@ -157,13 +157,10 @@ struct AudioUnitHelpers AudioBuffer& getBuffer (UInt32 frames) noexcept { - #if JUCE_DEBUG - for (int i = 0; i < (int) channels.size(); ++i) - jassert (channels[(size_t) i] != nullptr); - #endif + jassert (std::none_of (channels.begin(), channels.end(), [] (auto* x) { return x == nullptr; })); - if (! channels.empty()) - mutableBuffer.setDataToReferTo (channels.data(), (int) channels.size(), static_cast (frames)); + const auto channelPtr = channels.empty() ? scratch.getArrayOfWritePointers() : channels.data(); + mutableBuffer.setDataToReferTo (channelPtr, (int) channels.size(), static_cast (frames)); return mutableBuffer; } @@ -563,6 +560,6 @@ struct AudioUnitHelpers } }; -#endif - } // namespace juce + +#endif diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h index c8d46706..53c50487 100644 --- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h +++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -54,6 +54,7 @@ public: StringArray searchPathsForPlugins (const FileSearchPath&, bool recursive, bool) override; bool doesPluginStillExist (const PluginDescription&) override; FileSearchPath getDefaultLocationsToSearch() override; + void createARAFactoryAsync (const PluginDescription&, ARAFactoryCreationCallback callback) override; private: //============================================================================== diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm index 8389dd6c..ec695c4f 100644 --- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -31,16 +31,18 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") #include #include #include -#endif -#include +#if JUCE_PLUGINHOST_ARA + #include +#endif -#if JUCE_SUPPORT_CARBON - #include #endif +#include + #include +#include #include #include #include "juce_AU_Shared.h" @@ -216,13 +218,40 @@ namespace AudioUnitFormatHelpers if (manuString != nullptr && CFGetTypeID (manuString) == CFStringGetTypeID()) manufacturer = String::fromCFString ((CFStringRef) manuString); - const ResFileRefNum resFileId = CFBundleOpenBundleResourceMap (bundleRef.get()); - UseResFile (resFileId); + class ScopedBundleResourceMap final + { + public: + explicit ScopedBundleResourceMap (CFBundleRef refIn) : ref (refIn), + resFileId (CFBundleOpenBundleResourceMap (ref)), + valid (resFileId != -1) + { + if (valid) + UseResFile (resFileId); + } + + ~ScopedBundleResourceMap() + { + if (valid) + CFBundleCloseBundleResourceMap (ref, resFileId); + } + + bool isValid() const noexcept + { + return valid; + } + + private: + const CFBundleRef ref; + const ResFileRefNum resFileId; + const bool valid; + }; + + const ScopedBundleResourceMap resourceMap { bundleRef.get() }; const OSType thngType = stringToOSType ("thng"); auto numResources = Count1Resources (thngType); - if (numResources > 0) + if (resourceMap.isValid() && numResources > 0) { for (ResourceIndex i = 1; i <= numResources; ++i) { @@ -260,7 +289,7 @@ namespace AudioUnitFormatHelpers NSBundle* bundle = [[NSBundle alloc] initWithPath: (NSString*) fileOrIdentifier.toCFString()]; NSArray* audioComponents = [bundle objectForInfoDictionaryKey: @"AudioComponents"]; - NSDictionary* dict = audioComponents[0]; + NSDictionary* dict = [audioComponents objectAtIndex: 0]; desc.componentManufacturer = stringToOSType (nsStringToJuce ((NSString*) [dict valueForKey: @"manufacturer"])); desc.componentType = stringToOSType (nsStringToJuce ((NSString*) [dict valueForKey: @"type"])); @@ -268,8 +297,6 @@ namespace AudioUnitFormatHelpers [bundle release]; } - - CFBundleCloseBundleResourceMap (bundleRef.get(), resFileId); } } @@ -314,39 +341,25 @@ namespace AudioUnitFormatHelpers #endif template - struct BasicOptional - { - BasicOptional() = default; - - explicit constexpr BasicOptional (Value&& v) : value (std::move (v)), isValid (true) {} - explicit constexpr BasicOptional (const Value& v) : value (v), isValid (true) {} - - explicit constexpr operator bool() const noexcept { return isValid; } - - Value value; - bool isValid { false }; - }; - - template - static BasicOptional tryGetProperty (AudioUnit inUnit, - AudioUnitPropertyID inID, - AudioUnitScope inScope, - AudioUnitElement inElement) + static Optional tryGetProperty (AudioUnit inUnit, + AudioUnitPropertyID inID, + AudioUnitScope inScope, + AudioUnitElement inElement) { Value data; auto size = (UInt32) sizeof (Value); if (AudioUnitGetProperty (inUnit, inID, inScope, inElement, &data, &size) == noErr) - return BasicOptional (data); + return data; - return BasicOptional(); + return {}; } static UInt32 getElementCount (AudioUnit comp, AudioUnitScope scope) noexcept { const auto count = tryGetProperty (comp, kAudioUnitProperty_ElementCount, scope, 0); - jassert (count.isValid); - return count.value; + jassert (count); + return *count; } /* The plugin may expect its channels in a particular order, reported to the host @@ -372,8 +385,8 @@ namespace AudioUnitFormatHelpers if (const auto layout = tryGetProperty (comp, kAudioUnitProperty_AudioChannelLayout, scope, busIndex)) { - const auto juceChannelOrder = CoreAudioLayouts::fromCoreAudio (layout.value); - const auto auChannelOrder = CoreAudioLayouts::getCoreAudioLayoutChannels (layout.value); + const auto juceChannelOrder = CoreAudioLayouts::fromCoreAudio (*layout); + const auto auChannelOrder = CoreAudioLayouts::getCoreAudioLayoutChannels (*layout); for (auto juceChannelIndex = 0; juceChannelIndex < juceChannelOrder.size(); ++juceChannelIndex) busMap.push_back ((size_t) auChannelOrder.indexOf (juceChannelOrder.getTypeOfChannel (juceChannelIndex))); @@ -411,10 +424,208 @@ namespace AudioUnitFormatHelpers */ std::vector channels; }; + + static bool isPluginAUv3 (const AudioComponentDescription& desc) + { + if (@available (macOS 10.11, *)) + return (desc.componentFlags & kAudioComponentFlag_IsV3AudioUnit) != 0; + + return false; + } +} + +static bool hasARAExtension (AudioUnit audioUnit) +{ + #if JUCE_PLUGINHOST_ARA + UInt32 propertySize = sizeof (ARA::ARAAudioUnitFactory); + Boolean isWriteable = FALSE; + + OSStatus status = AudioUnitGetPropertyInfo (audioUnit, + ARA::kAudioUnitProperty_ARAFactory, + kAudioUnitScope_Global, + 0, + &propertySize, + &isWriteable); + + if ((status == noErr) && (propertySize == sizeof (ARA::ARAAudioUnitFactory)) && ! isWriteable) + return true; + #else + ignoreUnused (audioUnit); + #endif + + return false; +} + +struct AudioUnitDeleter +{ + void operator() (AudioUnit au) const { AudioComponentInstanceDispose (au); } +}; + +using AudioUnitUniquePtr = std::unique_ptr, AudioUnitDeleter>; +using AudioUnitSharedPtr = std::shared_ptr>; +using AudioUnitWeakPtr = std::weak_ptr>; + +static std::shared_ptr getARAFactory (AudioUnitSharedPtr audioUnit) +{ + #if JUCE_PLUGINHOST_ARA + jassert (audioUnit != nullptr); + + UInt32 propertySize = sizeof (ARA::ARAAudioUnitFactory); + ARA::ARAAudioUnitFactory audioUnitFactory { ARA::kARAAudioUnitMagic, nullptr }; + + if (hasARAExtension (audioUnit.get())) + { + OSStatus status = AudioUnitGetProperty (audioUnit.get(), + ARA::kAudioUnitProperty_ARAFactory, + kAudioUnitScope_Global, + 0, + &audioUnitFactory, + &propertySize); + + if ((status == noErr) + && (propertySize == sizeof (ARA::ARAAudioUnitFactory)) + && (audioUnitFactory.inOutMagicNumber == ARA::kARAAudioUnitMagic)) + { + jassert (audioUnitFactory.outFactory != nullptr); + return getOrCreateARAFactory (audioUnitFactory.outFactory, + [owningAuPtr = std::move (audioUnit)] (const ARA::ARAFactory*) {}); + } + } + #else + ignoreUnused (audioUnit); + #endif + + return {}; +} + +struct VersionedAudioComponent +{ + AudioComponent audioComponent = nullptr; + bool isAUv3 = false; + + bool operator< (const VersionedAudioComponent& other) const { return audioComponent < other.audioComponent; } +}; + +using AudioUnitCreationCallback = std::function; + +static void createAudioUnit (VersionedAudioComponent versionedComponent, AudioUnitCreationCallback callback) +{ + struct AUAsyncInitializationCallback + { + typedef void (^AUCompletionCallbackBlock)(AudioComponentInstance, OSStatus); + + explicit AUAsyncInitializationCallback (AudioUnitCreationCallback inOriginalCallback) + : originalCallback (std::move (inOriginalCallback)) + { + block = CreateObjCBlock (this, &AUAsyncInitializationCallback::completion); + } + + AUCompletionCallbackBlock getBlock() noexcept { return block; } + + void completion (AudioComponentInstance audioUnit, OSStatus err) + { + originalCallback (audioUnit, err); + + delete this; + } + + double sampleRate; + int framesPerBuffer; + AudioUnitCreationCallback originalCallback; + + ObjCBlock block; + }; + + auto callbackBlock = new AUAsyncInitializationCallback (std::move (callback)); + + if (versionedComponent.isAUv3) + { + if (@available (macOS 10.11, *)) + { + AudioComponentInstantiate (versionedComponent.audioComponent, kAudioComponentInstantiation_LoadOutOfProcess, + callbackBlock->getBlock()); + + return; + } + } + + AudioComponentInstance audioUnit; + auto err = AudioComponentInstanceNew (versionedComponent.audioComponent, &audioUnit); + callbackBlock->completion (err != noErr ? nullptr : audioUnit, err); +} + +struct AudioComponentResult +{ + explicit AudioComponentResult (String error) : errorMessage (std::move (error)) {} + + explicit AudioComponentResult (VersionedAudioComponent auComponent) : component (std::move (auComponent)) {} + + bool isValid() const { return component.audioComponent != nullptr; } + + VersionedAudioComponent component; + String errorMessage; +}; + +static AudioComponentResult getAudioComponent (AudioUnitPluginFormat& format, const PluginDescription& desc) +{ + using namespace AudioUnitFormatHelpers; + + AudioUnitPluginFormat audioUnitPluginFormat; + + if (! format.fileMightContainThisPluginType (desc.fileOrIdentifier)) + return AudioComponentResult { NEEDS_TRANS ("Plug-in description is not an AudioUnit plug-in") }; + + String pluginName, version, manufacturer; + AudioComponentDescription componentDesc; + AudioComponent auComponent; + String errMessage = NEEDS_TRANS ("Cannot find AudioUnit from description"); + + if (! getComponentDescFromIdentifier (desc.fileOrIdentifier, componentDesc, pluginName, version, manufacturer) + && ! getComponentDescFromFile (desc.fileOrIdentifier, componentDesc, pluginName, version, manufacturer)) + { + return AudioComponentResult { errMessage }; + } + + if ((auComponent = AudioComponentFindNext (nullptr, &componentDesc)) == nullptr) + { + return AudioComponentResult { errMessage }; + } + + if (AudioComponentGetDescription (auComponent, &componentDesc) != noErr) + { + return AudioComponentResult { errMessage }; + } + + const bool isAUv3 = AudioUnitFormatHelpers::isPluginAUv3 (componentDesc); + + return AudioComponentResult { { auComponent, isAUv3 } }; +} + +static void getOrCreateARAAudioUnit (VersionedAudioComponent auComponent, std::function callback) +{ + static std::map audioUnitARACache; + + if (auto audioUnit = audioUnitARACache[auComponent].lock()) + { + callback (std::move (audioUnit)); + return; + } + + createAudioUnit (auComponent, [auComponent, cb = std::move (callback)] (AudioUnit audioUnit, OSStatus err) + { + cb ([auComponent, audioUnit, err]() -> AudioUnitSharedPtr + { + if (err != noErr) + return nullptr; + + AudioUnitSharedPtr auPtr { AudioUnitUniquePtr { audioUnit } }; + audioUnitARACache[auComponent] = auPtr; + return auPtr; + }()); + }); } //============================================================================== -class AudioUnitPluginWindowCarbon; class AudioUnitPluginWindowCocoa; //============================================================================== @@ -631,7 +842,7 @@ public: AudioComponentGetDescription (auComponent, &componentDesc); - isAUv3 = ((componentDesc.componentFlags & kAudioComponentFlag_IsV3AudioUnit) != 0); + isAUv3 = AudioUnitFormatHelpers::isPluginAUv3 (componentDesc); wantsMidiMessages = componentDesc.componentType == kAudioUnitType_MusicDevice || componentDesc.componentType == kAudioUnitType_MusicEffect @@ -823,7 +1034,7 @@ public: layoutHasChanged = true; err = AudioUnitSetProperty (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &newCount, sizeof (newCount)); - jassert (err == noErr); + jassertquiet (err == noErr); } for (int i = 0; i < n; ++i) @@ -966,6 +1177,23 @@ public: desc.numInputChannels = getTotalNumInputChannels(); desc.numOutputChannels = getTotalNumOutputChannels(); desc.isInstrument = (componentDesc.componentType == kAudioUnitType_MusicDevice); + + #if JUCE_PLUGINHOST_ARA + desc.hasARAExtension = [&] + { + UInt32 propertySize = sizeof (ARA::ARAAudioUnitFactory); + Boolean isWriteable = FALSE; + + OSStatus status = AudioUnitGetPropertyInfo (audioUnit, + ARA::kAudioUnitProperty_ARAFactory, + kAudioUnitScope_Global, + 0, + &propertySize, + &isWriteable); + + return (status == noErr) && (propertySize == sizeof (ARA::ARAAudioUnitFactory)) && ! isWriteable; + }(); + #endif } void getExtensions (ExtensionsVisitor& visitor) const override @@ -980,6 +1208,33 @@ public: }; visitor.visitAudioUnitClient (Extensions { this }); + + #ifdef JUCE_PLUGINHOST_ARA + struct ARAExtensions : public ExtensionsVisitor::ARAClient + { + explicit ARAExtensions (const AudioUnitPluginInstance* instanceIn) : instance (instanceIn) {} + + void createARAFactoryAsync (std::function cb) const override + { + getOrCreateARAAudioUnit ({ instance->auComponent, instance->isAUv3 }, + [origCb = std::move (cb)] (auto dylibKeepAliveAudioUnit) + { + origCb ([&]() -> ARAFactoryWrapper + { + if (dylibKeepAliveAudioUnit != nullptr) + return ARAFactoryWrapper { ::juce::getARAFactory (std::move (dylibKeepAliveAudioUnit)) }; + + return ARAFactoryWrapper { nullptr }; + }()); + }); + } + + const AudioUnitPluginInstance* instance = nullptr; + }; + + if (hasARAExtension (audioUnit)) + visitor.visitARAClient (ARAExtensions (this)); + #endif } void* getPlatformSpecificData() override { return audioUnit; } @@ -1072,7 +1327,7 @@ public: zerostruct (timeStamp); timeStamp.mSampleTime = 0; - timeStamp.mHostTime = GetCurrentHostTime (0, newSampleRate, isAUv3); + timeStamp.mHostTime = mach_absolute_time(); timeStamp.mFlags = kAudioTimeStampSampleTimeValid | kAudioTimeStampHostTimeValid; wasPlaying = false; @@ -1111,9 +1366,9 @@ public: { if (prepared) { - AudioUnitUninitialize (audioUnit); resetBuses(); AudioUnitReset (audioUnit, kAudioUnitScope_Global, 0); + AudioUnitUninitialize (audioUnit); outputBufferList.clear(); prepared = false; @@ -1130,6 +1385,20 @@ public: void processAudio (AudioBuffer& buffer, MidiBuffer& midiMessages, bool processBlockBypassedCalled) { + auto* playhead = getPlayHead(); + const auto position = playhead != nullptr ? playhead->getPosition() : nullopt; + + if (const auto hostTimeNs = position.hasValue() ? position->getHostTimeNs() : nullopt) + { + timeStamp.mHostTime = *hostTimeNs; + timeStamp.mFlags |= kAudioTimeStampHostTimeValid; + } + else + { + timeStamp.mHostTime = 0; + timeStamp.mFlags &= ~kAudioTimeStampHostTimeValid; + } + // If these are hit, we might allocate in the process block! jassert (buffer.getNumChannels() <= preparedChannels); jassert (buffer.getNumSamples() <= preparedSamples); @@ -1138,7 +1407,7 @@ public: // to the following bus. inputBuffer.makeCopyOf (buffer, true); - auto numSamples = buffer.getNumSamples(); + const auto numSamples = buffer.getNumSamples(); if (auSupportsBypass) { @@ -1152,8 +1421,6 @@ public: if (prepared) { - timeStamp.mHostTime = GetCurrentHostTime (numSamples, getSampleRate(), isAUv3); - const auto numOutputBuses = getBusCount (false); for (int i = 0; i < numOutputBuses; ++i) @@ -1593,10 +1860,11 @@ public: private: //============================================================================== - friend class AudioUnitPluginWindowCarbon; friend class AudioUnitPluginWindowCocoa; friend class AudioUnitPluginFormat; + CoreAudioTimeConversions timeConversions; + AudioComponentDescription componentDesc; AudioComponent auComponent; String pluginName, manufacturer, version; @@ -2033,12 +2301,10 @@ private: { if (auto* ph = getPlayHead()) { - AudioPlayHead::CurrentPositionInfo result; - - if (ph->getCurrentPosition (result)) + if (const auto pos = ph->getPosition()) { - setIfNotNull (outCurrentBeat, result.ppqPosition); - setIfNotNull (outCurrentTempo, result.bpm); + setIfNotNull (outCurrentBeat, pos->getPpqPosition().orFallback (0.0)); + setIfNotNull (outCurrentTempo, pos->getBpm().orFallback (0.0)); return noErr; } } @@ -2053,14 +2319,13 @@ private: { if (auto* ph = getPlayHead()) { - AudioPlayHead::CurrentPositionInfo result; - - if (ph->getCurrentPosition (result)) + if (const auto pos = ph->getPosition()) { + const auto signature = pos->getTimeSignature().orFallback (AudioPlayHead::TimeSignature{}); setIfNotNull (outDeltaSampleOffsetToNextBeat, (UInt32) 0); //xxx - setIfNotNull (outTimeSig_Numerator, (UInt32) result.timeSigNumerator); - setIfNotNull (outTimeSig_Denominator, (UInt32) result.timeSigDenominator); - setIfNotNull (outCurrentMeasureDownBeat, result.ppqPositionOfLastBarStart); //xxx wrong + setIfNotNull (outTimeSig_Numerator, (UInt32) signature.numerator); + setIfNotNull (outTimeSig_Denominator, (UInt32) signature.denominator); + setIfNotNull (outCurrentMeasureDownBeat, pos->getPpqPositionOfLastBarStart().orFallback (0.0)); //xxx wrong return noErr; } } @@ -2146,29 +2411,6 @@ private: } //============================================================================== - static UInt64 GetCurrentHostTime (int numSamples, double sampleRate, bool isAUv3) noexcept - { - #if ! JUCE_IOS - if (! isAUv3) - return AudioGetCurrentHostTime(); - #else - ignoreUnused (isAUv3); - #endif - - UInt64 currentTime = mach_absolute_time(); - static mach_timebase_info_data_t sTimebaseInfo = { 0, 0 }; - - if (sTimebaseInfo.denom == 0) - mach_timebase_info (&sTimebaseInfo); - - auto bufferNanos = static_cast (numSamples) * 1.0e9 / sampleRate; - auto bufferTicks = static_cast (std::ceil (bufferNanos * (static_cast (sTimebaseInfo.denom) - / static_cast (sTimebaseInfo.numer)))); - currentTime += bufferTicks; - - return currentTime; - } - bool isBusCountWritable (bool isInput) const noexcept { UInt32 countSize; @@ -2552,7 +2794,10 @@ private: { const auto viewSize = [&controller] { - auto size = [controller preferredContentSize]; + auto size = CGSizeZero; + + if (@available (macOS 10.11, *)) + size = [controller preferredContentSize]; if (size.width == 0 || size.height == 0) size = controller.view.frame.size; @@ -2590,162 +2835,12 @@ private: } }; -#if JUCE_SUPPORT_CARBON - -//============================================================================== -class AudioUnitPluginWindowCarbon : public AudioProcessorEditor -{ -public: - AudioUnitPluginWindowCarbon (AudioUnitPluginInstance& p) - : AudioProcessorEditor (&p), - plugin (p), - audioComponent (nullptr), - viewComponent (nullptr) - { - innerWrapper.reset (new InnerWrapperComponent (*this)); - addAndMakeVisible (innerWrapper.get()); - - setOpaque (true); - setVisible (true); - setSize (400, 300); - - UInt32 propertySize; - if (AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_GetUIComponentList, - kAudioUnitScope_Global, 0, &propertySize, NULL) == noErr - && propertySize > 0) - { - HeapBlock views (propertySize / sizeof (AudioComponentDescription)); - - if (AudioUnitGetProperty (plugin.audioUnit, kAudioUnitProperty_GetUIComponentList, - kAudioUnitScope_Global, 0, &views[0], &propertySize) == noErr) - { - audioComponent = AudioComponentFindNext (nullptr, &views[0]); - } - } - } - - ~AudioUnitPluginWindowCarbon() - { - innerWrapper = nullptr; - - if (isValid()) - plugin.editorBeingDeleted (this); - } - - bool isValid() const noexcept { return audioComponent != nullptr; } - - //============================================================================== - void paint (Graphics& g) override - { - g.fillAll (Colours::black); - } - - void resized() override - { - if (innerWrapper != nullptr) - innerWrapper->setSize (getWidth(), getHeight()); - } - - //============================================================================== - bool keyStateChanged (bool) override { return false; } - bool keyPressed (const KeyPress&) override { return false; } - - //============================================================================== - AudioUnit getAudioUnit() const { return plugin.audioUnit; } - - AudioUnitCarbonView getViewComponent() - { - if (viewComponent == nullptr && audioComponent != nullptr) - AudioComponentInstanceNew (audioComponent, &viewComponent); - - return viewComponent; - } - - void closeViewComponent() - { - if (viewComponent != nullptr) - { - JUCE_AU_LOG ("Closing AU GUI: " + plugin.getName()); - - AudioComponentInstanceDispose (viewComponent); - viewComponent = nullptr; - } - } - -private: - //============================================================================== - AudioUnitPluginInstance& plugin; - AudioComponent audioComponent; - AudioUnitCarbonView viewComponent; - - //============================================================================== - class InnerWrapperComponent : public CarbonViewWrapperComponent - { - public: - InnerWrapperComponent (AudioUnitPluginWindowCarbon& w) : owner (w) {} - - ~InnerWrapperComponent() - { - deleteWindow(); - } - - HIViewRef attachView (WindowRef windowRef, HIViewRef rootView) override - { - JUCE_AU_LOG ("Opening AU GUI: " + owner.plugin.getName()); - - AudioUnitCarbonView carbonView = owner.getViewComponent(); - - if (carbonView == 0) - return 0; - - Float32Point pos = { 0, 0 }; - Float32Point size = { 250, 200 }; - HIViewRef pluginView = 0; - - AudioUnitCarbonViewCreate (carbonView, owner.getAudioUnit(), windowRef, rootView, - &pos, &size, (ControlRef*) &pluginView); - - return pluginView; - } - - void removeView (HIViewRef) override - { - owner.closeViewComponent(); - } - - private: - AudioUnitPluginWindowCarbon& owner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InnerWrapperComponent) - }; - - friend class InnerWrapperComponent; - std::unique_ptr innerWrapper; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioUnitPluginWindowCarbon) -}; - -#endif - //============================================================================== AudioProcessorEditor* AudioUnitPluginInstance::createEditor() { std::unique_ptr w (new AudioUnitPluginWindowCocoa (*this, false)); if (! static_cast (w.get())->isValid()) - w.reset(); - - #if JUCE_SUPPORT_CARBON - if (w == nullptr) - { - w.reset (new AudioUnitPluginWindowCarbon (*this)); - - if (! static_cast (w.get())->isValid()) - w.reset(); - } - #endif - - if (w == nullptr) w.reset (new AudioUnitPluginWindowCocoa (*this, true)); // use AUGenericView as a fallback return w.release(); @@ -2791,92 +2886,54 @@ void AudioUnitPluginFormat::createPluginInstance (const PluginDescription& desc, double rate, int blockSize, PluginCreationCallback callback) { - using namespace AudioUnitFormatHelpers; + auto auComponentResult = getAudioComponent (*this, desc); - if (fileMightContainThisPluginType (desc.fileOrIdentifier)) + if (! auComponentResult.isValid()) { - String pluginName, version, manufacturer; - AudioComponentDescription componentDesc; - AudioComponent auComponent; - String errMessage = NEEDS_TRANS ("Cannot find AudioUnit from description"); - - if ((! getComponentDescFromIdentifier (desc.fileOrIdentifier, componentDesc, pluginName, version, manufacturer)) - && (! getComponentDescFromFile (desc.fileOrIdentifier, componentDesc, pluginName, version, manufacturer))) - { - callback (nullptr, errMessage); - return; - } - - if ((auComponent = AudioComponentFindNext (nullptr, &componentDesc)) == nullptr) - { - callback (nullptr, errMessage); - return; - } + callback (nullptr, std::move (auComponentResult.errorMessage)); + return; + } - if (AudioComponentGetDescription (auComponent, &componentDesc) != noErr) - { - callback (nullptr, errMessage); - return; - } + createAudioUnit (auComponentResult.component, + [rate, blockSize, origCallback = std::move (callback)] (AudioUnit audioUnit, OSStatus err) + { + if (err == noErr) + { + auto instance = std::make_unique (audioUnit); - struct AUAsyncInitializationCallback - { - typedef void (^AUCompletionCallbackBlock)(AudioComponentInstance, OSStatus); + if (instance->initialise (rate, blockSize)) + origCallback (std::move (instance), {}); + else + origCallback (nullptr, NEEDS_TRANS ("Unable to initialise the AudioUnit plug-in")); + } + else + { + auto errMsg = TRANS ("An OS error occurred during initialisation of the plug-in (XXX)"); + origCallback (nullptr, errMsg.replace ("XXX", String (err))); + } + }); +} - AUAsyncInitializationCallback (double inSampleRate, int inFramesPerBuffer, - PluginCreationCallback inOriginalCallback) - : sampleRate (inSampleRate), framesPerBuffer (inFramesPerBuffer), - originalCallback (std::move (inOriginalCallback)) - { - block = CreateObjCBlock (this, &AUAsyncInitializationCallback::completion); - } +void AudioUnitPluginFormat::createARAFactoryAsync (const PluginDescription& desc, ARAFactoryCreationCallback callback) +{ + auto auComponentResult = getAudioComponent (*this, desc); - AUCompletionCallbackBlock getBlock() noexcept { return block; } + if (! auComponentResult.isValid()) + { + callback ({ {}, "Failed to create AudioComponent for " + desc.descriptiveName }); + return; + } - void completion (AudioComponentInstance audioUnit, OSStatus err) + getOrCreateARAAudioUnit (auComponentResult.component, [cb = std::move (callback)] (auto dylibKeepAliveAudioUnit) + { + cb ([&]() -> ARAFactoryResult { - if (err == noErr) - { - std::unique_ptr instance (new AudioUnitPluginInstance (audioUnit)); - - if (instance->initialise (sampleRate, framesPerBuffer)) - originalCallback (std::move (instance), {}); - else - originalCallback (nullptr, NEEDS_TRANS ("Unable to initialise the AudioUnit plug-in")); - } - else - { - auto errMsg = TRANS ("An OS error occurred during initialisation of the plug-in (XXX)"); - originalCallback (nullptr, errMsg.replace ("XXX", String (err))); - } + if (dylibKeepAliveAudioUnit != nullptr) + return { ARAFactoryWrapper { ::juce::getARAFactory (std::move (dylibKeepAliveAudioUnit)) }, "" }; - delete this; - } - - double sampleRate; - int framesPerBuffer; - PluginCreationCallback originalCallback; - ObjCBlock block; - }; - - auto callbackBlock = new AUAsyncInitializationCallback (rate, blockSize, std::move (callback)); - - if ((componentDesc.componentFlags & kAudioComponentFlag_IsV3AudioUnit) != 0) - { - AudioComponentInstantiate (auComponent, kAudioComponentInstantiation_LoadOutOfProcess, - callbackBlock->getBlock()); - - return; - } - - AudioComponentInstance audioUnit; - auto err = AudioComponentInstanceNew(auComponent, &audioUnit); - callbackBlock->completion (err != noErr ? nullptr : audioUnit, err); - } - else - { - callback (nullptr, NEEDS_TRANS ("Plug-in description is not an AudioUnit plug-in")); - } + return { {}, "Failed to create ARAFactory from the provided AudioUnit" }; + }()); + }); } bool AudioUnitPluginFormat::requiresUnblockedMessageThreadDuringCreation (const PluginDescription& desc) const @@ -2890,8 +2947,10 @@ bool AudioUnitPluginFormat::requiresUnblockedMessageThreadDuringCreation (const pluginName, version, manufacturer)) { if (AudioComponent auComp = AudioComponentFindNext (nullptr, &componentDesc)) + { if (AudioComponentGetDescription (auComp, &componentDesc) == noErr) - return ((componentDesc.componentFlags & kAudioComponentFlag_IsV3AudioUnit) != 0); + return AudioUnitFormatHelpers::isPluginAUv3 (componentDesc); + } } return false; @@ -2923,11 +2982,7 @@ StringArray AudioUnitPluginFormat::searchPathsForPlugins (const FileSearchPath&, || desc.componentType == kAudioUnitType_Mixer || desc.componentType == kAudioUnitType_MIDIProcessor) { - ignoreUnused (allowPluginsWhichRequireAsynchronousInstantiation); - - const auto isAUv3 = ((desc.componentFlags & kAudioComponentFlag_IsV3AudioUnit) != 0); - - if (allowPluginsWhichRequireAsynchronousInstantiation || ! isAUv3) + if (allowPluginsWhichRequireAsynchronousInstantiation || ! AudioUnitFormatHelpers::isPluginAUv3 (desc)) result.add (AudioUnitFormatHelpers::createPluginIdentifier (desc)); } } diff --git a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp index f06e0781..cec1528a 100644 --- a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h index 52b0e7dc..102f9422 100644 --- a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h +++ b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/format_types/juce_LV2Common.h b/modules/juce_audio_processors/format_types/juce_LV2Common.h new file mode 100644 index 00000000..d3f3275d --- /dev/null +++ b/modules/juce_audio_processors/format_types/juce_LV2Common.h @@ -0,0 +1,621 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#pragma once + +#ifndef DOXYGEN + +#include "juce_lv2_config.h" + +#ifdef Bool + #undef Bool // previously defined in X11/Xlib.h +#endif + +#ifdef verify + #undef verify // previously defined in macOS 10.11 SDK +#endif + +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wzero-as-null-pointer-constant", + "-Wcast-align", + "-Wparentheses", + "-Wnullability-extension", + "-Wsign-conversion") + +extern "C" +{ + #include "lilv/lilv/lilv.h" + #include "lv2/atom/atom.h" + #include "lv2/atom/forge.h" + #include "lv2/atom/util.h" + #include "lv2/buf-size/buf-size.h" + #include "lv2/data-access/data-access.h" + #include "lv2/dynmanifest/dynmanifest.h" + #include "lv2/instance-access/instance-access.h" + #include "lv2/log/log.h" + #include "lv2/midi/midi.h" + #include "lv2/options/options.h" + #include "lv2/parameters/parameters.h" + #include "lv2/patch/patch.h" + #include "lv2/port-groups/port-groups.h" + #include "lv2/presets/presets.h" + #include "lv2/resize-port/resize-port.h" + #include "lv2/state/state.h" + #include "lv2/time/time.h" + #include "lv2/ui/ui.h" + #include "lv2/units/units.h" + #include "lv2/worker/worker.h" + #include "serd/serd/serd.h" +} + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +#include +#include + +namespace juce +{ +namespace lv2_shared +{ + +class AtomForge +{ +public: + explicit AtomForge (LV2_URID_Map m) + : map { m }, + chunk { map.map (map.handle, LV2_ATOM__Chunk) } + { + lv2_atom_forge_init (&forge, &map); + } + + void setBuffer (void* buf, size_t size) + { + lv2_atom_forge_set_buffer (&forge, static_cast (buf), size); + } + + LV2_Atom_Forge* get() { return &forge; } + const LV2_Atom_Forge* get() const { return &forge; } + + void writeChunk (uint32_t size) + { + lv2_atom_forge_atom (&forge, size, chunk); + } + +private: + LV2_URID_Map map; + LV2_Atom_Forge forge; + const LV2_URID chunk; + + JUCE_LEAK_DETECTOR (AtomForge) +}; + +template +struct ScopedFrame +{ + template + explicit ScopedFrame (LV2_Atom_Forge* f, Args&&... args) + : forge (f) + { + Constructor::construct (forge, &frame, std::forward (args)...); + } + + ~ScopedFrame() { lv2_atom_forge_pop (forge, &frame); } + + LV2_Atom_Forge_Frame frame; + LV2_Atom_Forge* forge = nullptr; + + JUCE_DECLARE_NON_COPYABLE (ScopedFrame) + JUCE_DECLARE_NON_MOVEABLE (ScopedFrame) + JUCE_LEAK_DETECTOR (ScopedFrame) +}; + +struct SequenceTraits { static constexpr auto construct = lv2_atom_forge_sequence_head; }; +struct ObjectTraits { static constexpr auto construct = lv2_atom_forge_object; }; + +using SequenceFrame = ScopedFrame; +using ObjectFrame = ScopedFrame; + +struct NumericAtomParser +{ + explicit NumericAtomParser (LV2_URID_Map mapFeatureIn) + : mapFeature (mapFeatureIn) {} + + template struct Tag { LV2_URID urid; }; + + template + static Optional tryParse (const LV2_Atom&, const void*) + { + return {}; + } + + template + static Optional tryParse (const LV2_Atom& atom, const void* data, Tag head, Tag... tail) + { + if (atom.type == head.urid && atom.size == sizeof (Head)) + return static_cast (*reinterpret_cast (data)); + + return tryParse (atom, data, tail...); + } + + template + Optional parseNumericAtom (const LV2_Atom* atom, const void* data) const + { + if (atom == nullptr) + return {}; + + return tryParse (*atom, + data, + Tag { mLV2_ATOM__Bool }, + Tag { mLV2_ATOM__Int }, + Tag { mLV2_ATOM__Long }, + Tag { mLV2_ATOM__Float }, + Tag { mLV2_ATOM__Double }); + } + + template + Optional parseNumericAtom (const LV2_Atom* atom) const + { + return parseNumericAtom (atom, atom + 1); + } + + template + Optional parseNumericOption (const LV2_Options_Option* option) const + { + if (option != nullptr) + { + const LV2_Atom atom { option->size, option->type }; + return parseNumericAtom (&atom, option->value); + } + + return {}; + } + + LV2_URID map (const char* str) const { return mapFeature.map (mapFeature.handle, str); } + + const LV2_URID_Map mapFeature; + #define X(str) const LV2_URID m##str = map (str); + X (LV2_ATOM__Double) + X (LV2_ATOM__Float) + X (LV2_ATOM__Int) + X (LV2_ATOM__Long) + X (LV2_ATOM__Bool) + #undef X + + JUCE_LEAK_DETECTOR (NumericAtomParser) +}; + +//============================================================================== +struct PatchSetHelper +{ + PatchSetHelper (LV2_URID_Map mapFeatureIn, const char* pluginUri) + : parser (mapFeatureIn), + pluginUrid (parser.map (pluginUri)) + {} + + bool isPlugin (const LV2_Atom* subject) const + { + if (subject == nullptr) + return true; + + return subject->type == mLV2_ATOM__URID + && reinterpret_cast (subject)->body == pluginUrid; + } + + template + void processPatchSet (const LV2_Atom_Object* object, Callback&& callback) + { + if (object->body.otype != mLV2_PATCH__Set) + return; + + const LV2_Atom* subject = nullptr; + const LV2_Atom* property = nullptr; + const LV2_Atom* value = nullptr; + + LV2_Atom_Object_Query query[] { { mLV2_PATCH__subject, &subject }, + { mLV2_PATCH__property, &property }, + { mLV2_PATCH__value, &value }, + LV2_ATOM_OBJECT_QUERY_END }; + + lv2_atom_object_query (object, query); + + if (! isPlugin (subject)) + return; + + setPluginProperty (property, value, std::forward (callback)); + } + + template + void processPatchSet (const LV2_Atom_Event* event, Callback&& callback) + { + if (event->body.type == mLV2_ATOM__Object) + processPatchSet (reinterpret_cast (&event->body), std::forward (callback)); + } + + template + void setPluginProperty (const LV2_Atom* property, const LV2_Atom* value, Callback&& callback) + { + if (property == nullptr) + { + // No property was supplied. + jassertfalse; + return; + } + + if (property->type != mLV2_ATOM__URID) + { + // Set property is not a URID. + jassertfalse; + return; + } + + const auto parseResult = parser.parseNumericAtom (value); + + if (! parseResult.hasValue()) + { + // Didn't understand the type of this atom. + jassertfalse; + return; + } + + callback.setParameter (reinterpret_cast (property)->body, *parseResult); + } + + NumericAtomParser parser; + LV2_URID pluginUrid; + #define X(str) const LV2_URID m##str = parser.map (str); + X (LV2_ATOM__Bool) + X (LV2_ATOM__Object) + X (LV2_ATOM__URID) + X (LV2_PATCH__Set) + X (LV2_PATCH__property) + X (LV2_PATCH__subject) + X (LV2_PATCH__value) + #undef X + + JUCE_LEAK_DETECTOR (PatchSetHelper) +}; + +//============================================================================== +template +class Iterator +{ + using Container = typename Traits::Container; + using Iter = typename Traits::Iter; + +public: + using difference_type = ptrdiff_t; + using value_type = decltype (Traits::get (std::declval(), std::declval())); + using pointer = value_type*; + using reference = value_type; + using iterator_category = std::input_iterator_tag; + + /** Create iterator in end/sentinel state */ + Iterator() = default; + + /** Create iterator pointing to the beginning of this collection */ + explicit Iterator (Container p) noexcept + : container (p), iter (testEnd (Traits::begin (container))) {} + + Iterator begin() const noexcept { return *this; } + Iterator end() const noexcept { return {}; } + + bool operator== (const Iterator& other) const noexcept + { + return iter == nullptr && other.iter == nullptr; + } + + bool operator!= (const Iterator& other) const noexcept + { + return ! operator== (other); + } + + Iterator& operator++() + { + iter = testEnd (Traits::next (container, iter)); + return *this; + } + + Iterator operator++ (int) + { + auto copy = *this; + ++(*this); + return copy; + } + + reference operator*() const noexcept + { + return Traits::get (container, iter); + } + +private: + Iter testEnd (Iter i) const noexcept + { + return Traits::isEnd (container, i) ? Iter{} : i; + } + + Container container{}; + Iter iter{}; +}; + +//============================================================================== +struct SequenceWithSize +{ + SequenceWithSize() = default; + + SequenceWithSize (const LV2_Atom_Sequence_Body* bodyIn, size_t sizeIn) + : body (bodyIn), size (sizeIn) {} + + explicit SequenceWithSize (const LV2_Atom_Sequence* sequence) + : body (&sequence->body), size (sequence->atom.size) {} + + const LV2_Atom_Sequence_Body* body = nullptr; + size_t size = 0; + + JUCE_LEAK_DETECTOR (SequenceWithSize) +}; + +struct SequenceIteratorTraits +{ + using Container = SequenceWithSize; + using Iter = LV2_Atom_Event*; + + static LV2_Atom_Event* begin (const Container& s) noexcept + { + return lv2_atom_sequence_begin (s.body); + } + + static LV2_Atom_Event* next (const Container&, Iter it) noexcept + { + return lv2_atom_sequence_next (it); + } + + static bool isEnd (const Container& s, Iter it) noexcept + { + return lv2_atom_sequence_is_end (s.body, static_cast (s.size), it); + } + + static LV2_Atom_Event* get (const Container&, Iter e) noexcept { return e; } +}; + +using SequenceIterator = Iterator; + +const std::map channelDesignationMap +{ + { LV2_PORT_GROUPS__center, AudioChannelSet::ChannelType::centre }, + { LV2_PORT_GROUPS__centerLeft, AudioChannelSet::ChannelType::leftCentre }, + { LV2_PORT_GROUPS__centerRight, AudioChannelSet::ChannelType::rightCentre }, + { LV2_PORT_GROUPS__left, AudioChannelSet::ChannelType::left }, + { LV2_PORT_GROUPS__lowFrequencyEffects, AudioChannelSet::ChannelType::LFE }, + { LV2_PORT_GROUPS__rearCenter, AudioChannelSet::ChannelType::surround }, + { LV2_PORT_GROUPS__rearLeft, AudioChannelSet::ChannelType::leftSurroundRear }, + { LV2_PORT_GROUPS__rearRight, AudioChannelSet::ChannelType::rightSurroundRear }, + { LV2_PORT_GROUPS__right, AudioChannelSet::ChannelType::right }, + { LV2_PORT_GROUPS__sideLeft, AudioChannelSet::ChannelType::leftSurroundSide }, + { LV2_PORT_GROUPS__sideRight, AudioChannelSet::ChannelType::rightSurroundSide } +}; + +/* Useful for converting a `void*` to another type (X11 Window, function pointer etc.) without + invoking UB. +*/ +template +static auto wordCast (Word word) +{ + static_assert (sizeof (word) == sizeof (OtherWordType), "Word sizes must match"); + return readUnaligned (&word); +} + +//============================================================================== +struct SinglePortInfo +{ + uint32_t index; + AudioChannelSet::ChannelType designation; + bool optional; + + auto tie() const { return std::tie (index, designation, optional); } + bool operator== (const SinglePortInfo& other) const { return tie() == other.tie(); } + bool operator< (const SinglePortInfo& other) const { return index < other.index; } +}; + +struct ParsedGroup +{ + String uid; + std::set info; + + auto tie() const { return std::tie (uid, info); } + bool operator== (const ParsedGroup& other) const { return tie() == other.tie(); } + + static AudioChannelSet getEquivalentSet (const std::set& info) + { + const auto hasUnknownKind = [] (const SinglePortInfo& i) { return i.designation == AudioChannelSet::unknown; }; + + if (std::any_of (info.begin(), info.end(), hasUnknownKind)) + return AudioChannelSet::discreteChannels ((int) info.size()); + + AudioChannelSet result; + + for (const auto& port : info) + result.addChannel (port.designation); + + return result; + } + + AudioChannelSet getEquivalentSet() const noexcept { return getEquivalentSet (info); } + + bool isRequired() const + { + const auto getRequired = [] (const SinglePortInfo& i) { return ! i.optional; }; + return std::any_of (info.begin(), info.end(), getRequired); + } + + bool isCompatible (const AudioChannelSet& requestedBus) const + { + return requestedBus == getEquivalentSet() || (! isRequired() && requestedBus.isDisabled()); + } +}; + +struct ParsedBuses +{ + std::vector inputs, outputs; +}; + +class PortToAudioBufferMap +{ +public: + PortToAudioBufferMap (const AudioProcessor::BusesLayout& layout, const ParsedBuses& buses) + : PortToAudioBufferMap ({ layout.inputBuses, buses.inputs }, + { layout.outputBuses, buses.outputs }) + {} + + int getChannelForPort (uint32_t port) const + { + const auto it = ports.find (port); + return it != ports.end() ? it->second : -1; + } + +private: + PortToAudioBufferMap (const Array& host, + const std::vector& client) + : ports (getPortLayout (host, client)) + {} + + PortToAudioBufferMap (const PortToAudioBufferMap& inputs, + const PortToAudioBufferMap& outputs) + { + ports.insert (inputs.ports.begin(), inputs.ports.end()); + ports.insert (outputs.ports.begin(), outputs.ports.end()); + + // If this assertion is hit, some ports have duplicate indices + jassert (ports.size() == inputs.ports.size() + outputs.ports.size()); + } + + static std::map getPortLayout (const Array& layout, + const std::vector& parsedGroup) + { + if ((int) parsedGroup.size() != layout.size()) + { + // Something has gone very wrong when computing/applying bus layouts! + jassertfalse; + return {}; + } + + std::map result; + int channelOffsetOfBus = 0; + auto groupIterator = parsedGroup.begin(); + + for (const auto& bus : layout) + { + const auto& group = groupIterator->info; + + for (const auto& port : group) + { + const auto index = bus.getChannelIndexForType (port.designation); + + if (index >= 0) + result.emplace (port.index, channelOffsetOfBus + index); + } + + channelOffsetOfBus += bus.size(); + ++groupIterator; + } + + if ((int) result.size() != channelOffsetOfBus) + { + jassertfalse; + return {}; + } + + return result; + } + + std::map ports; + + JUCE_LEAK_DETECTOR (PortToAudioBufferMap) +}; + +// This will convert some grouped and ungrouped ports into a single collection of +// buses with a stable order. +// If any group has been marked as the main group, this will be placed first in the +// collection of results. The remaining groups will be sorted according to the +// indices of their ports. +// If there are no groups, all mandatory ports will be grouped into the first bus, +// and all remaining optional ports will have a separate bus each. +static inline std::vector findStableBusOrder (const String& mainGroupUid, + const std::map>& groupedPorts, + const std::set& ungroupedPorts) +{ + if (groupedPorts.empty()) + { + std::vector result; + + ParsedGroup mandatoryPorts; + + for (const auto& port : ungroupedPorts) + if (! port.optional) + mandatoryPorts.info.insert (port); + + if (! mandatoryPorts.info.empty()) + result.push_back (std::move (mandatoryPorts)); + + for (const auto& port : ungroupedPorts) + if (port.optional) + result.push_back ({ String{}, { port } }); + + return result; + } + + std::vector result; + + const auto pushGroup = [&] (const std::pair>& info) + { + result.push_back ({ info.first, info.second }); + }; + + const auto mainGroupIterator = groupedPorts.find (mainGroupUid); + + if (mainGroupIterator != groupedPorts.end()) + pushGroup (*mainGroupIterator); + + for (auto it = groupedPorts.begin(); it != groupedPorts.end(); ++it) + if (it != mainGroupIterator) + pushGroup (*it); + + for (const auto& info : ungroupedPorts) + result.push_back ({ String{}, { info } }); + + if (! result.empty()) + { + // It is an error for the same port to be a member of multiple groups. + // Therefore, a standard sort will always be stable, and we don't need to + // use an explicitly stable sort. + const auto compare = [] (const ParsedGroup& a, const ParsedGroup& b) { return a.info < b.info; }; + std::sort (std::next (result.begin()), result.end(), compare); + } + + return result; +} + +} +} + +#endif diff --git a/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp new file mode 100644 index 00000000..53419384 --- /dev/null +++ b/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp @@ -0,0 +1,5614 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#if JUCE_PLUGINHOST_LV2 + +#include "juce_LV2Common.h" +#include "juce_LV2Resources.h" + +#include + +#include + +namespace juce +{ +namespace lv2_host +{ + +template +auto with (Struct s, Value Struct::* member, Value value) noexcept +{ + s.*member = std::move (value); + return s; +} + +/* Converts a void* to an LV2_Atom* if the buffer looks like it holds a well-formed Atom, or + returns nullptr otherwise. +*/ +static const LV2_Atom* convertToAtomPtr (const void* ptr, size_t size) +{ + if (size < sizeof (LV2_Atom)) + { + jassertfalse; + return nullptr; + } + + const auto header = readUnaligned (ptr); + + if (size < header.size + sizeof (LV2_Atom)) + { + jassertfalse; + return nullptr; + } + + // This is UB _if_ the ptr doesn't really point to an LV2_Atom. + return reinterpret_cast (ptr); +} + +// Allows mutable access to the items in a vector, without allowing the vector itself +// to be modified. +template +class SimpleSpan +{ +public: + constexpr SimpleSpan (T* beginIn, T* endIn) : b (beginIn), e (endIn) {} + + constexpr auto begin() const { return b; } + constexpr auto end() const { return e; } + + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4814) + constexpr auto& operator[] (size_t index) { return b[index]; } + JUCE_END_IGNORE_WARNINGS_MSVC + + constexpr auto size() const { return (size_t) (e - b); } + +private: + T* b; + T* e; +}; + +template +constexpr auto makeSimpleSpan (T* b, T* e) { return SimpleSpan { b, e }; } + +template +constexpr auto makeSimpleSpan (R& r) { return makeSimpleSpan (r.data(), r.data() + r.size()); } + +struct PhysicalResizeListener +{ + virtual ~PhysicalResizeListener() = default; + virtual void viewRequestedResizeInPhysicalPixels (int width, int height) = 0; +}; + +struct LogicalResizeListener +{ + virtual ~LogicalResizeListener() = default; + virtual void viewRequestedResizeInLogicalPixels (int width, int height) = 0; +}; + +#if JUCE_WINDOWS +class WindowSizeChangeDetector +{ +public: + WindowSizeChangeDetector() + : hook (SetWindowsHookEx (WH_CALLWNDPROC, + callWndProc, + (HINSTANCE) juce::Process::getCurrentModuleInstanceHandle(), + GetCurrentThreadId())) + {} + + ~WindowSizeChangeDetector() noexcept + { + UnhookWindowsHookEx (hook); + } + + static void addListener (HWND hwnd, PhysicalResizeListener& listener) + { + getActiveEditors().emplace (hwnd, &listener); + } + + static void removeListener (HWND hwnd) + { + getActiveEditors().erase (hwnd); + } + +private: + static std::map& getActiveEditors() + { + static std::map map; + return map; + } + + static void processMessage (int nCode, const CWPSTRUCT* info) + { + if (nCode < 0 || info == nullptr) + return; + + constexpr UINT events[] { WM_SIZING, WM_SIZE, WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED }; + + if (std::find (std::begin (events), std::end (events), info->message) == std::end (events)) + return; + + auto& map = getActiveEditors(); + auto iter = map.find (info->hwnd); + + if (iter == map.end()) + return; + + RECT rect; + GetWindowRect (info->hwnd, &rect); + iter->second->viewRequestedResizeInPhysicalPixels (rect.right - rect.left, rect.bottom - rect.top); + } + + static LRESULT CALLBACK callWndProc (int nCode, WPARAM wParam, LPARAM lParam) + { + processMessage (nCode, lv2_shared::wordCast (lParam)); + return CallNextHookEx ({}, nCode, wParam, lParam); + } + + HHOOK hook; +}; + +class WindowSizeChangeListener +{ +public: + WindowSizeChangeListener (HWND hwndIn, PhysicalResizeListener& l) + : hwnd (hwndIn) + { + detector->addListener (hwnd, l); + } + + ~WindowSizeChangeListener() + { + detector->removeListener (hwnd); + } + +private: + SharedResourcePointer detector; + HWND hwnd; + + JUCE_LEAK_DETECTOR (WindowSizeChangeListener) +}; +#endif + +struct FreeLilvNode +{ + void operator() (LilvNode* ptr) const noexcept { lilv_node_free (ptr); } +}; + +using OwningNode = std::unique_ptr; + +template +class TypesafeLilvNode +{ +public: + template + TypesafeLilvNode (Ts&&... ts) + : node (Traits::construct (std::forward (ts)...)) {} + + bool equals (const TypesafeLilvNode& other) const noexcept + { + return lilv_node_equals (node.get(), other.node.get()); + } + + const LilvNode* get() const noexcept { return node.get(); } + + auto getTyped() const noexcept -> decltype (Traits::access (nullptr)) + { + return Traits::access (node.get()); + } + + static TypesafeLilvNode claim (LilvNode* node) + { + return TypesafeLilvNode { node }; + } + + static TypesafeLilvNode copy (const LilvNode* node) + { + return TypesafeLilvNode { lilv_node_duplicate (node) }; + } + +private: + explicit TypesafeLilvNode (LilvNode* ptr) + : node (ptr) + { + jassert (ptr == nullptr || Traits::verify (node.get())); + } + + OwningNode node; + + JUCE_LEAK_DETECTOR (TypesafeLilvNode) +}; + +struct UriConstructorTrait +{ + static LilvNode* construct (LilvWorld* world, const char* uri) noexcept + { + return lilv_new_uri (world, uri); + } + + static LilvNode* construct (LilvWorld* world, const char* host, const char* path) noexcept + { + return lilv_new_file_uri (world, host, path); + } + + static constexpr auto verify = lilv_node_is_uri; + static constexpr auto access = lilv_node_as_uri; +}; + +struct StringConstructorTrait { static constexpr auto construct = lilv_new_string; + static constexpr auto verify = lilv_node_is_string; + static constexpr auto access = lilv_node_as_string; }; + +using NodeUri = TypesafeLilvNode; +using NodeString = TypesafeLilvNode; + +struct UsefulUris +{ + explicit UsefulUris (LilvWorld* worldIn) + : world (worldIn) {} + + LilvWorld* const world = nullptr; + + #define X(str) const NodeUri m##str { world, str }; + X (LV2_ATOM__AtomPort) + X (LV2_ATOM__atomTransfer) + X (LV2_ATOM__eventTransfer) + X (LV2_CORE__AudioPort) + X (LV2_CORE__CVPort) + X (LV2_CORE__ControlPort) + X (LV2_CORE__GeneratorPlugin) + X (LV2_CORE__InputPort) + X (LV2_CORE__InstrumentPlugin) + X (LV2_CORE__OutputPort) + X (LV2_CORE__enumeration) + X (LV2_CORE__integer) + X (LV2_CORE__toggled) + X (LV2_RESIZE_PORT__minimumSize) + X (LV2_UI__floatProtocol) + X (LV2_WORKER__interface) + #undef X +}; + +template +struct OwningPtrTraits +{ + using type = std::unique_ptr; + static const Ptr* get (const type& t) noexcept { return t.get(); } +}; + +template +struct NonOwningPtrTraits +{ + using type = const Ptr*; + static const Ptr* get (const type& t) noexcept { return t; } +}; + +struct PluginsIteratorTraits +{ + using Container = const LilvPlugins*; + using Iter = LilvIter*; + static constexpr auto begin = lilv_plugins_begin; + static constexpr auto next = lilv_plugins_next; + static constexpr auto isEnd = lilv_plugins_is_end; + static constexpr auto get = lilv_plugins_get; +}; + +using PluginsIterator = lv2_shared::Iterator; + +struct PluginClassesIteratorTraits +{ + using Container = const LilvPluginClasses*; + using Iter = LilvIter*; + static constexpr auto begin = lilv_plugin_classes_begin; + static constexpr auto next = lilv_plugin_classes_next; + static constexpr auto isEnd = lilv_plugin_classes_is_end; + static constexpr auto get = lilv_plugin_classes_get; +}; + +using PluginClassesIterator = lv2_shared::Iterator; + +struct NodesIteratorTraits +{ + using Container = const LilvNodes*; + using Iter = LilvIter*; + static constexpr auto begin = lilv_nodes_begin; + static constexpr auto next = lilv_nodes_next; + static constexpr auto isEnd = lilv_nodes_is_end; + static constexpr auto get = lilv_nodes_get; +}; + +using NodesIterator = lv2_shared::Iterator; + +struct ScalePointsIteratorTraits +{ + using Container = const LilvScalePoints*; + using Iter = LilvIter*; + static constexpr auto begin = lilv_scale_points_begin; + static constexpr auto next = lilv_scale_points_next; + static constexpr auto isEnd = lilv_scale_points_is_end; + static constexpr auto get = lilv_scale_points_get; +}; + +using ScalePointsIterator = lv2_shared::Iterator; + +struct UisIteratorTraits +{ + using Container = const LilvUIs*; + using Iter = LilvIter*; + static constexpr auto begin = lilv_uis_begin; + static constexpr auto next = lilv_uis_next; + static constexpr auto isEnd = lilv_uis_is_end; + static constexpr auto get = lilv_uis_get; +}; + +using UisIterator = lv2_shared::Iterator; + +template +class NodesImpl +{ +public: + using type = typename PtrTraits::type; + + template + explicit NodesImpl (Ptr* ptr) + : nodes (type { ptr }) {} + + explicit NodesImpl (type ptr) + : nodes (std::move (ptr)) {} + + unsigned size() const noexcept { return lilv_nodes_size (PtrTraits::get (nodes)); } + + NodesIterator begin() const noexcept + { + return nodes == nullptr ? NodesIterator{} + : NodesIterator { PtrTraits::get (nodes) }; + } + + NodesIterator end() const noexcept { return {}; } + +private: + type nodes{}; +}; + +struct NodesFree +{ + void operator() (LilvNodes* ptr) const noexcept { lilv_nodes_free (ptr); } +}; + +using OwningNodes = NodesImpl>; +using NonOwningNodes = NodesImpl>; + +class ScalePoints +{ +public: + explicit ScalePoints (const LilvScalePoints* pt) + : points (pt) {} + + ScalePointsIterator begin() const noexcept + { + return points == nullptr ? ScalePointsIterator{} + : ScalePointsIterator { points }; + } + + ScalePointsIterator end() const noexcept { return {}; } + +private: + const LilvScalePoints* points = nullptr; +}; + +class ScalePoint +{ +public: + explicit ScalePoint (const LilvScalePoint* pt) + : point (pt) {} + + const LilvNode* getLabel() const noexcept { return lilv_scale_point_get_label (point); } + const LilvNode* getValue() const noexcept { return lilv_scale_point_get_value (point); } + +private: + const LilvScalePoint* point = nullptr; +}; + +struct PortRange +{ + float defaultValue, min, max; +}; + +class Port +{ +public: + enum class Kind + { + control, + audio, + cv, + atom, + unknown, + }; + + enum class Direction + { + input, + output, + unknown, + }; + + Port (const LilvPlugin* pluginIn, const LilvPort* portIn) + : plugin (pluginIn), port (portIn) {} + + Direction getDirection (const UsefulUris& uris) const noexcept + { + if (isA (uris.mLV2_CORE__InputPort)) + return Direction::input; + + if (isA (uris.mLV2_CORE__OutputPort)) + return Direction::output; + + return Direction::unknown; + } + + Kind getKind (const UsefulUris& uris) const noexcept + { + if (isA (uris.mLV2_CORE__ControlPort)) + return Kind::control; + + if (isA (uris.mLV2_CORE__AudioPort)) + return Kind::audio; + + if (isA (uris.mLV2_CORE__CVPort)) + return Kind::cv; + + if (isA (uris.mLV2_ATOM__AtomPort)) + return Kind::atom; + + return Kind::unknown; + } + + OwningNode get (const LilvNode* predicate) const noexcept + { + return OwningNode { lilv_port_get (plugin, port, predicate) }; + } + + NonOwningNodes getClasses() const noexcept + { + return NonOwningNodes { lilv_port_get_classes (plugin, port) }; + } + + NodeString getName() const noexcept + { + return NodeString::claim (lilv_port_get_name (plugin, port)); + } + + NodeString getSymbol() const noexcept + { + return NodeString::copy (lilv_port_get_symbol (plugin, port)); + } + + OwningNodes getProperties() const noexcept + { + return OwningNodes { lilv_port_get_properties (plugin, port) }; + } + + ScalePoints getScalePoints() const noexcept + { + return ScalePoints { lilv_port_get_scale_points (plugin, port) }; + } + + bool hasProperty (const NodeUri& uri) const noexcept + { + return lilv_port_has_property (plugin, port, uri.get()); + } + + uint32_t getIndex() const noexcept { return lilv_port_get_index (plugin, port); } + + static float getFloatValue (const LilvNode* node, float fallback) + { + if (lilv_node_is_float (node) || lilv_node_is_int (node)) + return lilv_node_as_float (node); + + return fallback; + } + + bool supportsEvent (const LilvNode* node) const noexcept + { + return lilv_port_supports_event (plugin, port, node); + } + + PortRange getRange() const noexcept + { + LilvNode* def = nullptr; + LilvNode* min = nullptr; + LilvNode* max = nullptr; + + lilv_port_get_range (plugin, port, &def, &min, &max); + + const OwningNode defOwner { def }; + const OwningNode minOwner { min }; + const OwningNode maxOwner { max }; + + return { getFloatValue (def, 0.0f), + getFloatValue (min, 0.0f), + getFloatValue (max, 1.0f) }; + } + + bool isValid() const noexcept { return port != nullptr; } + +private: + bool isA (const NodeUri& uri) const noexcept + { + return lilv_port_is_a (plugin, port, uri.get()); + } + + const LilvPlugin* plugin = nullptr; + const LilvPort* port = nullptr; + + JUCE_LEAK_DETECTOR (Port) +}; + +class Plugin +{ +public: + explicit Plugin (const LilvPlugin* p) : plugin (p) {} + + bool verify() const noexcept { return lilv_plugin_verify (plugin); } + NodeUri getUri() const noexcept { return NodeUri::copy (lilv_plugin_get_uri (plugin)); } + NodeUri getBundleUri() const noexcept { return NodeUri::copy (lilv_plugin_get_bundle_uri (plugin)); } + NodeUri getLibraryUri() const noexcept { return NodeUri::copy (lilv_plugin_get_library_uri (plugin)); } + NodeString getName() const noexcept { return NodeString::claim (lilv_plugin_get_name (plugin)); } + NodeString getAuthorName() const noexcept { return NodeString::claim (lilv_plugin_get_author_name (plugin)); } + uint32_t getNumPorts() const noexcept { return lilv_plugin_get_num_ports (plugin); } + const LilvPluginClass* getClass() const noexcept { return lilv_plugin_get_class (plugin); } + OwningNodes getValue (const LilvNode* predicate) const noexcept { return OwningNodes { lilv_plugin_get_value (plugin, predicate) }; } + + Port getPortByIndex (uint32_t index) const noexcept + { + return Port { plugin, lilv_plugin_get_port_by_index (plugin, index) }; + } + + Port getPortByDesignation (const LilvNode* portClass, const LilvNode* designation) const noexcept + { + return Port { plugin, lilv_plugin_get_port_by_designation (plugin, portClass, designation) }; + } + + OwningNodes getRequiredFeatures() const noexcept + { + return OwningNodes { lilv_plugin_get_required_features (plugin) }; + } + + OwningNodes getOptionalFeatures() const noexcept + { + return OwningNodes { lilv_plugin_get_optional_features (plugin) }; + } + + bool hasExtensionData (const NodeUri& uri) const noexcept + { + return lilv_plugin_has_extension_data (plugin, uri.get()); + } + + bool hasFeature (const NodeUri& uri) const noexcept + { + return lilv_plugin_has_feature (plugin, uri.get()); + } + + template + uint32_t getNumPortsOfClass (const Classes&... classes) const noexcept + { + return lilv_plugin_get_num_ports_of_class (plugin, classes.get()..., 0); + } + + const LilvPlugin* get() const noexcept { return plugin; } + + bool hasLatency() const noexcept { return lilv_plugin_has_latency (plugin); } + uint32_t getLatencyPortIndex() const noexcept { return lilv_plugin_get_latency_port_index (plugin); } + +private: + const LilvPlugin* plugin = nullptr; + + JUCE_LEAK_DETECTOR (Plugin) +}; + +/* + This is very similar to the symap implementation in jalv. +*/ +class SymbolMap +{ +public: + SymbolMap() = default; + + SymbolMap (std::initializer_list uris) + { + for (const auto* str : uris) + map (str); + } + + LV2_URID map (const char* uri) + { + const auto comparator = [this] (size_t index, const String& str) + { + return strings[index] < str; + }; + + const auto uriString = String::fromUTF8 (uri); + const auto it = std::lower_bound (indices.cbegin(), indices.cend(), uriString, comparator); + + if (it != indices.cend() && strings[*it] == uriString) + return static_cast (*it + 1); + + const auto index = strings.size(); + indices.insert (it, index); + strings.push_back (uriString); + return static_cast (index + 1); + } + + const char* unmap (LV2_URID urid) const + { + const auto index = urid - 1; + return index < strings.size() ? strings[index].toRawUTF8() + : nullptr; + } + + static LV2_URID mapUri (LV2_URID_Map_Handle handle, const char* uri) + { + return static_cast (handle)->map (uri); + } + + static const char* unmapUri (LV2_URID_Unmap_Handle handle, LV2_URID urid) + { + return static_cast (handle)->unmap (urid); + } + + LV2_URID_Map getMapFeature() { return { this, mapUri }; } + LV2_URID_Unmap getUnmapFeature() { return { this, unmapUri }; } + +private: + std::vector strings; + std::vector indices; + + JUCE_LEAK_DETECTOR (SymbolMap) +}; + +struct UsefulUrids +{ + explicit UsefulUrids (SymbolMap& m) : symap (m) {} + + SymbolMap& symap; + + #define X(token) const LV2_URID m##token = symap.map (token); + X (LV2_ATOM__Bool) + X (LV2_ATOM__Double) + X (LV2_ATOM__Float) + X (LV2_ATOM__Int) + X (LV2_ATOM__Long) + X (LV2_ATOM__Object) + X (LV2_ATOM__Sequence) + X (LV2_ATOM__atomTransfer) + X (LV2_ATOM__beatTime) + X (LV2_ATOM__eventTransfer) + X (LV2_ATOM__frameTime) + X (LV2_LOG__Error) + X (LV2_LOG__Note) + X (LV2_LOG__Trace) + X (LV2_LOG__Warning) + X (LV2_MIDI__MidiEvent) + X (LV2_PATCH__Set) + X (LV2_PATCH__property) + X (LV2_PATCH__value) + X (LV2_STATE__StateChanged) + X (LV2_TIME__Position) + X (LV2_TIME__barBeat) + X (LV2_TIME__beat) + X (LV2_TIME__beatUnit) + X (LV2_TIME__beatsPerBar) + X (LV2_TIME__beatsPerMinute) + X (LV2_TIME__frame) + X (LV2_TIME__speed) + X (LV2_TIME__bar) + X (LV2_UI__floatProtocol) + X (LV2_UNITS__beat) + X (LV2_UNITS__frame) + #undef X +}; + +class Log +{ +public: + explicit Log (const UsefulUrids* u) : urids (u) {} + + LV2_Log_Log* getLogFeature() { return &logFeature; } + +private: + int vprintfCallback (LV2_URID type, const char* fmt, va_list ap) const + { + // If this is hit, the plugin has encountered some kind of error + jassertquiet (type != urids->mLV2_LOG__Error && type != urids->mLV2_LOG__Warning); + return std::vfprintf (stderr, fmt, ap); + } + + static int vprintfCallback (LV2_Log_Handle handle, + LV2_URID type, + const char* fmt, + va_list ap) + { + return static_cast (handle)->vprintfCallback (type, fmt, ap); + } + + static int printfCallback (LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...) + { + va_list list; + va_start (list, fmt); + auto result = vprintfCallback (handle, type, fmt, list); + va_end (list); + return result; + } + + const UsefulUrids* urids = nullptr; + LV2_Log_Log logFeature { this, printfCallback, vprintfCallback }; + + JUCE_LEAK_DETECTOR (Log) +}; + +struct Features +{ + explicit Features (std::vector&& f) + : features (std::move (f)) {} + + static std::vector getUris (const std::vector& features) + { + std::vector result; + result.reserve (features.size()); + + for (const auto& feature : features) + result.push_back (String::fromUTF8 (feature.URI)); + + return result; + } + + std::vector features; + std::vector pointers = makeNullTerminatedArray(); + +private: + std::vector makeNullTerminatedArray() + { + std::vector result; + result.reserve (features.size() + 1); + + for (const auto& feature : features) + result.push_back (&feature); + + result.push_back (nullptr); + + return result; + } + + JUCE_LEAK_DETECTOR (Features) +}; + +template +struct OptionalExtension +{ + OptionalExtension() = default; + + explicit OptionalExtension (Extension extensionIn) : extension (extensionIn), valid (true) {} + + Extension extension; + bool valid = false; +}; + +class Instance +{ + struct Free + { + void operator() (LilvInstance* ptr) const noexcept { lilv_instance_free (ptr); } + }; + +public: + using Ptr = std::unique_ptr; + using GetExtensionData = const void* (*) (const char*); + + Instance (const Plugin& pluginIn, double sampleRate, const LV2_Feature* const* features) + : plugin (pluginIn), + instance (lilv_plugin_instantiate (plugin.get(), sampleRate, features)) {} + + void activate() { lilv_instance_activate (instance.get()); } + void run (uint32_t sampleCount) { lilv_instance_run (instance.get(), sampleCount); } + void deactivate() { lilv_instance_deactivate (instance.get()); } + + const char* getUri() const noexcept { return lilv_instance_get_uri (instance.get()); } + + LV2_Handle getHandle() const noexcept { return lilv_instance_get_handle (instance.get()); } + + LilvInstance* get() const noexcept { return instance.get(); } + + void connectPort (uint32_t index, void* data) + { + lilv_instance_connect_port (instance.get(), index, data); + } + + template + OptionalExtension getExtensionData (const NodeUri& uri) const noexcept + { + if (plugin.get() == nullptr || ! plugin.hasExtensionData (uri) || instance.get() == nullptr) + return {}; + + return OptionalExtension { readUnaligned (lilv_instance_get_extension_data (instance.get(), uri.getTyped())) }; + } + + GetExtensionData getExtensionDataCallback() const noexcept + { + return instance->lv2_descriptor->extension_data; + } + + bool operator== (std::nullptr_t) const noexcept { return instance == nullptr; } + bool operator!= (std::nullptr_t) const noexcept { return ! (*this == nullptr); } + +private: + Plugin plugin; + Ptr instance; + + JUCE_LEAK_DETECTOR (Instance) +}; + +enum class Realtime { no, yes }; + +// Must be trivial! +struct WorkResponder +{ + static WorkResponder getDefault() { return { nullptr, nullptr }; } + + LV2_Worker_Status processResponse (uint32_t size, const void* data) const + { + return worker->work_response (handle, size, data); + } + + bool isValid() const { return handle != nullptr && worker != nullptr; } + + LV2_Handle handle; + const LV2_Worker_Interface* worker; +}; + +struct WorkerResponseListener +{ + virtual ~WorkerResponseListener() = default; + virtual LV2_Worker_Status responseGenerated (WorkResponder, uint32_t, const void*) = 0; +}; + +struct RespondHandle +{ + LV2_Worker_Status respond (uint32_t size, const void* data) const + { + if (realtime == Realtime::yes) + return listener.responseGenerated (responder, size, data); + + return responder.processResponse (size, data); + } + + static LV2_Worker_Status respond (LV2_Worker_Respond_Handle handle, + uint32_t size, + const void* data) + { + return static_cast (handle)->respond (size, data); + } + + WorkResponder responder; + WorkerResponseListener& listener; + Realtime realtime; +}; + +// Must be trivial! +struct WorkSubmitter +{ + static WorkSubmitter getDefault() { return { nullptr, nullptr, nullptr, nullptr }; } + + LV2_Worker_Status doWork (Realtime realtime, uint32_t size, const void* data) const + { + // The Worker spec says that the host "MUST NOT make concurrent calls to [work] from + // several threads". + // Taking the work mutex here ensures that only one piece of work is done at a time. + // If we didn't take the work mutex, there would be a danger of work happening + // simultaneously on the worker thread and the render thread when switching between + // realtime/offline modes (in realtime mode, work happens on the worker thread; in + // offline mode, work happens immediately on the render/audio thread). + const ScopedLock lock (*workMutex); + + RespondHandle respondHandle { WorkResponder { handle, worker }, *listener, realtime }; + return worker->work (handle, RespondHandle::respond, &respondHandle, size, data); + } + + bool isValid() const { return handle != nullptr && worker != nullptr && listener != nullptr && workMutex != nullptr; } + + LV2_Handle handle; + const LV2_Worker_Interface* worker; + WorkerResponseListener* listener; + CriticalSection* workMutex; +}; + +template ::value, int> = 0> +static auto toChars (Trivial value) +{ + std::array result; + writeUnaligned (result.data(), value); + return result; +} + +template +class WorkQueue +{ +public: + static_assert (std::is_trivial::value, "Context must be copyable as bytes"); + + explicit WorkQueue (int size) + : fifo (size), data (static_cast (size)) {} + + LV2_Worker_Status push (Context context, size_t size, const void* contents) + { + const auto* bytes = static_cast (contents); + const auto numToWrite = sizeof (Header) + size; + + if (static_cast (fifo.getFreeSpace()) < numToWrite) + return LV2_WORKER_ERR_NO_SPACE; + + Header header { size, context }; + const auto headerBuffer = toChars (header); + + const auto scope = fifo.write (static_cast (numToWrite)); + jassert (scope.blockSize1 + scope.blockSize2 == static_cast (numToWrite)); + + size_t index = 0; + scope.forEach ([&] (int i) + { + data[static_cast (i)] = index < headerBuffer.size() ? headerBuffer[index] + : bytes[index - headerBuffer.size()]; + ++index; + }); + + return LV2_WORKER_SUCCESS; + } + + Context pop (std::vector& dest) + { + // If the vector is too small we'll have to resize it on the audio thread + jassert (dest.capacity() >= data.size()); + dest.clear(); + + const auto numReady = fifo.getNumReady(); + + if (static_cast (numReady) < sizeof (Header)) + { + jassert (numReady == 0); + return Context::getDefault(); + } + + std::array headerBuffer; + + { + size_t index = 0; + fifo.read (sizeof (Header)).forEach ([&] (int i) + { + headerBuffer[index++] = data[static_cast (i)]; + }); + } + + const auto header = readUnaligned

(headerBuffer.data()); + + jassert (static_cast (fifo.getNumReady()) >= header.size); + + dest.resize (header.size); + + { + size_t index = 0; + fifo.read (static_cast (header.size)).forEach ([&] (int i) + { + dest[index++] = data[static_cast (i)]; + }); + } + + return header.context; + } + +private: + struct Header + { + size_t size; + Context context; + }; + + AbstractFifo fifo; + std::vector data; + + JUCE_LEAK_DETECTOR (WorkQueue) +}; + +/* + Keeps track of active plugin instances, so that we can avoid sending work + messages to dead plugins. +*/ +class HandleRegistry +{ +public: + void insert (LV2_Handle handle) + { + const SpinLock::ScopedLockType lock (mutex); + handles.insert (handle); + } + + void erase (LV2_Handle handle) + { + const SpinLock::ScopedLockType lock (mutex); + handles.erase (handle); + } + + template + LV2_Worker_Status ifContains (LV2_Handle handle, Fn&& callback) + { + const SpinLock::ScopedLockType lock (mutex); + + if (handles.find (handle) != handles.cend()) + return callback(); + + return LV2_WORKER_ERR_UNKNOWN; + } + +private: + std::set handles; + SpinLock mutex; + + JUCE_LEAK_DETECTOR (HandleRegistry) +}; + +/* + Implements an LV2 Worker, allowing work to be scheduled in realtime + by the plugin instance. + + IMPORTANT this will die pretty hard if `getExtensionData (LV2_WORKER__interface)` + returns garbage, so make sure to check that the plugin `hasExtensionData` before + constructing one of these! +*/ +class SharedThreadedWorker : public WorkerResponseListener +{ +public: + ~SharedThreadedWorker() noexcept override + { + shouldExit = true; + thread.join(); + } + + LV2_Worker_Status schedule (WorkSubmitter submitter, + uint32_t size, + const void* data) + { + return registry.ifContains (submitter.handle, [&] + { + return incoming.push (submitter, size, data); + }); + } + + LV2_Worker_Status responseGenerated (WorkResponder responder, + uint32_t size, + const void* data) override + { + return registry.ifContains (responder.handle, [&] + { + return outgoing.push (responder, size, data); + }); + } + + void processResponses() + { + for (;;) + { + auto workerResponder = outgoing.pop (message); + + if (! message.empty() && workerResponder.isValid()) + workerResponder.processResponse (static_cast (message.size()), message.data()); + else + break; + } + } + + void registerHandle (LV2_Handle handle) { registry.insert (handle); } + void deregisterHandle (LV2_Handle handle) { registry.erase (handle); } + +private: + static constexpr auto queueSize = 8192; + std::atomic shouldExit { false }; + WorkQueue incoming { queueSize }; + WorkQueue outgoing { queueSize }; + std::vector message = std::vector (queueSize); + std::thread thread { [this] + { + std::vector buffer (queueSize); + + while (! shouldExit) + { + const auto submitter = incoming.pop (buffer); + + if (! buffer.empty() && submitter.isValid()) + submitter.doWork (Realtime::yes, (uint32_t) buffer.size(), buffer.data()); + else + std::this_thread::sleep_for (std::chrono::milliseconds (1)); + } + } }; + HandleRegistry registry; + + JUCE_LEAK_DETECTOR (SharedThreadedWorker) +}; + +struct HandleHolder +{ + virtual ~HandleHolder() = default; + virtual LV2_Handle getHandle() const = 0; + virtual const LV2_Worker_Interface* getWorkerInterface() const = 0; +}; + +class WorkScheduler +{ +public: + explicit WorkScheduler (HandleHolder& handleHolderIn) + : handleHolder (handleHolderIn) {} + + void processResponses() { workerThread->processResponses(); } + + LV2_Worker_Schedule& getWorkerSchedule() { return schedule; } + + void setNonRealtime (bool nonRealtime) { realtime = ! nonRealtime; } + + void registerHandle (LV2_Handle handle) { workerThread->registerHandle (handle); } + void deregisterHandle (LV2_Handle handle) { workerThread->deregisterHandle (handle); } + +private: + LV2_Worker_Status scheduleWork (uint32_t size, const void* data) + { + WorkSubmitter submitter { handleHolder.getHandle(), + handleHolder.getWorkerInterface(), + workerThread, + &workMutex }; + + // If we're in realtime mode, the work should go onto a background thread, + // and we'll process it later. + // If we're offline, we can just do the work immediately, without worrying about + // drop-outs + return realtime ? workerThread->schedule (submitter, size, data) + : submitter.doWork (Realtime::no, size, data); + } + + static LV2_Worker_Status scheduleWork (LV2_Worker_Schedule_Handle handle, + uint32_t size, + const void* data) + { + return static_cast (handle)->scheduleWork (size, data); + } + + SharedResourcePointer workerThread; + HandleHolder& handleHolder; + LV2_Worker_Schedule schedule { this, scheduleWork }; + CriticalSection workMutex; + bool realtime = true; + + JUCE_LEAK_DETECTOR (WorkScheduler) +}; + +struct FeaturesDataListener +{ + virtual ~FeaturesDataListener() = default; + virtual LV2_Resize_Port_Status resizeCallback (uint32_t index, size_t size) = 0; +}; + +class Resize +{ +public: + explicit Resize (FeaturesDataListener& l) + : listener (l) {} + + LV2_Resize_Port_Resize& getFeature() { return resize; } + +private: + LV2_Resize_Port_Status resizeCallback (uint32_t index, size_t size) + { + return listener.resizeCallback (index, size); + } + + static LV2_Resize_Port_Status resizeCallback (LV2_Resize_Port_Feature_Data data, uint32_t index, size_t size) + { + return static_cast (data)->resizeCallback (index, size); + } + + FeaturesDataListener& listener; + LV2_Resize_Port_Resize resize { this, resizeCallback }; +}; + +class FeaturesData +{ +public: + FeaturesData (HandleHolder& handleHolder, + FeaturesDataListener& l, + int32_t maxBlockSizeIn, + int32_t sequenceSizeIn, + const UsefulUrids* u) + : urids (u), + resize (l), + maxBlockSize (maxBlockSizeIn), + sequenceSize (sequenceSizeIn), + workScheduler (handleHolder) + {} + + LV2_Options_Option* getOptions() noexcept { return options.data(); } + + int32_t getMaxBlockSize() const noexcept { return maxBlockSize; } + + void setNonRealtime (bool newValue) { realtime = ! newValue; } + + const LV2_Feature* const* getFeatureArray() const noexcept { return features.pointers.data(); } + + static std::vector getFeatureUris() + { + return Features::getUris (makeFeatures ({}, {}, {}, {}, {}, {})); + } + + void processResponses() { workScheduler.processResponses(); } + + void registerHandle (LV2_Handle handle) { workScheduler.registerHandle (handle); } + void deregisterHandle (LV2_Handle handle) { workScheduler.deregisterHandle (handle); } + +private: + static std::vector makeFeatures (LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + LV2_Options_Option* options, + LV2_Worker_Schedule* schedule, + LV2_Resize_Port_Resize* resize, + LV2_Log_Log* log) + { + ignoreUnused (log); + + return { LV2_Feature { LV2_STATE__loadDefaultState, nullptr }, + LV2_Feature { LV2_BUF_SIZE__boundedBlockLength, nullptr }, + LV2_Feature { LV2_URID__map, map }, + LV2_Feature { LV2_URID__unmap, unmap }, + LV2_Feature { LV2_OPTIONS__options, options }, + LV2_Feature { LV2_WORKER__schedule, schedule }, + LV2_Feature { LV2_STATE__threadSafeRestore, nullptr }, + #if JUCE_DEBUG + LV2_Feature { LV2_LOG__log, log }, + #endif + LV2_Feature { LV2_RESIZE_PORT__resize, resize } }; + } + + LV2_Options_Option makeOption (const char* uid, const int32_t* ptr) + { + return { LV2_OPTIONS_INSTANCE, + 0, // INSTANCE kinds must have a subject of 0 + urids->symap.map (uid), + sizeof (int32_t), + urids->symap.map (LV2_ATOM__Int), + ptr }; + } + + const UsefulUrids* urids; + Resize resize; + Log log { urids }; + + const int32_t minBlockSize = 0, maxBlockSize = 0, sequenceSize = 0; + + std::vector options + { + makeOption (LV2_BUF_SIZE__minBlockLength, &minBlockSize), + makeOption (LV2_BUF_SIZE__maxBlockLength, &maxBlockSize), + makeOption (LV2_BUF_SIZE__sequenceSize, &sequenceSize), + { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, nullptr }, // The final entry must be nulled out + }; + + WorkScheduler workScheduler; + + LV2_URID_Map map = urids->symap.getMapFeature(); + LV2_URID_Unmap unmap = urids->symap.getUnmapFeature(); + Features features { makeFeatures (&map, + &unmap, + options.data(), + &workScheduler.getWorkerSchedule(), + &resize.getFeature(), + log.getLogFeature()) }; + + bool realtime = true; + + JUCE_LEAK_DETECTOR (FeaturesData) +}; + +//============================================================================== +struct TryLockAndCall +{ + template + void operator() (SpinLock& mutex, Fn&& fn) + { + const SpinLock::ScopedTryLockType lock (mutex); + + if (lock.isLocked()) + fn(); + } +}; + +struct LockAndCall +{ + template + void operator() (SpinLock& mutex, Fn&& fn) + { + const SpinLock::ScopedLockType lock (mutex); + fn(); + } +}; + +struct RealtimeReadTrait +{ + using Read = TryLockAndCall; + using Write = LockAndCall; +}; + +struct RealtimeWriteTrait +{ + using Read = LockAndCall; + using Write = TryLockAndCall; +}; + +struct MessageHeader +{ + uint32_t portIndex; + uint32_t protocol; +}; + +template +struct MessageBufferInterface +{ + virtual ~MessageBufferInterface() = default; + virtual void pushMessage (Header header, uint32_t size, const void* buffer) = 0; +}; + +template +class Messages : public MessageBufferInterface
+{ + using Read = typename LockTraits::Read; + using Write = typename LockTraits::Write; + + struct FullHeader + { + Header header; + uint32_t size; + }; + +public: + Messages() { data.reserve (initialBufferSize); } + + void pushMessage (Header header, uint32_t size, const void* buffer) override + { + Write{} (mutex, [&] + { + const auto chars = toChars (FullHeader { header, size }); + const auto bufferAsChars = static_cast (buffer); + data.insert (data.end(), chars.begin(), chars.end()); + data.insert (data.end(), bufferAsChars, bufferAsChars + size); + }); + } + + template + void readAllAndClear (Callback&& callback) + { + Read{} (mutex, [&] + { + if (data.empty()) + return; + + const auto end = data.data() + data.size(); + + for (auto ptr = data.data(); ptr < end;) + { + const auto header = readUnaligned (ptr); + callback (header.header, header.size, ptr + sizeof (header)); + ptr += sizeof (header) + header.size; + } + + data.clear(); + }); + } + +private: + static constexpr auto initialBufferSize = 8192; + SpinLock mutex; + std::vector data; + + JUCE_LEAK_DETECTOR (Messages) +}; + +//============================================================================== +class LambdaTimer : private Timer +{ +public: + explicit LambdaTimer (std::function c) : callback (c) {} + + ~LambdaTimer() noexcept override { stopTimer(); } + + using Timer::startTimer; + using Timer::startTimerHz; + using Timer::stopTimer; + +private: + void timerCallback() override { callback(); } + + std::function callback; +}; + +struct UiEventListener : public MessageBufferInterface +{ + virtual int idle() = 0; +}; + +struct UiMessageHeader +{ + UiEventListener* listener; + MessageHeader header; +}; + +class ProcessorToUi : public MessageBufferInterface +{ +public: + ProcessorToUi() { timer.startTimerHz (60); } + + void addUi (UiEventListener& l) { JUCE_ASSERT_MESSAGE_THREAD; activeUis.insert (&l); } + void removeUi (UiEventListener& l) { JUCE_ASSERT_MESSAGE_THREAD; activeUis.erase (&l); } + + void pushMessage (UiMessageHeader header, uint32_t size, const void* buffer) override + { + processorToUi.pushMessage (header, size, buffer); + } + +private: + Messages processorToUi; + std::set activeUis; + LambdaTimer timer { [this] + { + for (auto* l : activeUis) + if (l->idle() != 0) + return; + + processorToUi.readAllAndClear ([&] (const UiMessageHeader& header, uint32_t size, const char* data) + { + if (activeUis.find (header.listener) != activeUis.cend()) + header.listener->pushMessage (header.header, size, data); + }); + } }; +}; + +/* These type identifiers may be used to check the type of the incoming data. */ +struct StatefulPortUrids +{ + explicit StatefulPortUrids (SymbolMap& map) + : Float (map.map (LV2_ATOM__Float)), + Double (map.map (LV2_ATOM__Double)), + Int (map.map (LV2_ATOM__Int)), + Long (map.map (LV2_ATOM__Long)) + {} + + const LV2_URID Float, Double, Int, Long; +}; + +/* + A bit like SortedSet, but only requires `operator<` and not `operator==`, so + it behaves a bit more like a std::set. +*/ +template +class SafeSortedSet +{ +public: + using iterator = typename std::vector:: iterator; + using const_iterator = typename std::vector::const_iterator; + + template + const_iterator find (const Other& other) const noexcept + { + const auto it = std::lower_bound (storage.cbegin(), storage.cend(), other); + + if (it != storage.cend() && ! (other < *it)) + return it; + + return storage.cend(); + } + + void insert (Value&& value) { insertImpl (std::move (value)); } + void insert (const Value& value) { insertImpl (value); } + + size_t size() const noexcept { return storage.size(); } + bool empty() const noexcept { return storage.empty(); } + + iterator begin() noexcept { return storage. begin(); } + const_iterator begin() const noexcept { return storage. begin(); } + const_iterator cbegin() const noexcept { return storage.cbegin(); } + + iterator end() noexcept { return storage. end(); } + const_iterator end() const noexcept { return storage. end(); } + const_iterator cend() const noexcept { return storage.cend(); } + + auto& operator[] (size_t index) const { return storage[index]; } + +private: + template + void insertImpl (Arg&& value) + { + const auto it = std::lower_bound (storage.cbegin(), storage.cend(), value); + + if (it == storage.cend() || value < *it) + storage.insert (it, std::forward (value)); + } + + std::vector storage; +}; + +struct StoredScalePoint +{ + String label; + float value; + + bool operator< (const StoredScalePoint& other) const noexcept { return value < other.value; } +}; + +inline bool operator< (const StoredScalePoint& a, float b) noexcept { return a.value < b; } +inline bool operator< (float a, const StoredScalePoint& b) noexcept { return a < b.value; } + +struct ParameterInfo +{ + ParameterInfo() = default; + + ParameterInfo (SafeSortedSet scalePointsIn, + String identifierIn, + float defaultValueIn, + float minIn, + float maxIn, + bool isToggleIn, + bool isIntegerIn, + bool isEnumIn) + : scalePoints (std::move (scalePointsIn)), + identifier (std::move (identifierIn)), + defaultValue (defaultValueIn), + min (minIn), + max (maxIn), + isToggle (isToggleIn), + isInteger (isIntegerIn), + isEnum (isEnumIn) + {} + + static SafeSortedSet getScalePoints (const Port& port) + { + SafeSortedSet scalePoints; + + for (const LilvScalePoint* p : port.getScalePoints()) + { + const ScalePoint wrapper { p }; + const auto value = wrapper.getValue(); + const auto label = wrapper.getLabel(); + + if (lilv_node_is_float (value) || lilv_node_is_int (value)) + scalePoints.insert ({ lilv_node_as_string (label), lilv_node_as_float (value) }); + } + + return scalePoints; + } + + static ParameterInfo getInfoForPort (const UsefulUris& uris, const Port& port) + { + const auto range = port.getRange(); + + return { getScalePoints (port), + "sym:" + String::fromUTF8 (port.getSymbol().getTyped()), + range.defaultValue, + range.min, + range.max, + port.hasProperty (uris.mLV2_CORE__toggled), + port.hasProperty (uris.mLV2_CORE__integer), + port.hasProperty (uris.mLV2_CORE__enumeration) }; + } + + SafeSortedSet scalePoints; + + /* This is the 'symbol' of a port, or the 'designation' of a parameter without a symbol. */ + String identifier; + + float defaultValue = 0.0f, min = 0.0f, max = 1.0f; + bool isToggle = false, isInteger = false, isEnum = false; + + JUCE_LEAK_DETECTOR (ParameterInfo) +}; + +struct PortHeader +{ + String name; + String symbol; + uint32_t index; + Port::Direction direction; +}; + +struct ControlPort +{ + ControlPort (const PortHeader& headerIn, const ParameterInfo& infoIn) + : header (headerIn), info (infoIn) {} + + PortHeader header; + ParameterInfo info; + float currentValue = info.defaultValue; +}; + +struct CVPort +{ + PortHeader header; +}; + +struct AudioPort +{ + PortHeader header; +}; + +template +class SingleSizeAlignedStorage +{ +public: + SingleSizeAlignedStorage() = default; + + explicit SingleSizeAlignedStorage (size_t sizeInBytes) + : storage (new char[sizeInBytes + Alignment]), + alignedPointer (storage.get()), + space (sizeInBytes + Alignment) + { + alignedPointer = std::align (Alignment, sizeInBytes, alignedPointer, space); + } + + void* data() const { return alignedPointer; } + size_t size() const { return space; } + +private: + std::unique_ptr storage; + void* alignedPointer = nullptr; + size_t space = 0; +}; + +template +static SingleSizeAlignedStorage grow (SingleSizeAlignedStorage storage, size_t size) +{ + if (size <= storage.size()) + return storage; + + SingleSizeAlignedStorage newStorage { jmax (size, (storage.size() * 3) / 2) }; + std::memcpy (newStorage.data(), storage.data(), storage.size()); + return newStorage; +} + +enum class SupportsTime { no, yes }; + +class AtomPort +{ +public: + AtomPort (PortHeader h, size_t bytes, SymbolMap& map, SupportsTime supportsTime) + : header (h), contents (bytes), forge (map.getMapFeature()), time (supportsTime) {} + + PortHeader header; + + void replaceWithChunk() + { + forge.setBuffer (data(), size()); + forge.writeChunk ((uint32_t) (size() - sizeof (LV2_Atom))); + } + + void replaceBufferWithAtom (const LV2_Atom* atom) + { + const auto totalSize = atom->size + sizeof (LV2_Atom); + + if (totalSize <= size()) + std::memcpy (data(), atom, totalSize); + else + replaceWithChunk(); + } + + void beginSequence() + { + forge.setBuffer (data(), size()); + lv2_atom_forge_sequence_head (forge.get(), &frame, 0); + } + + void endSequence() + { + lv2_atom_forge_pop (forge.get(), &frame); + } + + /* For this to work, the 'atom' pointer must be well-formed. + + It must be followed by an atom header, then at least 'size' bytes of body. + */ + void addAtomToSequence (int64_t timestamp, const LV2_Atom* atom) + { + // This reinterpret_cast is not UB, casting to a char* is acceptable. + // Doing arithmetic on this pointer is dubious, but I can't think of a better alternative + // given that we don't have any way of knowing the concrete type of the atom. + addEventToSequence (timestamp, + atom->type, + atom->size, + reinterpret_cast (atom) + sizeof (LV2_Atom)); + } + + void addEventToSequence (int64_t timestamp, uint32_t type, uint32_t size, const void* content) + { + lv2_atom_forge_frame_time (forge.get(), timestamp); + lv2_atom_forge_atom (forge.get(), size, type); + lv2_atom_forge_write (forge.get(), content, size); + } + + void ensureSizeInBytes (size_t size) + { + contents = grow (std::move (contents), size); + } + + char* data() noexcept { return data (*this); } + const char* data() const noexcept { return data (*this); } + + size_t size() const noexcept { return contents.size(); } + + lv2_shared::AtomForge& getForge() { return forge; } + const lv2_shared::AtomForge& getForge() const { return forge; } + + bool getSupportsTime() const { return time == SupportsTime::yes; } + +private: + template + static auto data (This& t) -> decltype (t.data()) + { + return unalignedPointerCast (t.contents.data()); + } + + // Atoms are required to be 64-bit aligned + SingleSizeAlignedStorage<8> contents; + lv2_shared::AtomForge forge; + LV2_Atom_Forge_Frame frame; + SupportsTime time = SupportsTime::no; +}; + +class Plugins +{ +public: + explicit Plugins (const LilvPlugins* list) noexcept : plugins (list) {} + + unsigned size() const noexcept { return lilv_plugins_size (plugins); } + + PluginsIterator begin() const noexcept { return PluginsIterator { plugins }; } + PluginsIterator end() const noexcept { return PluginsIterator{}; } + + const LilvPlugin* getByUri (const NodeUri& uri) const + { + return lilv_plugins_get_by_uri (plugins, uri.get()); + } + +private: + const LilvPlugins* plugins = nullptr; +}; + +template +class PluginClassesImpl +{ +public: + using type = typename PtrTraits::type; + + explicit PluginClassesImpl (type ptr) + : classes (std::move (ptr)) {} + + unsigned size() const noexcept { return lilv_plugin_classes_size (PtrTraits::get (classes)); } + + PluginClassesIterator begin() const noexcept { return PluginClassesIterator { PtrTraits::get (classes) }; } + PluginClassesIterator end() const noexcept { return PluginClassesIterator{}; } + + const LilvPluginClass* getByUri (const NodeUri& uri) const noexcept + { + return lilv_plugin_classes_get_by_uri (PtrTraits::get (classes), uri.get()); + } + +private: + type classes{}; +}; + +struct PluginClassesFree +{ + void operator() (LilvPluginClasses* ptr) const noexcept { lilv_plugin_classes_free (ptr); } +}; + +using OwningPluginClasses = PluginClassesImpl>; +using NonOwningPluginClasses = PluginClassesImpl>; + +class World +{ +public: + World() : world (lilv_world_new()) {} + + void loadAll() { lilv_world_load_all (world.get()); } + void loadBundle (const NodeUri& uri) { lilv_world_load_bundle (world.get(), uri.get()); } + void unloadBundle (const NodeUri& uri) { lilv_world_unload_bundle (world.get(), uri.get()); } + + void loadResource (const NodeUri& uri) { lilv_world_load_resource (world.get(), uri.get()); } + void unloadResource (const NodeUri& uri) { lilv_world_unload_resource (world.get(), uri.get()); } + + void loadSpecifications() { lilv_world_load_specifications (world.get()); } + void loadPluginClasses() { lilv_world_load_plugin_classes (world.get()); } + + Plugins getAllPlugins() const { return Plugins { lilv_world_get_all_plugins (world.get()) }; } + NonOwningPluginClasses getPluginClasses() const { return NonOwningPluginClasses { lilv_world_get_plugin_classes (world.get()) }; } + + NodeUri newUri (const char* uri) { return NodeUri { world.get(), uri }; } + NodeUri newFileUri (const char* host, const char* path) { return NodeUri { world.get(), host, path }; } + NodeString newString (const char* str) { return NodeString { world.get(), str }; } + + bool ask (const LilvNode* subject, const LilvNode* predicate, const LilvNode* object) const + { + return lilv_world_ask (world.get(), subject, predicate, object); + } + + OwningNode get (const LilvNode* subject, const LilvNode* predicate, const LilvNode* object) const + { + return OwningNode { lilv_world_get (world.get(), subject, predicate, object) }; + } + + OwningNodes findNodes (const LilvNode* subject, const LilvNode* predicate, const LilvNode* object) const + { + return OwningNodes { lilv_world_find_nodes (world.get(), subject, predicate, object) }; + } + + LilvWorld* get() const { return world.get(); } + +private: + struct Free + { + void operator() (LilvWorld* ptr) const noexcept { lilv_world_free (ptr); } + }; + + std::unique_ptr world; +}; + +class Ports +{ +public: + static constexpr auto sequenceSize = 8192; + + template + void forEachPort (Callback&& callback) const + { + for (const auto& port : controlPorts) + callback (port.header); + + for (const auto& port : cvPorts) + callback (port.header); + + for (const auto& port : audioPorts) + callback (port.header); + + for (const auto& port : atomPorts) + callback (port.header); + } + + auto getControlPorts() { return makeSimpleSpan (controlPorts); } + auto getControlPorts() const { return makeSimpleSpan (controlPorts); } + auto getCvPorts() { return makeSimpleSpan (cvPorts); } + auto getCvPorts() const { return makeSimpleSpan (cvPorts); } + auto getAudioPorts() { return makeSimpleSpan (audioPorts); } + auto getAudioPorts() const { return makeSimpleSpan (audioPorts); } + auto getAtomPorts() { return makeSimpleSpan (atomPorts); } + auto getAtomPorts() const { return makeSimpleSpan (atomPorts); } + + static Optional getPorts (World& world, const UsefulUris& uris, const Plugin& plugin, SymbolMap& symap) + { + Ports value; + bool successful = true; + + const auto numPorts = plugin.getNumPorts(); + const auto timeNode = world.newUri (LV2_TIME__Position); + + for (uint32_t i = 0; i != numPorts; ++i) + { + const auto port = plugin.getPortByIndex (i); + + const PortHeader header { String::fromUTF8 (port.getName().getTyped()), + String::fromUTF8 (port.getSymbol().getTyped()), + i, + port.getDirection (uris) }; + + switch (port.getKind (uris)) + { + case Port::Kind::control: + { + value.controlPorts.push_back ({ header, ParameterInfo::getInfoForPort (uris, port) }); + break; + } + + case Port::Kind::cv: + value.cvPorts.push_back ({ header }); + break; + + case Port::Kind::audio: + { + value.audioPorts.push_back ({ header }); + break; + } + + case Port::Kind::atom: + { + const auto supportsTime = port.supportsEvent (timeNode.get()); + value.atomPorts.push_back ({ header, + (size_t) Ports::sequenceSize, + symap, + supportsTime ? SupportsTime::yes : SupportsTime::no }); + break; + } + + case Port::Kind::unknown: + successful = false; + break; + } + } + + for (auto& atomPort : value.atomPorts) + { + const auto port = plugin.getPortByIndex (atomPort.header.index); + const auto minSize = port.get (uris.mLV2_RESIZE_PORT__minimumSize.get()); + + if (minSize != nullptr) + atomPort.ensureSizeInBytes ((size_t) lilv_node_as_int (minSize.get())); + } + + return successful ? makeOptional (std::move (value)) : nullopt; + } + +private: + std::vector controlPorts; + std::vector cvPorts; + std::vector audioPorts; + std::vector atomPorts; +}; + +class InstanceWithSupports : private FeaturesDataListener, + private HandleHolder +{ +public: + InstanceWithSupports (World& world, + std::unique_ptr&& symapIn, + const Plugin& plugin, + Ports portsIn, + int32_t initialBufferSize, + double sampleRate) + : symap (std::move (symapIn)), + ports (std::move (portsIn)), + features (*this, *this, initialBufferSize, lv2_host::Ports::sequenceSize, &urids), + instance (plugin, sampleRate, features.getFeatureArray()), + workerInterface (instance.getExtensionData (world.newUri (LV2_WORKER__interface))) + { + if (instance == nullptr) + return; + + for (auto& port : ports.getControlPorts()) + instance.connectPort (port.header.index, &port.currentValue); + + for (auto& port : ports.getAtomPorts()) + instance.connectPort (port.header.index, port.data()); + + for (auto& port : ports.getCvPorts()) + instance.connectPort (port.header.index, nullptr); + + for (auto& port : ports.getAudioPorts()) + instance.connectPort (port.header.index, nullptr); + + features.registerHandle (instance.getHandle()); + } + + ~InstanceWithSupports() override + { + if (instance != nullptr) + features.deregisterHandle (instance.getHandle()); + } + + std::unique_ptr symap; + const UsefulUrids urids { *symap }; + Ports ports; + FeaturesData features; + Instance instance; + Messages uiToProcessor; + SharedResourcePointer processorToUi; + +private: + LV2_Handle handle = instance == nullptr ? nullptr : instance.getHandle(); + OptionalExtension workerInterface; + + LV2_Handle getHandle() const override { return handle; } + const LV2_Worker_Interface* getWorkerInterface() const override { return workerInterface.valid ? &workerInterface.extension : nullptr; } + + LV2_Resize_Port_Status resizeCallback (uint32_t index, size_t size) override + { + if (ports.getAtomPorts().size() <= index) + return LV2_RESIZE_PORT_ERR_UNKNOWN; + + auto& port = ports.getAtomPorts()[index]; + + if (port.header.direction != Port::Direction::output) + return LV2_RESIZE_PORT_ERR_UNKNOWN; + + port.ensureSizeInBytes (size); + instance.connectPort (port.header.index, port.data()); + + return LV2_RESIZE_PORT_SUCCESS; + } + + JUCE_DECLARE_NON_COPYABLE (InstanceWithSupports) + JUCE_DECLARE_NON_MOVEABLE (InstanceWithSupports) + JUCE_LEAK_DETECTOR (InstanceWithSupports) +}; + +struct PortState +{ + const void* data; + uint32_t size; + uint32_t kind; +}; + +class PortMap +{ +public: + explicit PortMap (Ports& ports) + { + for (auto& port : ports.getControlPorts()) + symbolToControlPortMap.emplace (port.header.symbol, &port); + } + + PortState getState (const String& symbol, const StatefulPortUrids& urids) + { + if (auto* port = getControlPortForSymbol (symbol)) + return { &port->currentValue, sizeof (float), urids.Float }; + + // At time of writing, lilv_state_new_from_instance did not attempt to store + // the state of non-control ports. Perhaps that has changed? + jassertfalse; + return { nullptr, 0, 0 }; + } + + void restoreState (const String& symbol, const StatefulPortUrids& urids, PortState ps) + { + if (auto* port = getControlPortForSymbol (symbol)) + { + port->currentValue = [&]() -> float + { + if (ps.kind == urids.Float) + return getValueFrom (ps.data, ps.size); + + if (ps.kind == urids.Double) + return getValueFrom (ps.data, ps.size); + + if (ps.kind == urids.Int) + return getValueFrom (ps.data, ps.size); + + if (ps.kind == urids.Long) + return getValueFrom (ps.data, ps.size); + + jassertfalse; + return {}; + }(); + } + else + jassertfalse; // Restoring state for non-control ports is not currently supported. + } + +private: + template + static float getValueFrom (const void* data, uint32_t size) + { + jassertquiet (size == sizeof (Value)); + return (float) readUnaligned (data); + } + + ControlPort* getControlPortForSymbol (const String& symbol) const + { + const auto iter = symbolToControlPortMap.find (symbol); + return iter != symbolToControlPortMap.cend() ? iter->second : nullptr; + } + + std::map symbolToControlPortMap; + JUCE_LEAK_DETECTOR (PortMap) +}; + +struct FreeString { void operator() (void* ptr) const noexcept { lilv_free (ptr); } }; + +class PluginState +{ +public: + PluginState() = default; + + explicit PluginState (LilvState* ptr) + : state (ptr) {} + + const LilvState* get() const noexcept { return state.get(); } + + void restore (InstanceWithSupports& instance, PortMap& portMap) const + { + if (state != nullptr) + SaveRestoreHandle { instance, portMap }.restore (state.get()); + } + + std::string toString (LilvWorld* world, LV2_URID_Map* map, LV2_URID_Unmap* unmap, const char* uri) const + { + std::unique_ptr result { lilv_state_to_string (world, + map, + unmap, + state.get(), + uri, + nullptr) }; + return std::string { result.get() }; + } + + String getLabel() const + { + return String::fromUTF8 (lilv_state_get_label (state.get())); + } + + void setLabel (const String& label) + { + lilv_state_set_label (state.get(), label.toRawUTF8()); + } + + class SaveRestoreHandle + { + public: + explicit SaveRestoreHandle (InstanceWithSupports& instanceIn, PortMap& portMap) + : instance (instanceIn.instance.get()), + features (instanceIn.features.getFeatureArray()), + urids (*instanceIn.symap), + map (portMap) + {} + + PluginState save (const LilvPlugin* plugin, LV2_URID_Map* mapFeature) + { + return PluginState { lilv_state_new_from_instance (plugin, + instance, + mapFeature, + nullptr, + nullptr, + nullptr, + nullptr, + getPortValue, + this, + LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE, + features ) }; + } + + void restore (const LilvState* stateIn) + { + lilv_state_restore (stateIn, + instance, + setPortValue, + this, + 0, + features); + } + + private: + static const void* getPortValue (const char* portSymbol, + void* userData, + uint32_t* size, + uint32_t* type) + { + auto& handle = *static_cast (userData); + + const auto state = handle.map.getState (portSymbol, handle.urids); + *size = state.size; + *type = state.kind; + return state.data; + } + + static void setPortValue (const char* portSymbol, + void* userData, + const void* value, + uint32_t size, + uint32_t type) + { + const auto& handle = *static_cast (userData); + handle.map.restoreState (portSymbol, handle.urids, { static_cast (value), size, type }); + } + + LilvInstance* instance = nullptr; + const LV2_Feature* const* features = nullptr; + const StatefulPortUrids urids; + PortMap& map; + }; + +private: + struct Free + { + void operator() (LilvState* ptr) const noexcept { lilv_state_free (ptr); } + }; + + std::unique_ptr state; + + JUCE_LEAK_DETECTOR (PluginState) +}; + +/* + Wraps an LV2 UI bundle, providing access to the descriptor (if available). +*/ +struct UiDescriptorLibrary +{ + using GetDescriptor = LV2UI_Descriptor* (*) (uint32_t); + + UiDescriptorLibrary() = default; + + explicit UiDescriptorLibrary (const String& libraryPath) + : library (std::make_unique (libraryPath)), + getDescriptor (lv2_shared::wordCast (library->getFunction ("lv2ui_descriptor"))) {} + + std::unique_ptr library; + GetDescriptor getDescriptor = nullptr; +}; + +class UiDescriptorArgs +{ +public: + String libraryPath; + String uiUri; + + auto withLibraryPath (String v) const noexcept { return with (&UiDescriptorArgs::libraryPath, v); } + auto withUiUri (String v) const noexcept { return with (&UiDescriptorArgs::uiUri, v); } + +private: + UiDescriptorArgs with (String UiDescriptorArgs::* member, String value) const noexcept + { + return juce::lv2_host::with (*this, member, std::move (value)); + } +}; + +/* + Stores a pointer to the descriptor for a specific UI bundle and UI URI. +*/ +class UiDescriptor +{ +public: + UiDescriptor() = default; + + explicit UiDescriptor (const UiDescriptorArgs& args) + : library (args.libraryPath), + descriptor (extractUiDescriptor (library, args.uiUri.toRawUTF8())) + {} + + void portEvent (LV2UI_Handle ui, + uint32_t portIndex, + uint32_t bufferSize, + uint32_t format, + const void* buffer) const + { + JUCE_ASSERT_MESSAGE_THREAD + + if (auto* lv2Descriptor = get()) + if (auto* callback = lv2Descriptor->port_event) + callback (ui, portIndex, bufferSize, format, buffer); + } + + bool hasExtensionData (World& world, const char* uid) const + { + return world.ask (world.newUri (descriptor->URI).get(), + world.newUri (LV2_CORE__extensionData).get(), + world.newUri (uid).get()); + } + + template + OptionalExtension getExtensionData (World& world, const char* uid) const + { + if (! hasExtensionData (world, uid)) + return {}; + + if (auto* lv2Descriptor = get()) + if (auto* extension = lv2Descriptor->extension_data) + return OptionalExtension (readUnaligned (extension (uid))); + + return {}; + } + + const LV2UI_Descriptor* get() const noexcept { return descriptor; } + +private: + static const LV2UI_Descriptor* extractUiDescriptor (const UiDescriptorLibrary& lib, const char* uiUri) + { + if (lib.getDescriptor == nullptr) + return nullptr; + + for (uint32_t i = 0;; ++i) + { + const auto* descriptor = lib.getDescriptor (i); + + if (descriptor == nullptr) + return nullptr; + + if (strcmp (uiUri, descriptor->URI) == 0) + return descriptor; + } + } + + UiDescriptorLibrary library; + const LV2UI_Descriptor* descriptor = nullptr; + + JUCE_LEAK_DETECTOR (UiDescriptor) +}; + +enum class Update { no, yes }; + +/* A bit like the FlaggedFloatCache used by the VST3 host/client. + + While the FlaggedFloatCache always clears all set flags during the ifSet() call, + this class stores the "value changed" flags for the processor and UI separately, + so that they can be read at different rates. +*/ +class ParameterValuesAndFlags +{ +public: + ParameterValuesAndFlags() = default; + + explicit ParameterValuesAndFlags (size_t sizeIn) + : values (sizeIn), + needsUiUpdate (sizeIn), + needsProcessorUpdate (sizeIn) + { + std::fill (values.begin(), values.end(), 0.0f); + } + + size_t size() const noexcept { return values.size(); } + + void set (size_t index, float value, Update update) + { + jassert (index < size()); + values[index].store (value, std::memory_order_relaxed); + needsUiUpdate .set (index, update == Update::yes ? 1 : 0); + needsProcessorUpdate.set (index, update == Update::yes ? 1 : 0); + } + + float get (size_t index) const noexcept + { + jassert (index < size()); + return values[index].load (std::memory_order_relaxed); + } + + template + void ifProcessorValuesChanged (Callback&& callback) + { + ifChanged (needsProcessorUpdate, std::forward (callback)); + } + + template + void ifUiValuesChanged (Callback&& callback) + { + ifChanged (needsUiUpdate, std::forward (callback)); + } + + void clearUiFlags() { needsUiUpdate.clear(); } + +private: + template + void ifChanged (FlagCache<1>& flags, Callback&& callback) + { + flags.ifSet ([this, &callback] (size_t groupIndex, uint32_t) + { + callback (groupIndex, values[groupIndex].load (std::memory_order_relaxed)); + }); + } + + std::vector> values; + FlagCache<1> needsUiUpdate; + FlagCache<1> needsProcessorUpdate; + + JUCE_LEAK_DETECTOR (ParameterValuesAndFlags) +}; + +class LV2Parameter : public AudioPluginInstance::HostedParameter +{ +public: + LV2Parameter (const String& nameIn, + const ParameterInfo& infoIn, + ParameterValuesAndFlags& floatCache) + : cache (floatCache), + info (infoIn), + range (info.min, info.max), + name (nameIn), + normalisedDefault (range.convertTo0to1 (infoIn.defaultValue)) + {} + + float getValue() const noexcept override + { + return range.convertTo0to1 (getDenormalisedValue()); + } + + void setValue (float f) override + { + cache.set ((size_t) getParameterIndex(), range.convertFrom0to1 (f), Update::yes); + } + + void setDenormalisedValue (float denormalised) + { + cache.set ((size_t) getParameterIndex(), denormalised, Update::yes); + sendValueChangedMessageToListeners (range.convertTo0to1 (denormalised)); + } + + void setDenormalisedValueWithoutTriggeringUpdate (float denormalised) + { + cache.set ((size_t) getParameterIndex(), denormalised, Update::no); + sendValueChangedMessageToListeners (range.convertTo0to1 (denormalised)); + } + + float getDenormalisedValue() const noexcept + { + return cache.get ((size_t) getParameterIndex()); + } + + float getDefaultValue() const override { return normalisedDefault; } + float getDenormalisedDefaultValue() const { return info.defaultValue; } + + float getValueForText (const String& text) const override + { + if (! info.isEnum) + return range.convertTo0to1 (text.getFloatValue()); + + const auto it = std::find_if (info.scalePoints.begin(), + info.scalePoints.end(), + [&] (const StoredScalePoint& stored) { return stored.label == text; }); + return it != info.scalePoints.end() ? range.convertTo0to1 (it->value) : normalisedDefault; + } + + int getNumSteps() const override + { + if (info.isToggle) + return 2; + + if (info.isEnum) + return static_cast (info.scalePoints.size()); + + if (info.isInteger) + return static_cast (range.getRange().getLength()) + 1; + + return AudioProcessorParameter::getNumSteps(); + } + + bool isDiscrete() const override { return info.isEnum || info.isInteger || info.isToggle; } + bool isBoolean() const override { return info.isToggle; } + + StringArray getAllValueStrings() const override + { + if (! info.isEnum) + return {}; + + return AudioProcessorParameter::getAllValueStrings(); + } + + String getText (float normalisedValue, int) const override + { + const auto denormalised = range.convertFrom0to1 (normalisedValue); + + if (info.isEnum && ! info.scalePoints.empty()) + { + // The normalised value might not correspond to the exact value of a scale point. + // In this case, we find the closest label by searching the midpoints of the scale + // point values. + const auto index = std::distance (midPoints.begin(), + std::lower_bound (midPoints.begin(), midPoints.end(), normalisedValue)); + jassert (isPositiveAndBelow (index, info.scalePoints.size())); + return info.scalePoints[(size_t) index].label; + } + + return getFallbackParameterString (denormalised); + } + + String getParameterID() const override + { + return info.identifier; + } + + String getName (int maxLength) const override + { + return name.substring (0, maxLength); + } + + String getLabel() const override + { + // TODO + return {}; + } + +private: + String getFallbackParameterString (float denormalised) const + { + if (info.isToggle) + return denormalised > 0.0f ? "On" : "Off"; + + if (info.isInteger) + return String { static_cast (denormalised) }; + + return String { denormalised }; + } + + static std::vector findScalePointMidPoints (const SafeSortedSet& set) + { + if (set.size() < 2) + return {}; + + std::vector result; + + for (auto it = std::next (set.begin()); it != set.end(); ++it) + result.push_back ((std::prev (it)->value + it->value) * 0.5f); + + jassert (std::is_sorted (result.begin(), result.end())); + jassert (result.size() + 1 == set.size()); + return result; + } + + ParameterValuesAndFlags& cache; + const ParameterInfo info; + const std::vector midPoints = findScalePointMidPoints (info.scalePoints); + const NormalisableRange range; + const String name; + const float normalisedDefault; + + JUCE_LEAK_DETECTOR (LV2Parameter) +}; + +class UiInstanceArgs +{ +public: + File bundlePath; + URL pluginUri; + + auto withBundlePath (File v) const noexcept { return with (&UiInstanceArgs::bundlePath, std::move (v)); } + auto withPluginUri (URL v) const noexcept { return with (&UiInstanceArgs::pluginUri, std::move (v)); } + +private: + template + UiInstanceArgs with (Member UiInstanceArgs::* member, Member value) const noexcept + { + return juce::lv2_host::with (*this, member, std::move (value)); + } +}; + +static File bundlePathFromUri (const char* uri) +{ + return File { std::unique_ptr { lilv_file_uri_parse (uri, nullptr) }.get() }; +} + +/* + Creates and holds a UI instance for a plugin with a specific URI, using the provided descriptor. +*/ +class UiInstance +{ +public: + UiInstance (World& world, + const UiDescriptor* descriptorIn, + const UiInstanceArgs& args, + const LV2_Feature* const* features, + MessageBufferInterface& messagesIn, + SymbolMap& map, + PhysicalResizeListener& rl) + : descriptor (descriptorIn), + resizeListener (rl), + uiToProcessor (messagesIn), + mLV2_UI__floatProtocol (map.map (LV2_UI__floatProtocol)), + mLV2_ATOM__atomTransfer (map.map (LV2_ATOM__atomTransfer)), + mLV2_ATOM__eventTransfer (map.map (LV2_ATOM__eventTransfer)), + instance (makeInstance (args.pluginUri, args.bundlePath, features)), + idleCallback (getExtensionData (world, LV2_UI__idleInterface)) + { + jassert (descriptor != nullptr); + jassert (widget != nullptr); + + ignoreUnused (resizeListener); + } + + LV2UI_Handle getHandle() const noexcept { return instance.get(); } + + void pushMessage (MessageHeader header, uint32_t size, const void* buffer) + { + descriptor->portEvent (getHandle(), header.portIndex, size, header.protocol, buffer); + } + + int idle() + { + if (idleCallback.valid && idleCallback.extension.idle != nullptr) + return idleCallback.extension.idle (getHandle()); + + return 0; + } + + template + OptionalExtension getExtensionData (World& world, const char* uid) const + { + return descriptor->getExtensionData (world, uid); + } + + Rectangle getDetectedViewBounds() const + { + #if JUCE_MAC + const auto frame = [(NSView*) widget frame]; + return { (int) frame.size.width, (int) frame.size.height }; + #elif JUCE_LINUX || JUCE_BSD + Window root = 0; + int wx = 0, wy = 0; + unsigned int ww = 0, wh = 0, bw = 0, bitDepth = 0; + + XWindowSystemUtilities::ScopedXLock xLock; + auto* display = XWindowSystem::getInstance()->getDisplay(); + X11Symbols::getInstance()->xGetGeometry (display, + (::Drawable) widget, + &root, + &wx, + &wy, + &ww, + &wh, + &bw, + &bitDepth); + + return { (int) ww, (int) wh }; + #elif JUCE_WINDOWS + RECT rect; + GetWindowRect ((HWND) widget, &rect); + return { rect.right - rect.left, rect.bottom - rect.top }; + #else + return {}; + #endif + } + + const UiDescriptor* descriptor = nullptr; + +private: + using Instance = std::unique_ptr; + using Idle = int (*) (LV2UI_Handle); + + Instance makeInstance (const URL& pluginUri, const File& bundlePath, const LV2_Feature* const* features) + { + if (descriptor->get() == nullptr) + return { nullptr, [] (LV2UI_Handle) {} }; + + return Instance { descriptor->get()->instantiate (descriptor->get(), + pluginUri.toString (false).toRawUTF8(), + File::addTrailingSeparator (bundlePath.getFullPathName()).toRawUTF8(), + writeFunction, + this, + &widget, + features), + descriptor->get()->cleanup }; + } + + void write (uint32_t portIndex, uint32_t bufferSize, uint32_t protocol, const void* buffer) + { + const LV2_URID protocols[] { 0, mLV2_UI__floatProtocol, mLV2_ATOM__atomTransfer, mLV2_ATOM__eventTransfer }; + const auto it = std::find (std::begin (protocols), std::end (protocols), protocol); + + if (it != std::end (protocols)) + { + uiToProcessor.pushMessage ({ portIndex, protocol }, bufferSize, buffer); + } + } + + static void writeFunction (LV2UI_Controller controller, + uint32_t portIndex, + uint32_t bufferSize, + uint32_t portProtocol, + const void* buffer) + { + jassert (controller != nullptr); + static_cast (controller)->write (portIndex, bufferSize, portProtocol, buffer); + } + + PhysicalResizeListener& resizeListener; + MessageBufferInterface& uiToProcessor; + LV2UI_Widget widget = nullptr; + const LV2_URID mLV2_UI__floatProtocol; + const LV2_URID mLV2_ATOM__atomTransfer; + const LV2_URID mLV2_ATOM__eventTransfer; + Instance instance; + OptionalExtension idleCallback; + + #if JUCE_MAC + NSViewFrameWatcher frameWatcher { (NSView*) widget, [this] + { + const auto bounds = getDetectedViewBounds(); + resizeListener.viewRequestedResizeInPhysicalPixels (bounds.getWidth(), bounds.getHeight()); + } }; + #elif JUCE_WINDOWS + WindowSizeChangeListener frameWatcher { (HWND) widget, resizeListener }; + #endif + + JUCE_LEAK_DETECTOR (UiInstance) +}; + +struct TouchListener +{ + virtual ~TouchListener() = default; + virtual void controlGrabbed (uint32_t port, bool grabbed) = 0; +}; + +class AsyncFn : public AsyncUpdater +{ +public: + explicit AsyncFn (std::function callbackIn) + : callback (std::move (callbackIn)) {} + + ~AsyncFn() override { cancelPendingUpdate(); } + + void handleAsyncUpdate() override { callback(); } + +private: + std::function callback; +}; + +class UiFeaturesDataOptions +{ +public: + float initialScaleFactor = 0.0f, sampleRate = 0.0f; + + auto withInitialScaleFactor (float v) const { return with (&UiFeaturesDataOptions::initialScaleFactor, v); } + auto withSampleRate (float v) const { return with (&UiFeaturesDataOptions::sampleRate, v); } + +private: + UiFeaturesDataOptions with (float UiFeaturesDataOptions::* member, float value) const + { + return juce::lv2_host::with (*this, member, value); + } +}; + +class UiFeaturesData +{ +public: + UiFeaturesData (PhysicalResizeListener& rl, + TouchListener& tl, + LV2_Handle instanceIn, + LV2UI_Widget parentIn, + Instance::GetExtensionData getExtensionData, + const Ports& ports, + SymbolMap& symapIn, + const UiFeaturesDataOptions& optIn) + : opts (optIn), + resizeListener (rl), + touchListener (tl), + instance (instanceIn), + parent (parentIn), + symap (symapIn), + dataAccess { getExtensionData }, + portIndices (makePortIndices (ports)) + { + } + + const LV2_Feature* const* getFeatureArray() const noexcept { return features.pointers.data(); } + + static std::vector getFeatureUris() + { + return Features::getUris (makeFeatures ({}, {}, {}, {}, {}, {}, {}, {}, {}, {})); + } + + Rectangle getLastRequestedBounds() const { return { lastRequestedWidth, lastRequestedHeight }; } + +private: + static std::vector makeFeatures (LV2UI_Resize* resize, + LV2UI_Widget parent, + LV2_Handle handle, + LV2_Extension_Data_Feature* data, + LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + LV2UI_Port_Map* portMap, + LV2UI_Touch* touch, + LV2_Options_Option* options, + LV2_Log_Log* log) + { + return { LV2_Feature { LV2_UI__resize, resize }, + LV2_Feature { LV2_UI__parent, parent }, + LV2_Feature { LV2_UI__idleInterface, nullptr }, + LV2_Feature { LV2_INSTANCE_ACCESS_URI, handle }, + LV2_Feature { LV2_DATA_ACCESS_URI, data }, + LV2_Feature { LV2_URID__map, map }, + LV2_Feature { LV2_URID__unmap, unmap}, + LV2_Feature { LV2_UI__portMap, portMap }, + LV2_Feature { LV2_UI__touch, touch }, + LV2_Feature { LV2_OPTIONS__options, options }, + LV2_Feature { LV2_LOG__log, log } }; + } + + int resizeCallback (int width, int height) + { + lastRequestedWidth = width; + lastRequestedHeight = height; + resizeListener.viewRequestedResizeInPhysicalPixels (width, height); + return 0; + } + + static int resizeCallback (LV2UI_Feature_Handle handle, int width, int height) + { + return static_cast (handle)->resizeCallback (width, height); + } + + uint32_t portIndexCallback (const char* symbol) const + { + const auto it = portIndices.find (symbol); + return it != portIndices.cend() ? it->second : LV2UI_INVALID_PORT_INDEX; + } + + static uint32_t portIndexCallback (LV2UI_Feature_Handle handle, const char* symbol) + { + return static_cast (handle)->portIndexCallback (symbol); + } + + void touchCallback (uint32_t portIndex, bool grabbed) const + { + touchListener.controlGrabbed (portIndex, grabbed); + } + + static void touchCallback (LV2UI_Feature_Handle handle, uint32_t index, bool b) + { + return static_cast (handle)->touchCallback (index, b); + } + + static std::map makePortIndices (const Ports& ports) + { + std::map result; + + ports.forEachPort ([&] (const PortHeader& header) + { + const auto emplaced = result.emplace (header.symbol, header.index); + + // This will complain if there are duplicate port symbols. + jassert (emplaced.second); + ignoreUnused (emplaced); + }); + + return result; + } + + const UiFeaturesDataOptions opts; + PhysicalResizeListener& resizeListener; + TouchListener& touchListener; + LV2_Handle instance{}; + LV2UI_Widget parent{}; + SymbolMap& symap; + const UsefulUrids urids { symap }; + Log log { &urids }; + int lastRequestedWidth = 0, lastRequestedHeight = 0; + std::vector options { { LV2_OPTIONS_INSTANCE, + 0, + symap.map (LV2_UI__scaleFactor), + sizeof (float), + symap.map (LV2_ATOM__Float), + &opts.initialScaleFactor }, + { LV2_OPTIONS_INSTANCE, + 0, + symap.map (LV2_PARAMETERS__sampleRate), + sizeof (float), + symap.map (LV2_ATOM__Float), + &opts.sampleRate }, + { LV2_OPTIONS_INSTANCE, 0, 0, 0, 0, nullptr } }; // The final entry must be nulled out + LV2UI_Resize resize { this, resizeCallback }; + LV2_URID_Map map = symap.getMapFeature(); + LV2_URID_Unmap unmap = symap.getUnmapFeature(); + LV2UI_Port_Map portMap { this, portIndexCallback }; + LV2UI_Touch touch { this, touchCallback }; + LV2_Extension_Data_Feature dataAccess; + std::map portIndices; + Features features { makeFeatures (&resize, + parent, + instance, + &dataAccess, + &map, + &unmap, + &portMap, + &touch, + options.data(), + log.getLogFeature()) }; + + JUCE_LEAK_DETECTOR (UiFeaturesData) +}; + +class UiInstanceWithSupports +{ +public: + UiInstanceWithSupports (World& world, + PhysicalResizeListener& resizeListener, + TouchListener& touchListener, + const UiDescriptor* descriptor, + const UiInstanceArgs& args, + LV2UI_Widget parent, + InstanceWithSupports& engineInstance, + const UiFeaturesDataOptions& opts) + : features (resizeListener, + touchListener, + engineInstance.instance.getHandle(), + parent, + engineInstance.instance.getExtensionDataCallback(), + engineInstance.ports, + *engineInstance.symap, + opts), + instance (world, + descriptor, + args, + features.getFeatureArray(), + engineInstance.uiToProcessor, + *engineInstance.symap, + resizeListener) + {} + + UiFeaturesData features; + UiInstance instance; + + JUCE_LEAK_DETECTOR (UiInstanceWithSupports) +}; + +struct RequiredFeatures +{ + explicit RequiredFeatures (OwningNodes nodes) + : values (std::move (nodes)) {} + + OwningNodes values; +}; + +struct OptionalFeatures +{ + explicit OptionalFeatures (OwningNodes nodes) + : values (std::move (nodes)) {} + + OwningNodes values; +}; + +template +static bool noneOf (Range&& range, Predicate&& pred) +{ + // Not a mistake, this is for ADL + using std::begin; + using std::end; + return std::none_of (begin (range), end (range), std::forward (pred)); +} + +class PeerChangedListener : private ComponentMovementWatcher +{ +public: + PeerChangedListener (Component& c, std::function peerChangedIn) + : ComponentMovementWatcher (&c), peerChanged (std::move (peerChangedIn)) + { + } + + void componentMovedOrResized (bool, bool) override {} + void componentPeerChanged() override { NullCheckedInvocation::invoke (peerChanged); } + void componentVisibilityChanged() override {} + + using ComponentMovementWatcher::componentVisibilityChanged; + using ComponentMovementWatcher::componentMovedOrResized; + +private: + std::function peerChanged; +}; + +struct ViewSizeListener : private ComponentMovementWatcher +{ + ViewSizeListener (Component& c, PhysicalResizeListener& l) + : ComponentMovementWatcher (&c), listener (l) + { + } + + void componentMovedOrResized (bool, bool wasResized) override + { + if (wasResized) + { + const auto physicalSize = Desktop::getInstance().getDisplays() + .logicalToPhysical (getComponent()->localAreaToGlobal (getComponent()->getLocalBounds())); + const auto width = physicalSize.getWidth(); + const auto height = physicalSize.getHeight(); + + if (width > 10 && height > 10) + listener.viewRequestedResizeInPhysicalPixels (width, height); + } + } + + void componentPeerChanged() override {} + void componentVisibilityChanged() override {} + + using ComponentMovementWatcher::componentVisibilityChanged; + using ComponentMovementWatcher::componentMovedOrResized; + + PhysicalResizeListener& listener; +}; + +class ConfiguredEditorComponent : public Component, + private PhysicalResizeListener +{ +public: + ConfiguredEditorComponent (World& world, + InstanceWithSupports& instance, + UiDescriptor& uiDescriptor, + LogicalResizeListener& resizeListenerIn, + TouchListener& touchListener, + const String& uiBundleUri, + const UiFeaturesDataOptions& opts) + : resizeListener (resizeListenerIn), + floatUrid (instance.symap->map (LV2_ATOM__Float)), + scaleFactorUrid (instance.symap->map (LV2_UI__scaleFactor)), + uiInstance (new UiInstanceWithSupports (world, + *this, + touchListener, + &uiDescriptor, + UiInstanceArgs{}.withBundlePath (bundlePathFromUri (uiBundleUri.toRawUTF8())) + .withPluginUri (URL (instance.instance.getUri())), + viewComponent.getWidget(), + instance, + opts)), + resizeClient (uiInstance->instance.getExtensionData (world, LV2_UI__resize)), + optionsInterface (uiInstance->instance.getExtensionData (world, LV2_OPTIONS__interface)) + { + jassert (uiInstance != nullptr); + + setOpaque (true); + addAndMakeVisible (viewComponent); + + const auto boundsToUse = [&] + { + const auto requested = uiInstance->features.getLastRequestedBounds(); + + if (requested.getWidth() > 10 && requested.getHeight() > 10) + return requested; + + return uiInstance->instance.getDetectedViewBounds(); + }(); + + const auto scaled = lv2ToComponentRect (boundsToUse); + lastWidth = scaled.getWidth(); + lastHeight = scaled.getHeight(); + setSize (lastWidth, lastHeight); + } + + ~ConfiguredEditorComponent() override + { + viewComponent.prepareForDestruction(); + } + + void paint (Graphics& g) override + { + g.fillAll (Colours::black); + } + + void resized() override + { + viewComponent.setBounds (getLocalBounds()); + } + + void updateViewBounds() + { + // If the editor changed size as a result of a request from the client, + // we shouldn't send a notification back to the client. + if (uiInstance != nullptr) + { + if (resizeClient.valid && resizeClient.extension.ui_resize != nullptr) + { + const auto physicalSize = componentToLv2Rect (getLocalBounds()); + + resizeClient.extension.ui_resize (uiInstance->instance.getHandle(), + physicalSize.getWidth(), + physicalSize.getHeight()); + } + } + } + + void pushMessage (MessageHeader header, uint32_t size, const void* buffer) + { + if (uiInstance != nullptr) + uiInstance->instance.pushMessage (header, size, buffer); + } + + int idle() + { + if (uiInstance != nullptr) + return uiInstance->instance.idle(); + + return 0; + } + + void childBoundsChanged (Component* c) override + { + if (c == nullptr) + resizeToFitView(); + } + + void setUserScaleFactor (float userScale) { userScaleFactor = userScale; } + + void sendScaleFactorToPlugin() + { + const auto factor = getEffectiveScale(); + + const LV2_Options_Option options[] + { + { LV2_OPTIONS_INSTANCE, 0, scaleFactorUrid, sizeof (float), floatUrid, &factor }, + { {}, {}, {}, {}, {}, {} } + }; + + if (optionsInterface.valid) + optionsInterface.extension.set (uiInstance->instance.getHandle(), options); + + applyLastRequestedPhysicalSize(); + } + +private: + void viewRequestedResizeInPhysicalPixels (int width, int height) override + { + lastWidth = width; + lastHeight = height; + const auto logical = lv2ToComponentRect ({ width, height }); + resizeListener.viewRequestedResizeInLogicalPixels (logical.getWidth(), logical.getHeight()); + } + + void resizeToFitView() + { + viewComponent.fitToView(); + resizeListener.viewRequestedResizeInLogicalPixels (viewComponent.getWidth(), viewComponent.getHeight()); + } + + void applyLastRequestedPhysicalSize() + { + viewRequestedResizeInPhysicalPixels (lastWidth, lastHeight); + viewComponent.forceViewToSize(); + } + + /* Convert from the component's coordinate system to the hosted LV2's coordinate system. */ + Rectangle componentToLv2Rect (Rectangle r) const + { + return localAreaToGlobal (r) * nativeScaleFactor * getDesktopScaleFactor(); + } + + /* Convert from the hosted LV2's coordinate system to the component's coordinate system. */ + Rectangle lv2ToComponentRect (Rectangle vr) const + { + return getLocalArea (nullptr, vr / (nativeScaleFactor * getDesktopScaleFactor())); + } + + float getEffectiveScale() const { return nativeScaleFactor * userScaleFactor; } + + // If possible, try to keep platform-specific handing restricted to the implementation of + // ViewComponent. Keep the interface of ViewComponent consistent on all platforms. + #if JUCE_LINUX || JUCE_BSD + struct InnerHolder + { + struct Inner : public XEmbedComponent + { + Inner() : XEmbedComponent (true, true) + { + setOpaque (true); + addToDesktop (0); + } + }; + + Inner inner; + }; + + struct ViewComponent : public InnerHolder, + public XEmbedComponent + { + explicit ViewComponent (PhysicalResizeListener& l) + : XEmbedComponent ((unsigned long) inner.getPeer()->getNativeHandle(), true, false), + listener (inner, l) + { + setOpaque (true); + } + + ~ViewComponent() + { + removeClient(); + } + + void prepareForDestruction() + { + inner.removeClient(); + } + + LV2UI_Widget getWidget() { return lv2_shared::wordCast (inner.getHostWindowID()); } + void forceViewToSize() {} + void fitToView() {} + + ViewSizeListener listener; + }; + #elif JUCE_MAC + struct ViewComponent : public NSViewComponentWithParent + { + explicit ViewComponent (PhysicalResizeListener&) + : NSViewComponentWithParent (WantsNudge::no) {} + LV2UI_Widget getWidget() { return getView(); } + void forceViewToSize() {} + void fitToView() { resizeToFitView(); } + void prepareForDestruction() {} + }; + #elif JUCE_WINDOWS + struct ViewComponent : public HWNDComponent + { + explicit ViewComponent (PhysicalResizeListener&) + { + setOpaque (true); + inner.addToDesktop (0); + + if (auto* peer = inner.getPeer()) + setHWND (peer->getNativeHandle()); + } + + void paint (Graphics& g) override { g.fillAll (Colours::black); } + + LV2UI_Widget getWidget() { return getHWND(); } + + void forceViewToSize() { updateHWNDBounds(); } + void fitToView() { resizeToFit(); } + + void prepareForDestruction() {} + + private: + struct Inner : public Component + { + Inner() { setOpaque (true); } + void paint (Graphics& g) override { g.fillAll (Colours::black); } + }; + + Inner inner; + }; + #else + struct ViewComponent : public Component + { + explicit ViewComponent (PhysicalResizeListener&) {} + void* getWidget() { return nullptr; } + void forceViewToSize() {} + void fitToView() {} + void prepareForDestruction() {} + }; + #endif + + struct ScaleNotifierCallback + { + ConfiguredEditorComponent& window; + + void operator() (float platformScale) const + { + MessageManager::callAsync ([ref = Component::SafePointer (&window), platformScale] + { + if (auto* r = ref.getComponent()) + { + if (std::exchange (r->nativeScaleFactor, platformScale) == platformScale) + return; + + r->nativeScaleFactor = platformScale; + r->sendScaleFactorToPlugin(); + } + }); + } + }; + + LogicalResizeListener& resizeListener; + int lastWidth = 0, lastHeight = 0; + float nativeScaleFactor = 1.0f, userScaleFactor = 1.0f; + NativeScaleFactorNotifier scaleNotifier { this, ScaleNotifierCallback { *this } }; + ViewComponent viewComponent { *this }; + LV2_URID floatUrid, scaleFactorUrid; + std::unique_ptr uiInstance; + OptionalExtension resizeClient; + OptionalExtension optionsInterface; + PeerChangedListener peerListener { *this, [this] + { + applyLastRequestedPhysicalSize(); + } }; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ConfiguredEditorComponent) +}; + +//============================================================================== +/* Interface to receive notifications when the Editor changes. */ +struct EditorListener +{ + virtual ~EditorListener() = default; + + /* The editor needs to be recreated in a few different scenarios, such as: + - When the scale factor of the window changes, because we can only provide the + scale factor to the view during construction + - When the sample rate changes, because the processor also needs to be destroyed + and recreated in this case + + This function will be called whenever the editor has been recreated, in order to + allow the processor (or other listeners) to respond, e.g. by sending all of the + current port/parameter values to the view. + */ + virtual void viewCreated (UiEventListener* newListener) = 0; + + virtual void notifyEditorBeingDeleted() = 0; +}; + +/* We can't pass the InstanceWithSupports directly to the editor, because + it might be destroyed and reconstructed if the sample rate changes. +*/ +struct InstanceProvider +{ + virtual ~InstanceProvider() noexcept = default; + + virtual InstanceWithSupports* getInstanceWithSupports() const = 0; +}; + +class Editor : public AudioProcessorEditor, + public UiEventListener, + private LogicalResizeListener +{ +public: + Editor (World& worldIn, + AudioPluginInstance& p, + InstanceProvider& instanceProviderIn, + UiDescriptor& uiDescriptorIn, + TouchListener& touchListenerIn, + EditorListener& listenerIn, + const String& uiBundleUriIn, + RequiredFeatures requiredIn, + OptionalFeatures optionalIn) + : AudioProcessorEditor (p), + world (worldIn), + instanceProvider (&instanceProviderIn), + uiDescriptor (&uiDescriptorIn), + touchListener (&touchListenerIn), + listener (&listenerIn), + uiBundleUri (uiBundleUriIn), + required (std::move (requiredIn)), + optional (std::move (optionalIn)) + { + setResizable (isResizable (required, optional), false); + setSize (10, 10); + setOpaque (true); + + createView(); + + instanceProvider->getInstanceWithSupports()->processorToUi->addUi (*this); + } + + ~Editor() noexcept override + { + instanceProvider->getInstanceWithSupports()->processorToUi->removeUi (*this); + + listener->notifyEditorBeingDeleted(); + } + + void createView() + { + const auto initialScale = userScaleFactor * (float) [&] + { + if (auto* p = getPeer()) + return p->getPlatformScaleFactor(); + + return 1.0; + }(); + + const auto opts = UiFeaturesDataOptions{}.withInitialScaleFactor (initialScale) + .withSampleRate ((float) processor.getSampleRate()); + configuredEditor = nullptr; + configuredEditor = rawToUniquePtr (new ConfiguredEditorComponent (world, + *instanceProvider->getInstanceWithSupports(), + *uiDescriptor, + *this, + *touchListener, + uiBundleUri, + opts)); + parentHierarchyChanged(); + const auto initialSize = configuredEditor->getBounds(); + setSize (initialSize.getWidth(), initialSize.getHeight()); + + listener->viewCreated (this); + } + + void destroyView() + { + configuredEditor = nullptr; + } + + void paint (Graphics& g) override + { + g.fillAll (Colours::black); + } + + void resized() override + { + const ScopedValueSetter scope (resizeFromHost, true); + + if (auto* inner = configuredEditor.get()) + { + inner->setBounds (getLocalBounds()); + inner->updateViewBounds(); + } + } + + void parentHierarchyChanged() override + { + if (auto* comp = configuredEditor.get()) + { + if (isShowing()) + addAndMakeVisible (comp); + else + removeChildComponent (comp); + } + } + + void pushMessage (MessageHeader header, uint32_t size, const void* buffer) override + { + if (auto* comp = configuredEditor.get()) + comp->pushMessage (header, size, buffer); + } + + int idle() override + { + if (auto* comp = configuredEditor.get()) + return comp->idle(); + + return 0; + } + + void setScaleFactor (float newScale) override + { + userScaleFactor = newScale; + + if (configuredEditor != nullptr) + { + configuredEditor->setUserScaleFactor (userScaleFactor); + configuredEditor->sendScaleFactorToPlugin(); + } + } + +private: + bool isResizable (const RequiredFeatures& requiredFeatures, + const OptionalFeatures& optionalFeatures) const + { + const auto uriMatches = [] (const LilvNode* node) + { + const auto* uri = lilv_node_as_uri (node); + return std::strcmp (uri, LV2_UI__noUserResize) == 0; + }; + + return uiDescriptor->hasExtensionData (world, LV2_UI__resize) + && ! uiDescriptor->hasExtensionData (world, LV2_UI__noUserResize) + && noneOf (requiredFeatures.values, uriMatches) + && noneOf (optionalFeatures.values, uriMatches); + } + + bool isScalable() const + { + return uiDescriptor->hasExtensionData (world, LV2_OPTIONS__interface); + } + + void viewRequestedResizeInLogicalPixels (int width, int height) override + { + if (! resizeFromHost) + setSize (width, height); + } + + World& world; + InstanceProvider* instanceProvider; + UiDescriptor* uiDescriptor; + TouchListener* touchListener; + EditorListener* listener; + String uiBundleUri; + const RequiredFeatures required; + const OptionalFeatures optional; + std::unique_ptr configuredEditor; + float userScaleFactor = 1.0f; + bool resizeFromHost = false; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Editor) +}; + +class Uis +{ +public: + explicit Uis (const LilvPlugin* plugin) noexcept : uis (lilv_plugin_get_uis (plugin)) {} + + unsigned size() const noexcept { return lilv_uis_size (uis.get()); } + + UisIterator begin() const noexcept { return UisIterator { uis.get() }; } + UisIterator end() const noexcept { return UisIterator{}; } + + const LilvUI* getByUri (const NodeUri& uri) const + { + return lilv_uis_get_by_uri (uis.get(), uri.get()); + } + +private: + struct Free + { + void operator() (LilvUIs* ptr) const noexcept { lilv_uis_free (ptr); } + }; + + std::unique_ptr uis; +}; + +//============================================================================== +class PluginClass +{ +public: + explicit PluginClass (const LilvPluginClass* c) : pluginClass (c) {} + + NodeUri getParentUri() const noexcept { return NodeUri::copy (lilv_plugin_class_get_parent_uri (pluginClass)); } + NodeUri getUri() const noexcept { return NodeUri::copy (lilv_plugin_class_get_uri (pluginClass)); } + NodeString getLabel() const noexcept { return NodeString::copy (lilv_plugin_class_get_label (pluginClass)); } + OwningPluginClasses getChildren() const noexcept + { + return OwningPluginClasses { OwningPluginClasses::type { lilv_plugin_class_get_children (pluginClass) } }; + } + +private: + const LilvPluginClass* pluginClass = nullptr; +}; + +using FloatWriter = void (*) (LV2_Atom_Forge*, float); + +struct ParameterWriterUrids +{ + LV2_URID mLV2_PATCH__Set; + LV2_URID mLV2_PATCH__property; + LV2_URID mLV2_PATCH__value; + LV2_URID mLV2_ATOM__eventTransfer; +}; + +struct MessageHeaderAndSize +{ + MessageHeader header; + uint32_t size; +}; + +class ParameterWriter +{ +public: + ParameterWriter (ControlPort* p) + : data (PortBacking { p }), kind (Kind::port) {} + + ParameterWriter (FloatWriter write, LV2_URID urid, uint32_t controlPortIndex) + : data (PatchBacking { write, urid, controlPortIndex }), kind (Kind::patch) {} + + void writeToProcessor (const ParameterWriterUrids urids, LV2_Atom_Forge* forge, float value) const + { + switch (kind) + { + case Kind::patch: + { + if (forge != nullptr) + { + lv2_atom_forge_frame_time (forge, 0); + writeSetToForge (urids, *forge, value); + } + + break; + } + + case Kind::port: + data.port.port->currentValue = value; + break; + } + } + + MessageHeaderAndSize writeToUi (const ParameterWriterUrids urids, LV2_Atom_Forge& forge, float value) const + { + const auto getWrittenBytes = [&]() -> uint32_t + { + if (const auto* atom = convertToAtomPtr (forge.buf, forge.size)) + return (uint32_t) (atom->size + sizeof (LV2_Atom)); + + jassertfalse; + return 0; + }; + + switch (kind) + { + case Kind::patch: + writeSetToForge (urids, forge, value); + return { { data.patch.controlPortIndex, urids.mLV2_ATOM__eventTransfer }, getWrittenBytes() }; + + case Kind::port: + lv2_atom_forge_raw (&forge, &value, sizeof (value)); + return { { data.port.port->header.index, 0 }, sizeof (value) }; + } + + return { { 0, 0 }, 0 }; + } + + const LV2_URID* getUrid() const + { + return kind == Kind::patch ? &data.patch.urid : nullptr; + } + + const uint32_t* getPortIndex() const + { + return kind == Kind::port ? &data.port.port->header.index : nullptr; + } + +private: + void writeSetToForge (const ParameterWriterUrids urids, LV2_Atom_Forge& forge, float value) const + { + lv2_shared::ObjectFrame object { &forge, (uint32_t) 0, urids.mLV2_PATCH__Set }; + + lv2_atom_forge_key (&forge, urids.mLV2_PATCH__property); + lv2_atom_forge_urid (&forge, data.patch.urid); + + lv2_atom_forge_key (&forge, urids.mLV2_PATCH__value); + data.patch.write (&forge, value); + } + + struct PortBacking + { + ControlPort* port; + }; + + struct PatchBacking + { + FloatWriter write; + LV2_URID urid; + uint32_t controlPortIndex; + }; + + union Data + { + static_assert (std::is_trivial::value, "PortBacking must be trivial"); + static_assert (std::is_trivial::value, "PatchBacking must be trivial"); + + explicit Data (PortBacking p) : port (p) {} + explicit Data (PatchBacking p) : patch (p) {} + + PortBacking port; + PatchBacking patch; + }; + + enum class Kind { port, patch }; + + Data data; + Kind kind; + + JUCE_LEAK_DETECTOR (ParameterWriter) +}; + +static String lilvNodeToUriString (const LilvNode* node) +{ + return node != nullptr ? String::fromUTF8 (lilv_node_as_uri (node)) : String{}; +} + +static String lilvNodeToString (const LilvNode* node) +{ + return node != nullptr ? String::fromUTF8 (lilv_node_as_string (node)) : String{}; +} + +/* This holds all of the discovered groups in the plugin's manifest, and allows us to + add parameters to these groups as we discover them. + + Once all the parameters have been added with addParameter(), you can call + getTree() to convert this class' contents (which are optimised for fast lookup + and modification) into a plain old AudioProcessorParameterGroup. +*/ +class IntermediateParameterTree +{ +public: + explicit IntermediateParameterTree (World& worldIn) + : world (worldIn) + { + const auto groups = getGroups (world); + const auto symbolNode = world.newUri (LV2_CORE__symbol); + const auto nameNode = world.newUri (LV2_CORE__name); + + for (const auto& group : groups) + { + const auto symbol = lilvNodeToString (world.get (group.get(), symbolNode.get(), nullptr).get()); + const auto name = lilvNodeToString (world.get (group.get(), nameNode .get(), nullptr).get()); + owning.emplace (lilvNodeToUriString (group.get()), + std::make_unique (symbol, name, "|")); + } + } + + void addParameter (StringRef group, std::unique_ptr param) + { + if (param == nullptr) + return; + + const auto it = owning.find (group); + (it != owning.cend() ? *it->second : topLevel).addChild (std::move (param)); + } + + static AudioProcessorParameterGroup getTree (IntermediateParameterTree tree) + { + std::map nonowning; + + for (const auto& pair : tree.owning) + nonowning.emplace (pair.first, pair.second.get()); + + const auto groups = getGroups (tree.world); + const auto subgroupNode = tree.world.newUri (LV2_PORT_GROUPS__subGroupOf); + + for (const auto& group : groups) + { + const auto innerIt = tree.owning.find (lilvNodeToUriString (group.get())); + + if (innerIt == tree.owning.cend()) + continue; + + const auto outer = lilvNodeToUriString (tree.world.get (group.get(), subgroupNode.get(), nullptr).get()); + const auto outerIt = nonowning.find (outer); + + if (outerIt != nonowning.cend() && containsParameters (outerIt->second)) + outerIt->second->addChild (std::move (innerIt->second)); + } + + for (auto& subgroup : tree.owning) + if (containsParameters (subgroup.second.get())) + tree.topLevel.addChild (std::move (subgroup.second)); + + return std::move (tree.topLevel); + } + +private: + static std::vector getGroups (World& world) + { + std::vector names; + + for (auto* uri : { LV2_PORT_GROUPS__Group, LV2_PORT_GROUPS__InputGroup, LV2_PORT_GROUPS__OutputGroup }) + for (const auto* group : world.findNodes (nullptr, world.newUri (LILV_NS_RDF "type").get(), world.newUri (uri).get())) + names.push_back (OwningNode { lilv_node_duplicate (group) }); + + return names; + } + + static bool containsParameters (const AudioProcessorParameterGroup* g) + { + if (g == nullptr) + return false; + + for (auto* node : *g) + { + if (node->getParameter() != nullptr) + return true; + + if (auto* group = node->getGroup()) + if (containsParameters (group)) + return true; + } + + return false; + } + + World& world; + AudioProcessorParameterGroup topLevel; + std::map> owning; + + JUCE_LEAK_DETECTOR (IntermediateParameterTree) +}; + +struct BypassParameter : public LV2Parameter +{ + BypassParameter (const ParameterInfo& parameterInfo, ParameterValuesAndFlags& cacheIn) + : LV2Parameter ("Bypass", parameterInfo, cacheIn) {} + + float getValue() const noexcept override + { + return LV2Parameter::getValue() > 0.0f ? 0.0f : 1.0f; + } + + void setValue (float newValue) override + { + LV2Parameter::setValue (newValue > 0.0f ? 0.0f : 1.0f); + } + + float getDefaultValue() const override { return 0.0f; } + bool isAutomatable() const override { return true; } + bool isDiscrete() const override { return true; } + bool isBoolean() const override { return true; } + int getNumSteps() const override { return 2; } + StringArray getAllValueStrings() const override { return { TRANS ("Off"), TRANS ("On") }; } +}; + +struct ParameterData +{ + ParameterInfo info; + ParameterWriter writer; + String group; + String name; +}; + +template +static auto getPortPointers (SimpleSpan range) +{ + using std::begin; + std::vector result; + + for (auto& port : range) + { + result.resize (std::max ((size_t) (port.header.index + 1), result.size()), nullptr); + result[port.header.index] = &port; + } + + return result; +} + +static std::unique_ptr makeParameter (const uint32_t* enabledPortIndex, + const ParameterData& data, + ParameterValuesAndFlags& cache) +{ + // The bypass parameter is a bit special, in that JUCE expects the parameter to be a bypass + // (where 0 is active, 1 is inactive), but the LV2 version is called "enabled" and has + // different semantics (0 is inactive, 1 is active). + // To work around this, we wrap the LV2 parameter in a special inverting JUCE parameter. + + if (enabledPortIndex != nullptr) + if (auto* index = data.writer.getPortIndex()) + if (*index == *enabledPortIndex) + return std::make_unique (data.info, cache); + + return std::make_unique (data.name, data.info, cache); +} + +class ControlPortAccelerationStructure +{ +public: + ControlPortAccelerationStructure (SimpleSpan controlPorts) + : indexedControlPorts (getPortPointers (controlPorts)) + { + for (const auto& port : controlPorts) + if (port.header.direction == Port::Direction::output) + outputPorts.push_back (&port); + } + + const std::vector& getIndexedControlPorts() { return indexedControlPorts; } + + ControlPort* getControlPortByIndex (uint32_t index) const + { + if (isPositiveAndBelow (index, indexedControlPorts.size())) + return indexedControlPorts[index]; + + return nullptr; + } + + void writeOutputPorts (UiEventListener* target, MessageBufferInterface& uiMessages) const + { + if (target == nullptr) + return; + + for (const auto* port : outputPorts) + { + const auto chars = toChars (port->currentValue); + uiMessages.pushMessage ({ target, { port->header.index, 0 } }, (uint32_t) chars.size(), chars.data()); + } + } + +private: + std::vector indexedControlPorts; + std::vector outputPorts; +}; + +class ParameterValueCache +{ +public: + /* This takes some information about all the parameters that this plugin wants to expose, + then builds and installs the actual parameters. + */ + ParameterValueCache (AudioPluginInstance& processor, + World& world, + LV2_URID_Map mapFeature, + const std::vector& data, + ControlPort* enabledPort) + : uiForge (mapFeature), + cache (data.size()) + { + // Parameter indices are unknown until we add the parameters to the processor. + // This map lets us keep track of which ParameterWriter corresponds to each parameter. + // After the parameters have been added to the processor, we'll convert this + // to a simple vector that stores each ParameterWriter at the same index + // as the corresponding parameter. + std::map writerForParameter; + + IntermediateParameterTree tree { world }; + + const auto* enabledPortIndex = enabledPort != nullptr ? &enabledPort->header.index + : nullptr; + + for (const auto& item : data) + { + auto param = makeParameter (enabledPortIndex, item, cache); + + if (auto* urid = item.writer.getUrid()) + urids.emplace (*urid, param.get()); + + if (auto* index = item.writer.getPortIndex()) + portIndices.emplace (*index, param.get()); + + writerForParameter.emplace (param.get(), item.writer); + + tree.addParameter (item.group, std::move (param)); + } + + processor.setHostedParameterTree (IntermediateParameterTree::getTree (std::move (tree))); + + // Build the vector of writers + writers.reserve (data.size()); + + for (auto* param : processor.getParameters()) + { + const auto it = writerForParameter.find (param); + jassert (it != writerForParameter.end()); + writers.push_back (it->second); // The writer must exist at the same index as the parameter! + } + + // Duplicate port indices or urids? + jassert (processor.getParameters().size() == (int) (urids.size() + portIndices.size())); + + // Set parameters to default values + const auto setToDefault = [] (auto& container) + { + for (auto& item : container) + item.second->setDenormalisedValueWithoutTriggeringUpdate (item.second->getDenormalisedDefaultValue()); + }; + + setToDefault (urids); + setToDefault (portIndices); + } + + void postChangedParametersToProcessor (const ParameterWriterUrids helperUrids, + LV2_Atom_Forge* forge) + { + cache.ifProcessorValuesChanged ([&] (size_t index, float value) + { + writers[index].writeToProcessor (helperUrids, forge, value); + }); + } + + void postChangedParametersToUi (UiEventListener* target, + const ParameterWriterUrids helperUrids, + MessageBufferInterface& uiMessages) + { + if (target == nullptr) + return; + + cache.ifUiValuesChanged ([&] (size_t index, float value) + { + writeParameterToUi (target, writers[index], value, helperUrids, uiMessages); + }); + } + + void postAllParametersToUi (UiEventListener* target, + const ParameterWriterUrids helperUrids, + MessageBufferInterface& uiMessages) + { + if (target == nullptr) + return; + + const auto numWriters = writers.size(); + + for (size_t i = 0; i < numWriters; ++i) + writeParameterToUi (target, writers[i], cache.get (i), helperUrids, uiMessages); + + cache.clearUiFlags(); + } + + LV2Parameter* getParamByUrid (LV2_URID urid) const + { + const auto it = urids.find (urid); + return it != urids.end() ? it->second : nullptr; + } + + LV2Parameter* getParamByPortIndex (uint32_t portIndex) const + { + const auto it = portIndices.find (portIndex); + return it != portIndices.end() ? it->second : nullptr; + } + + void updateFromControlPorts (const ControlPortAccelerationStructure& ports) const + { + for (const auto& pair : portIndices) + if (auto* port = ports.getControlPortByIndex (pair.first)) + if (auto* param = pair.second) + param->setDenormalisedValueWithoutTriggeringUpdate (port->currentValue); + } + +private: + void writeParameterToUi (UiEventListener* target, + const ParameterWriter& writer, + float value, + const ParameterWriterUrids helperUrids, + MessageBufferInterface& uiMessages) + { + JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED + + uiForge.setBuffer (forgeStorage.data(), forgeStorage.size()); + const auto messageHeader = writer.writeToUi (helperUrids, *uiForge.get(), value); + uiMessages.pushMessage ({ target, messageHeader.header }, messageHeader.size, forgeStorage.data()); + } + + SingleSizeAlignedStorage<8> forgeStorage { 256 }; + lv2_shared::AtomForge uiForge; + + ParameterValuesAndFlags cache; + std::vector writers; + std::map urids; + std::map portIndices; + + JUCE_LEAK_DETECTOR (ParameterValueCache) +}; + +struct PatchSetCallback +{ + explicit PatchSetCallback (ParameterValueCache& x) : cache (x) {} + + // If we receive a patch set from the processor, we can assume that the UI will + // put itself into the correct state when it receives the message. + void setParameter (LV2_URID property, float value) const noexcept + { + if (auto* param = cache.getParamByUrid (property)) + param->setDenormalisedValueWithoutTriggeringUpdate (value); + } + + // TODO gesture support will probably go here, once it's part of the LV2 spec + + ParameterValueCache& cache; +}; + +struct SupportedParameter +{ + ParameterInfo info; + bool supported; + LV2_URID type; +}; + +static SupportedParameter getInfoForPatchParameter (World& worldIn, + const UsefulUrids& urids, + const NodeUri& property) +{ + const auto rangeUri = worldIn.newUri (LILV_NS_RDFS "range"); + const auto type = worldIn.get (property.get(), rangeUri.get(), nullptr); + + if (type == nullptr) + return { {}, false, {} }; + + const auto typeUrid = urids.symap.map (lilv_node_as_uri (type.get())); + + const LV2_URID types[] { urids.mLV2_ATOM__Int, + urids.mLV2_ATOM__Long, + urids.mLV2_ATOM__Float, + urids.mLV2_ATOM__Double, + urids.mLV2_ATOM__Bool }; + + if (std::find (std::begin (types), std::end (types), typeUrid) == std::end (types)) + return { {}, false, {} }; + + const auto getValue = [&] (const char* uri, float fallback) + { + return Port::getFloatValue (worldIn.get (property.get(), worldIn.newUri (uri).get(), nullptr).get(), fallback); + }; + + const auto hasPortProperty = [&] (const char* uri) + { + return worldIn.ask (property.get(), + worldIn.newUri (LV2_CORE__portProperty).get(), + worldIn.newUri (uri).get()); + }; + + const auto metadataScalePoints = worldIn.findNodes (property.get(), + worldIn.newUri (LV2_CORE__scalePoint).get(), + nullptr); + SafeSortedSet parsedScalePoints; + + for (const auto* scalePoint : metadataScalePoints) + { + const auto label = worldIn.get (scalePoint, worldIn.newUri (LILV_NS_RDFS "label").get(), nullptr); + const auto value = worldIn.get (scalePoint, worldIn.newUri (LILV_NS_RDF "value").get(), nullptr); + + if (label != nullptr && value != nullptr) + parsedScalePoints.insert ({ lilv_node_as_string (label.get()), lilv_node_as_float (value.get()) }); + else + jassertfalse; // A ScalePoint must have both a rdfs:label and a rdf:value + } + + const auto minimum = getValue (LV2_CORE__minimum, 0.0f); + const auto maximum = getValue (LV2_CORE__maximum, 1.0f); + + return { { std::move (parsedScalePoints), + "des:" + String::fromUTF8 (property.getTyped()), + getValue (LV2_CORE__default, (minimum + maximum) * 0.5f), + minimum, + maximum, + typeUrid == urids.mLV2_ATOM__Bool || hasPortProperty (LV2_CORE__toggled), + typeUrid == urids.mLV2_ATOM__Int || typeUrid == urids.mLV2_ATOM__Long, + hasPortProperty (LV2_CORE__enumeration) }, + true, + typeUrid }; +} + +static std::vector getPortBasedParameters (World& world, + const Plugin& plugin, + std::initializer_list hiddenPorts, + SimpleSpan controlPorts) +{ + std::vector result; + + const auto groupNode = world.newUri (LV2_PORT_GROUPS__group); + + for (auto& port : controlPorts) + { + if (port.header.direction != Port::Direction::input) + continue; + + if (std::find (std::begin (hiddenPorts), std::end (hiddenPorts), &port) != std::end (hiddenPorts)) + continue; + + const auto lilvPort = plugin.getPortByIndex (port.header.index); + const auto group = lilvNodeToUriString (lilvPort.get (groupNode.get()).get()); + + result.push_back ({ port.info, ParameterWriter { &port }, group, port.header.name }); + } + + return result; +} + +static void writeFloatToForge (LV2_Atom_Forge* forge, float value) { lv2_atom_forge_float (forge, value); } +static void writeDoubleToForge (LV2_Atom_Forge* forge, float value) { lv2_atom_forge_double (forge, (double) value); } +static void writeIntToForge (LV2_Atom_Forge* forge, float value) { lv2_atom_forge_int (forge, (int32_t) value); } +static void writeLongToForge (LV2_Atom_Forge* forge, float value) { lv2_atom_forge_long (forge, (int64_t) value); } +static void writeBoolToForge (LV2_Atom_Forge* forge, float value) { lv2_atom_forge_bool (forge, value > 0.5f); } + +static std::vector getPatchBasedParameters (World& world, + const Plugin& plugin, + const UsefulUrids& urids, + uint32_t controlPortIndex) +{ + // This returns our writable parameters in an indeterminate order. + // We want our parameters to be in a consistent order between runs, so + // we'll create all the parameters in one pass, sort them, and then + // add them in a separate pass. + const auto writableControls = world.findNodes (plugin.getUri().get(), + world.newUri (LV2_PATCH__writable).get(), + nullptr); + + struct DataAndUri + { + ParameterData data; + String uri; + }; + + std::vector resultWithUris; + + const auto groupNode = world.newUri (LV2_PORT_GROUPS__group); + + for (auto* ctrl : writableControls) + { + const auto labelString = [&] + { + if (auto label = world.get (ctrl, world.newUri (LILV_NS_RDFS "label").get(), nullptr)) + return String::fromUTF8 (lilv_node_as_string (label.get())); + + return String(); + }(); + + const auto uri = String::fromUTF8 (lilv_node_as_uri (ctrl)); + const auto info = getInfoForPatchParameter (world, urids, world.newUri (uri.toRawUTF8())); + + if (! info.supported) + continue; + + const auto write = [&] + { + if (info.type == urids.mLV2_ATOM__Int) + return writeIntToForge; + + if (info.type == urids.mLV2_ATOM__Long) + return writeLongToForge; + + if (info.type == urids.mLV2_ATOM__Double) + return writeDoubleToForge; + + if (info.type == urids.mLV2_ATOM__Bool) + return writeBoolToForge; + + return writeFloatToForge; + }(); + + const auto group = lilvNodeToUriString (world.get (ctrl, groupNode.get(), nullptr).get()); + resultWithUris.push_back ({ { info.info, + ParameterWriter { write, urids.symap.map (uri.toRawUTF8()), controlPortIndex }, + group, + labelString }, + uri }); + } + + const auto compareUris = [] (const DataAndUri& a, const DataAndUri& b) { return a.uri < b.uri; }; + std::sort (resultWithUris.begin(), resultWithUris.end(), compareUris); + + std::vector result; + + for (const auto& item : resultWithUris) + result.push_back (item.data); + + return result; +} + +static std::vector getJuceParameterInfo (World& world, + const Plugin& plugin, + const UsefulUrids& urids, + std::initializer_list hiddenPorts, + SimpleSpan controlPorts, + uint32_t controlPortIndex) +{ + auto port = getPortBasedParameters (world, plugin, hiddenPorts, controlPorts); + auto patch = getPatchBasedParameters (world, plugin, urids, controlPortIndex); + + port.insert (port.end(), patch.begin(), patch.end()); + return port; +} + +// Rather than sprinkle #ifdef everywhere, risking the wrath of the entire C++ +// standards committee, we put all of our conditionally-compiled stuff into a +// specialised template that compiles away to nothing when editor support is +// not available. +#if JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD + constexpr auto editorFunctionalityEnabled = true; +#else + constexpr auto editorFunctionalityEnabled = false; +#endif + +template class OptionalEditor; + +template <> +class OptionalEditor +{ +public: + OptionalEditor (String uiBundleUriIn, UiDescriptor uiDescriptorIn, std::function timerCallback) + : uiBundleUri (std::move (uiBundleUriIn)), + uiDescriptor (std::move (uiDescriptorIn)), + changedParameterFlusher (std::move (timerCallback)) {} + + void createView() + { + if (auto* editor = editorPointer.getComponent()) + editor->createView(); + } + + void destroyView() + { + if (auto* editor = editorPointer.getComponent()) + editor->destroyView(); + } + + std::unique_ptr createEditor (World& world, + AudioPluginInstance& p, + InstanceProvider& instanceProviderIn, + TouchListener& touchListenerIn, + EditorListener& listenerIn) + { + if (! hasEditor()) + return nullptr; + + const auto queryFeatures = [this, &world] (const char* kind) + { + return world.findNodes (world.newUri (uiDescriptor.get()->URI).get(), + world.newUri (kind).get(), + nullptr); + }; + + auto newEditor = std::make_unique (world, + p, + instanceProviderIn, + uiDescriptor, + touchListenerIn, + listenerIn, + uiBundleUri, + RequiredFeatures { queryFeatures (LV2_CORE__requiredFeature) }, + OptionalFeatures { queryFeatures (LV2_CORE__optionalFeature) }); + + editorPointer = newEditor.get(); + + changedParameterFlusher.startTimerHz (60); + + return newEditor; + } + + bool hasEditor() const + { + return uiDescriptor.get() != nullptr; + } + + void prepareToDestroyEditor() + { + changedParameterFlusher.stopTimer(); + } + +private: + Component::SafePointer editorPointer = nullptr; + String uiBundleUri; + UiDescriptor uiDescriptor; + LambdaTimer changedParameterFlusher; +}; + +template <> +class OptionalEditor +{ +public: + OptionalEditor (String, UiDescriptor, std::function) {} + + void createView() {} + void destroyView() {} + + std::unique_ptr createEditor(World&, + AudioPluginInstance&, + InstanceProvider&, + TouchListener&, + EditorListener&) + { + return nullptr; + } + + bool hasEditor() const { return false; } + void prepareToDestroyEditor() {} +}; + +//============================================================================== +class LV2AudioPluginInstance : public AudioPluginInstance, + private TouchListener, + private EditorListener, + private InstanceProvider +{ +public: + LV2AudioPluginInstance (std::shared_ptr worldIn, + const Plugin& pluginIn, + const UsefulUris& uris, + std::unique_ptr&& in, + PluginDescription&& desc, + std::vector knownPresetUris, + PluginState stateToApply, + String uiBundleUriIn, + UiDescriptor uiDescriptorIn) + : LV2AudioPluginInstance (worldIn, + pluginIn, + std::move (in), + std::move (desc), + std::move (knownPresetUris), + std::move (stateToApply), + std::move (uiBundleUriIn), + std::move (uiDescriptorIn), + getParsedBuses (*worldIn, pluginIn, uris)) {} + + void fillInPluginDescription (PluginDescription& d) const override { d = description; } + + const String getName() const override { return description.name; } + + void prepareToPlay (double sampleRate, int numSamples) override + { + // In REAPER, changing the sample rate will deactivate the plugin, + // save its state, destroy it, create a new instance, restore the + // state, and then activate the new instance. + // We'll do the same, because there's no way to retroactively change the + // plugin sample rate. + // This is a bit expensive, so try to avoid changing the sample rate too + // frequently. + + // In addition to the above, we also need to destroy the custom view, + // and recreate it after creating the new plugin instance. + // Ideally this should all happen in the same Component. + + deactivate(); + destroyView(); + + MemoryBlock mb; + getStateInformation (mb); + + instance = std::make_unique (*world, + std::move (instance->symap), + plugin, + std::move (instance->ports), + numSamples, + sampleRate); + + // prepareToPlay is *guaranteed* not to be called concurrently with processBlock + setStateInformationImpl (mb.getData(), (int) mb.getSize(), ConcurrentWithAudioCallback::no); + + jassert (numSamples == instance->features.getMaxBlockSize()); + + optionalEditor.createView(); + activate(); + } + + void releaseResources() override { deactivate(); } + + using AudioPluginInstance::processBlock; + using AudioPluginInstance::processBlockBypassed; + + void processBlock (AudioBuffer& audio, MidiBuffer& midi) override + { + processBlockImpl (audio, midi); + } + + void processBlockBypassed (AudioBuffer& audio, MidiBuffer& midi) override + { + if (bypassParam != nullptr) + processBlockImpl (audio, midi); + else + AudioPluginInstance::processBlockBypassed (audio, midi); + } + + double getTailLengthSeconds() const override { return {}; } // TODO + + bool acceptsMidi() const override + { + if (instance == nullptr) + return false; + + auto ports = instance->ports.getAtomPorts(); + + return std::any_of (ports.begin(), ports.end(), [&] (const AtomPort& a) + { + if (a.header.direction != Port::Direction::input) + return false; + + return portAtIndexSupportsMidi (a.header.index); + }); + } + + bool producesMidi() const override + { + if (instance == nullptr) + return false; + + auto ports = instance->ports.getAtomPorts(); + + return std::any_of (ports.begin(), ports.end(), [&] (const AtomPort& a) + { + if (a.header.direction != Port::Direction::output) + return false; + + return portAtIndexSupportsMidi (a.header.index); + }); + } + + AudioProcessorEditor* createEditor() override + { + return optionalEditor.createEditor (*world, *this, *this, *this, *this).release(); + } + + bool hasEditor() const override + { + return optionalEditor.hasEditor(); + } + + int getNumPrograms() override { return (int) presetUris.size(); } + + int getCurrentProgram() override + { + return lastAppliedPreset; + } + + void setCurrentProgram (int newProgram) override + { + JUCE_ASSERT_MESSAGE_THREAD; + + if (! isPositiveAndBelow (newProgram, presetUris.size())) + return; + + lastAppliedPreset = newProgram; + applyStateWithAppropriateLocking (loadStateWithUri (presetUris[(size_t) newProgram]), + ConcurrentWithAudioCallback::yes); + } + + const String getProgramName (int program) override + { + JUCE_ASSERT_MESSAGE_THREAD; + + if (isPositiveAndBelow (program, presetUris.size())) + return loadStateWithUri (presetUris[(size_t) program]).getLabel(); + + return {}; + } + + void changeProgramName (int program, const String& label) override + { + JUCE_ASSERT_MESSAGE_THREAD; + + if (isPositiveAndBelow (program, presetUris.size())) + loadStateWithUri (presetUris[(size_t) program]).setLabel (label); + } + + void getStateInformation (MemoryBlock& block) override + { + JUCE_ASSERT_MESSAGE_THREAD; + + // TODO where should the state URI come from? + PortMap portStateManager (instance->ports); + const auto stateUri = String::fromUTF8 (instance->instance.getUri()) + "/savedState"; + auto mapFeature = instance->symap->getMapFeature(); + auto unmapFeature = instance->symap->getUnmapFeature(); + const auto state = PluginState::SaveRestoreHandle (*instance, portStateManager).save (plugin.get(), &mapFeature); + const auto string = state.toString (world->get(), &mapFeature, &unmapFeature, stateUri.toRawUTF8()); + block.replaceAll (string.data(), string.size()); + } + + void setStateInformation (const void* data, int size) override + { + setStateInformationImpl (data, size, ConcurrentWithAudioCallback::yes); + } + + void setNonRealtime (bool newValue) noexcept override + { + JUCE_ASSERT_MESSAGE_THREAD; + + AudioPluginInstance::setNonRealtime (newValue); + instance->features.setNonRealtime (newValue); + } + + bool isBusesLayoutSupported (const BusesLayout& layout) const override + { + for (const auto& pair : { std::make_tuple (&layout.inputBuses, &declaredBusLayout.inputs), + std::make_tuple (&layout.outputBuses, &declaredBusLayout.outputs) }) + { + const auto& requested = *std::get<0> (pair); + const auto& allowed = *std::get<1> (pair); + + if ((size_t) requested.size() != allowed.size()) + return false; + + for (size_t busIndex = 0; busIndex < allowed.size(); ++busIndex) + { + const auto& requestedBus = requested[(int) busIndex]; + const auto& allowedBus = allowed[busIndex]; + + if (! allowedBus.isCompatible (requestedBus)) + return false; + } + } + + return true; + } + + void processorLayoutsChanged() override { ioMap = lv2_shared::PortToAudioBufferMap { getBusesLayout(), declaredBusLayout }; } + + AudioProcessorParameter* getBypassParameter() const override { return bypassParam; } + +private: + enum class ConcurrentWithAudioCallback { no, yes }; + + LV2AudioPluginInstance (std::shared_ptr worldIn, + const Plugin& pluginIn, + std::unique_ptr&& in, + PluginDescription&& desc, + std::vector knownPresetUris, + PluginState stateToApply, + String uiBundleUriIn, + UiDescriptor uiDescriptorIn, + const lv2_shared::ParsedBuses& parsedBuses) + : AudioPluginInstance (getBusesProperties (parsedBuses, *worldIn)), + declaredBusLayout (parsedBuses), + world (std::move (worldIn)), + plugin (pluginIn), + description (std::move (desc)), + presetUris (std::move (knownPresetUris)), + instance (std::move (in)), + optionalEditor (std::move (uiBundleUriIn), + std::move (uiDescriptorIn), + [this] { postChangedParametersToUi(); }) + { + applyStateWithAppropriateLocking (std::move (stateToApply), ConcurrentWithAudioCallback::no); + } + + void setStateInformationImpl (const void* data, int size, ConcurrentWithAudioCallback concurrent) + { + JUCE_ASSERT_MESSAGE_THREAD; + + if (data == nullptr || size == 0) + return; + + auto begin = static_cast (data); + std::vector copy (begin, begin + size); + copy.push_back (0); + auto mapFeature = instance->symap->getMapFeature(); + applyStateWithAppropriateLocking (PluginState { lilv_state_new_from_string (world->get(), &mapFeature, copy.data()) }, + concurrent); + } + + // This does *not* destroy the editor component. + // If we destroy the processor, the view must also be destroyed to avoid dangling pointers. + // However, JUCE clients expect their editors to remain valid for the duration of the + // AudioProcessor's lifetime. + // As a compromise, this will create a new LV2 view into an existing editor component. + void destroyView() + { + optionalEditor.destroyView(); + } + + void activate() + { + if (! active) + instance->instance.activate(); + + active = true; + } + + void deactivate() + { + if (active) + instance->instance.deactivate(); + + active = false; + } + + void processBlockImpl (AudioBuffer& audio, MidiBuffer& midi) + { + preparePortsForRun (audio, midi); + + instance->instance.run (static_cast (audio.getNumSamples())); + instance->features.processResponses(); + + processPortsAfterRun (midi); + } + + bool portAtIndexSupportsMidi (uint32_t index) const noexcept + { + const auto port = plugin.getPortByIndex (index); + + if (! port.isValid()) + return false; + + return port.supportsEvent (world->newUri (LV2_MIDI__MidiEvent).get()); + } + + void controlGrabbed (uint32_t port, bool grabbed) override + { + if (auto* param = parameterValues.getParamByPortIndex (port)) + { + if (grabbed) + param->beginChangeGesture(); + else + param->endChangeGesture(); + } + } + + void viewCreated (UiEventListener* newListener) override + { + uiEventListener = newListener; + postAllParametersToUi(); + } + + ParameterWriterUrids getParameterWriterUrids() const + { + return { instance->urids.mLV2_PATCH__Set, + instance->urids.mLV2_PATCH__property, + instance->urids.mLV2_PATCH__value, + instance->urids.mLV2_ATOM__eventTransfer }; + } + + void postAllParametersToUi() + { + parameterValues.postAllParametersToUi (uiEventListener, getParameterWriterUrids(), *instance->processorToUi); + controlPortStructure.writeOutputPorts (uiEventListener, *instance->processorToUi); + } + + void postChangedParametersToUi() + { + parameterValues.postChangedParametersToUi (uiEventListener, getParameterWriterUrids(), *instance->processorToUi); + controlPortStructure.writeOutputPorts (uiEventListener, *instance->processorToUi); + } + + void notifyEditorBeingDeleted() override + { + optionalEditor.prepareToDestroyEditor(); + uiEventListener = nullptr; + editorBeingDeleted (getActiveEditor()); + } + + InstanceWithSupports* getInstanceWithSupports() const override + { + return instance.get(); + } + + void applyStateWithAppropriateLocking (PluginState&& state, ConcurrentWithAudioCallback concurrent) + { + PortMap portStateManager (instance->ports); + + // If a plugin supports threadSafeRestore, its restore method is thread-safe + // and may be called concurrently with audio class functions. + if (hasThreadSafeRestore || concurrent == ConcurrentWithAudioCallback::no) + { + state.restore (*instance, portStateManager); + } + else + { + const ScopedLock lock (getCallbackLock()); + state.restore (*instance, portStateManager); + } + + parameterValues.updateFromControlPorts (controlPortStructure); + asyncFullUiParameterUpdate.triggerAsyncUpdate(); + } + + PluginState loadStateWithUri (const String& str) + { + auto mapFeature = instance->symap->getMapFeature(); + const auto presetUri = world->newUri (str.toRawUTF8()); + lilv_world_load_resource (world->get(), presetUri.get()); + return PluginState { lilv_state_new_from_world (world->get(), &mapFeature, presetUri.get()) }; + } + + void connectPorts (AudioBuffer& audio) + { + // Plugins that cannot process in-place will require the feature "inPlaceBroken". + // We don't support that feature, so if we made it to this point we can assume that + // in-place processing works. + for (const auto& port : instance->ports.getAudioPorts()) + { + const auto channel = ioMap.getChannelForPort (port.header.index); + auto* ptr = isPositiveAndBelow (channel, audio.getNumChannels()) ? audio.getWritePointer (channel) + : nullptr; + instance->instance.connectPort (port.header.index, ptr); + } + + for (const auto& port : instance->ports.getCvPorts()) + instance->instance.connectPort (port.header.index, nullptr); + + for (auto& port : instance->ports.getAtomPorts()) + instance->instance.connectPort (port.header.index, port.data()); + } + + void writeTimeInfoToPort (AtomPort& port) + { + if (port.header.direction != Port::Direction::input || ! port.getSupportsTime()) + return; + + auto* forge = port.getForge().get(); + auto* playhead = getPlayHead(); + + if (playhead == nullptr) + return; + + // Write timing info to the control port + const auto info = playhead->getPosition(); + + if (! info.hasValue()) + return; + + const auto& urids = instance->urids; + + lv2_atom_forge_frame_time (forge, 0); + + lv2_shared::ObjectFrame object { forge, (uint32_t) 0, urids.mLV2_TIME__Position }; + + lv2_atom_forge_key (forge, urids.mLV2_TIME__speed); + lv2_atom_forge_float (forge, info->getIsPlaying() ? 1.0f : 0.0f); + + if (const auto samples = info->getTimeInSamples()) + { + lv2_atom_forge_key (forge, urids.mLV2_TIME__frame); + lv2_atom_forge_long (forge, *samples); + } + + if (const auto bar = info->getBarCount()) + { + lv2_atom_forge_key (forge, urids.mLV2_TIME__bar); + lv2_atom_forge_long (forge, *bar); + } + + if (const auto beat = info->getPpqPosition()) + { + if (const auto barStart = info->getPpqPositionOfLastBarStart()) + { + lv2_atom_forge_key (forge, urids.mLV2_TIME__barBeat); + lv2_atom_forge_float (forge, (float) (*beat - *barStart)); + } + + lv2_atom_forge_key (forge, urids.mLV2_TIME__beat); + lv2_atom_forge_double (forge, *beat); + } + + if (const auto sig = info->getTimeSignature()) + { + lv2_atom_forge_key (forge, urids.mLV2_TIME__beatUnit); + lv2_atom_forge_int (forge, sig->denominator); + + lv2_atom_forge_key (forge, urids.mLV2_TIME__beatsPerBar); + lv2_atom_forge_float (forge, (float) sig->numerator); + } + + if (const auto bpm = info->getBpm()) + { + lv2_atom_forge_key (forge, urids.mLV2_TIME__beatsPerMinute); + lv2_atom_forge_float (forge, (float) *bpm); + } + } + + void preparePortsForRun (AudioBuffer& audio, MidiBuffer& midiBuffer) + { + connectPorts (audio); + + for (auto& port : instance->ports.getAtomPorts()) + { + switch (port.header.direction) + { + case Port::Direction::input: + port.beginSequence(); + break; + + case Port::Direction::output: + port.replaceWithChunk(); + break; + + case Port::Direction::unknown: + jassertfalse; + break; + } + } + + for (auto& port : instance->ports.getAtomPorts()) + writeTimeInfoToPort (port); + + const auto controlPortForge = controlPort != nullptr ? controlPort->getForge().get() + : nullptr; + + parameterValues.postChangedParametersToProcessor (getParameterWriterUrids(), controlPortForge); + + instance->uiToProcessor.readAllAndClear ([this] (MessageHeader header, uint32_t size, const void* buffer) + { + pushMessage (header, size, buffer); + }); + + for (auto& port : instance->ports.getAtomPorts()) + { + if (port.header.direction == Port::Direction::input) + { + for (const auto meta : midiBuffer) + { + port.addEventToSequence (meta.samplePosition, + instance->urids.mLV2_MIDI__MidiEvent, + static_cast (meta.numBytes), + meta.data); + } + + port.endSequence(); + } + } + + if (freeWheelingPort != nullptr) + freeWheelingPort->currentValue = isNonRealtime() ? freeWheelingPort->info.max + : freeWheelingPort->info.min; + } + + void pushMessage (MessageHeader header, uint32_t size, const void* data) + { + ignoreUnused (size); + + if (header.protocol == 0 || header.protocol == instance->urids.mLV2_UI__floatProtocol) + { + const auto value = readUnaligned (data); + + if (auto* param = parameterValues.getParamByPortIndex (header.portIndex)) + { + param->setDenormalisedValue (value); + } + else if (auto* port = controlPortStructure.getControlPortByIndex (header.portIndex)) + { + // No parameter corresponds to this port, write to the port directly + port->currentValue = value; + } + } + else if (auto* atomPort = header.portIndex < atomPorts.size() ? atomPorts[header.portIndex] : nullptr) + { + if (header.protocol == instance->urids.mLV2_ATOM__eventTransfer) + { + if (const auto* atom = convertToAtomPtr (data, (size_t) size)) + { + atomPort->addAtomToSequence (0, atom); + + // Not UB; LV2_Atom_Object has LV2_Atom as its first member + if (atom->type == instance->urids.mLV2_ATOM__Object) + patchSetHelper.processPatchSet (reinterpret_cast (data), PatchSetCallback { parameterValues }); + } + } + else if (header.protocol == instance->urids.mLV2_ATOM__atomTransfer) + { + if (const auto* atom = convertToAtomPtr (data, (size_t) size)) + atomPort->replaceBufferWithAtom (atom); + } + } + } + + void processPortsAfterRun (MidiBuffer& midi) + { + midi.clear(); + + for (auto& port : instance->ports.getAtomPorts()) + processAtomPort (port, midi); + + if (latencyPort != nullptr) + setLatencySamples ((int) latencyPort->currentValue); + } + + void processAtomPort (const AtomPort& port, MidiBuffer& midi) + { + if (port.header.direction != Port::Direction::output) + return; + + // The port holds an Atom, by definition + const auto* atom = reinterpret_cast (port.data()); + + if (atom->type != instance->urids.mLV2_ATOM__Sequence) + return; + + // The Atom said that it was of sequence type, so this isn't UB + const auto* sequence = reinterpret_cast (port.data()); + + // http://lv2plug.in/ns/ext/atom#Sequence - run() stamps are always audio frames + jassert (sequence->body.unit == 0 || sequence->body.unit == instance->urids.mLV2_UNITS__frame); + + for (const auto* event : lv2_shared::SequenceIterator { lv2_shared::SequenceWithSize { sequence } }) + { + // At the moment, we forward all outgoing events to the UI. + instance->processorToUi->pushMessage ({ uiEventListener, { port.header.index, instance->urids.mLV2_ATOM__eventTransfer } }, + (uint32_t) (event->body.size + sizeof (LV2_Atom)), + &event->body); + + if (event->body.type == instance->urids.mLV2_MIDI__MidiEvent) + midi.addEvent (event + 1, static_cast (event->body.size), static_cast (event->time.frames)); + + if (lv2_atom_forge_is_object_type (port.getForge().get(), event->body.type)) + if (reinterpret_cast (event + 1)->otype == instance->urids.mLV2_STATE__StateChanged) + updateHostDisplay (ChangeDetails{}.withNonParameterStateChanged (true)); + + patchSetHelper.processPatchSet (event, PatchSetCallback { parameterValues }); + } + } + + // Check for duplicate channel designations, and convert the set to a discrete channel layout + // if any designations are duplicated. + static std::set validateAndRedesignatePorts (std::set info) + { + const auto channelSet = lv2_shared::ParsedGroup::getEquivalentSet (info); + + if ((int) info.size() == channelSet.size()) + return info; + + std::set result; + auto designation = (int) AudioChannelSet::discreteChannel0; + + for (auto& item : info) + { + auto copy = item; + copy.designation = (AudioChannelSet::ChannelType) designation++; + result.insert (copy); + } + + return result; + } + + static AudioChannelSet::ChannelType getPortDesignation (World& world, const Port& port, size_t indexInGroup) + { + const auto defaultResult = (AudioChannelSet::ChannelType) (AudioChannelSet::discreteChannel0 + indexInGroup); + const auto node = port.get (world.newUri (LV2_CORE__designation).get()); + + if (node == nullptr) + return defaultResult; + + const auto it = lv2_shared::channelDesignationMap.find (lilvNodeToUriString (node.get())); + + if (it == lv2_shared::channelDesignationMap.end()) + return defaultResult; + + return it->second; + } + + static lv2_shared::ParsedBuses getParsedBuses (World& world, const Plugin& p, const UsefulUris& uris) + { + const auto groupPropertyUri = world.newUri (LV2_PORT_GROUPS__group); + const auto optionalUri = world.newUri (LV2_CORE__connectionOptional); + + std::map> inputGroups, outputGroups; + std::set ungroupedInputs, ungroupedOutputs; + + for (uint32_t i = 0, numPorts = p.getNumPorts(); i < numPorts; ++i) + { + const auto port = p.getPortByIndex (i); + + if (port.getKind (uris) != Port::Kind::audio) + continue; + + const auto groupUri = lilvNodeToUriString (port.get (groupPropertyUri.get()).get()); + + auto& set = [&]() -> auto& + { + if (groupUri.isEmpty()) + return port.getDirection (uris) == Port::Direction::input ? ungroupedInputs : ungroupedOutputs; + + auto& group = port.getDirection (uris) == Port::Direction::input ? inputGroups : outputGroups; + return group[groupUri]; + }(); + + set.insert ({ port.getIndex(), getPortDesignation (world, port, set.size()), port.hasProperty (optionalUri) }); + } + + for (auto* groups : { &inputGroups, &outputGroups }) + for (auto& pair : *groups) + pair.second = validateAndRedesignatePorts (std::move (pair.second)); + + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4702) + const auto getMainGroupName = [&] (const char* propertyName) + { + for (const auto* item : p.getValue (world.newUri (propertyName).get())) + return lilvNodeToUriString (item); + + return String{}; + }; + JUCE_END_IGNORE_WARNINGS_MSVC + + return { findStableBusOrder (getMainGroupName (LV2_PORT_GROUPS__mainInput), inputGroups, ungroupedInputs), + findStableBusOrder (getMainGroupName (LV2_PORT_GROUPS__mainOutput), outputGroups, ungroupedOutputs) }; + } + + static String getNameForUri (World& world, StringRef uri) + { + if (uri.isEmpty()) + return String(); + + const auto node = world.get (world.newUri (uri).get(), + world.newUri (LV2_CORE__name).get(), + nullptr); + + if (node == nullptr) + return String(); + + return String::fromUTF8 (lilv_node_as_string (node.get())); + } + + static BusesProperties getBusesProperties (const lv2_shared::ParsedBuses& parsedBuses, World& world) + { + BusesProperties result; + + for (const auto& pair : { std::make_tuple (&parsedBuses.inputs, &result.inputLayouts), + std::make_tuple (&parsedBuses.outputs, &result.outputLayouts) }) + { + const auto& buses = *std::get<0> (pair); + auto& layout = *std::get<1> (pair); + + for (const auto& bus : buses) + { + layout.add (AudioProcessor::BusProperties { getNameForUri (world, bus.uid), + bus.getEquivalentSet(), + bus.isRequired() }); + } + } + + return result; + } + + LV2_URID map (const char* str) const + { + return instance != nullptr ? instance->symap->map (str) + : LV2_URID(); + } + + ControlPort* findControlPortWithIndex (uint32_t index) const + { + auto ports = instance->ports.getControlPorts(); + const auto indexMatches = [&] (const ControlPort& p) { return p.header.index == index; }; + const auto it = std::find_if (ports.begin(), ports.end(), indexMatches); + + return it != ports.end() ? &(*it) : nullptr; + } + + const lv2_shared::ParsedBuses declaredBusLayout; + lv2_shared::PortToAudioBufferMap ioMap { getBusesLayout(), declaredBusLayout }; + std::shared_ptr world; + Plugin plugin; + PluginDescription description; + std::vector presetUris; + std::unique_ptr instance; + AsyncFn asyncFullUiParameterUpdate { [this] { postAllParametersToUi(); } }; + + std::vector atomPorts = getPortPointers (instance->ports.getAtomPorts()); + + AtomPort* const controlPort = [&]() -> AtomPort* + { + const auto port = plugin.getPortByDesignation (world->newUri (LV2_CORE__InputPort).get(), + world->newUri (LV2_CORE__control).get()); + + if (! port.isValid()) + return nullptr; + + const auto index = port.getIndex(); + + if (! isPositiveAndBelow (index, atomPorts.size())) + return nullptr; + + return atomPorts[index]; + }(); + + ControlPort* const latencyPort = [&]() -> ControlPort* + { + if (! plugin.hasLatency()) + return nullptr; + + return findControlPortWithIndex (plugin.getLatencyPortIndex()); + }(); + + ControlPort* const freeWheelingPort = [&]() -> ControlPort* + { + const auto port = plugin.getPortByDesignation (world->newUri (LV2_CORE__InputPort).get(), + world->newUri (LV2_CORE__freeWheeling).get()); + + if (! port.isValid()) + return nullptr; + + return findControlPortWithIndex (port.getIndex()); + }(); + + ControlPort* const enabledPort = [&]() -> ControlPort* + { + const auto port = plugin.getPortByDesignation (world->newUri (LV2_CORE__InputPort).get(), + world->newUri (LV2_CORE_PREFIX "enabled").get()); + + if (! port.isValid()) + return nullptr; + + return findControlPortWithIndex (port.getIndex()); + }(); + + lv2_shared::PatchSetHelper patchSetHelper { instance->symap->getMapFeature(), plugin.getUri().getTyped() }; + ControlPortAccelerationStructure controlPortStructure { instance->ports.getControlPorts() }; + ParameterValueCache parameterValues { *this, + *world, + instance->symap->getMapFeature(), + getJuceParameterInfo (*world, + plugin, + instance->urids, + { latencyPort, freeWheelingPort }, + instance->ports.getControlPorts(), + controlPort != nullptr ? controlPort->header.index : 0), + enabledPort }; + LV2Parameter* bypassParam = enabledPort != nullptr ? parameterValues.getParamByPortIndex (enabledPort->header.index) + : nullptr; + + std::atomic uiEventListener { nullptr }; + OptionalEditor<> optionalEditor; + int lastAppliedPreset = 0; + bool hasThreadSafeRestore = plugin.hasExtensionData (world->newUri (LV2_STATE__threadSafeRestore)); + bool active { false }; + + JUCE_LEAK_DETECTOR (LV2AudioPluginInstance) +}; + +} // namespace lv2 + +//============================================================================== +class LV2PluginFormat::Pimpl +{ +public: + Pimpl() + { + world->loadAll(); + + const auto tempFile = lv2ResourceFolder.getFile(); + + if (tempFile.createDirectory()) + { + for (const auto& bundle : lv2::Bundle::getAllBundles()) + { + const auto pathToBundle = tempFile.getChildFile (bundle.name + String (".lv2")); + + if (! pathToBundle.createDirectory()) + continue; + + for (const auto& resource : bundle.contents) + pathToBundle.getChildFile (resource.name).replaceWithText (resource.contents); + + const auto pathString = File::addTrailingSeparator (pathToBundle.getFullPathName()); + world->loadBundle (world->newFileUri (nullptr, pathString.toRawUTF8())); + } + } + } + + ~Pimpl() + { + lv2ResourceFolder.getFile().deleteRecursively(); + } + + void findAllTypesForFile (OwnedArray& result, + const String& identifier) + { + auto desc = getDescription (findPluginByUri (identifier)); + + if (desc.fileOrIdentifier.isNotEmpty()) + result.add (std::make_unique (desc)); + } + + bool fileMightContainThisPluginType (const String& file) const + { + // If the string looks like a URI, then it could be a valid LV2 identifier + const auto* data = file.toRawUTF8(); + const auto numBytes = file.getNumBytesAsUTF8(); + std::vector vec (numBytes + 1, 0); + std::copy (data, data + numBytes, vec.begin()); + return serd_uri_string_has_scheme (vec.data()); + } + + String getNameOfPluginFromIdentifier (const String& identifier) + { + // We would have to actually load the bundle to get its name, + // and the bundle may contain multiple plugins + return identifier; + } + + bool pluginNeedsRescanning (const PluginDescription&) + { + return true; + } + + bool doesPluginStillExist (const PluginDescription& description) + { + return findPluginByUri (description.fileOrIdentifier) != nullptr; + } + + StringArray searchPathsForPlugins (const FileSearchPath&, bool, bool) + { + world->loadAll(); + + StringArray result; + + for (const auto* plugin : world->getAllPlugins()) + result.add (lv2_host::Plugin { plugin }.getUri().getTyped()); + + return result; + } + + FileSearchPath getDefaultLocationsToSearch() { return {}; } + + const LilvUI* findEmbeddableUi (const lv2_host::Uis* pluginUis, std::true_type) + { + if (pluginUis == nullptr) + return nullptr; + + const std::vector allUis (pluginUis->begin(), pluginUis->end()); + + if (allUis.empty()) + return nullptr; + + constexpr const char* rawUri = + #if JUCE_MAC + LV2_UI__CocoaUI; + #elif JUCE_WINDOWS + LV2_UI__WindowsUI; + #elif JUCE_LINUX || JUCE_BSD + LV2_UI__X11UI; + #else + nullptr; + #endif + + jassert (rawUri != nullptr); + const auto nativeUiUri = world->newUri (rawUri); + + struct UiWithSuitability + { + const LilvUI* ui; + unsigned suitability; + + bool operator< (const UiWithSuitability& other) const noexcept + { + return suitability < other.suitability; + } + + static unsigned uiIsSupported (const char* hostUri, const char* pluginUri) + { + if (strcmp (hostUri, pluginUri) == 0) + return 1; + + return 0; + } + }; + + std::vector uisWithSuitability; + uisWithSuitability.reserve (allUis.size()); + + std::transform (allUis.cbegin(), allUis.cend(), std::back_inserter (uisWithSuitability), [&] (const LilvUI* ui) + { + const LilvNode* type = nullptr; + return UiWithSuitability { ui, lilv_ui_is_supported (ui, UiWithSuitability::uiIsSupported, nativeUiUri.get(), &type) }; + }); + + std::sort (uisWithSuitability.begin(), uisWithSuitability.end()); + + if (uisWithSuitability.back().suitability != 0) + return uisWithSuitability.back().ui; + + return nullptr; + } + + const LilvUI* findEmbeddableUi (const lv2_host::Uis*, std::false_type) + { + return nullptr; + } + + const LilvUI* findEmbeddableUi (const lv2_host::Uis* pluginUis) + { + return findEmbeddableUi (pluginUis, std::integral_constant{}); + } + + static lv2_host::UiDescriptor getUiDescriptor (const LilvUI* ui) + { + if (ui == nullptr) + return {}; + + const auto libraryFile = StringPtr { lilv_file_uri_parse (lilv_node_as_uri (lilv_ui_get_binary_uri (ui)), nullptr) }; + + return lv2_host::UiDescriptor { lv2_host::UiDescriptorArgs{}.withLibraryPath (libraryFile.get()) + .withUiUri (lilv_node_as_uri (lilv_ui_get_uri (ui))) }; + } + + // Returns the name of a missing feature, if any. + template + static std::vector findMissingFeatures (RequiredFeatures&& required, + AvailableFeatures&& available) + { + std::vector result; + + for (const auto* node : required) + { + const auto nodeString = String::fromUTF8 (lilv_node_as_uri (node)); + + if (std::find (std::begin (available), std::end (available), nodeString) == std::end (available)) + result.push_back (nodeString); + } + + return result; + } + + void createPluginInstance (const PluginDescription& desc, + double initialSampleRate, + int initialBufferSize, + PluginCreationCallback callback) + { + const auto* pluginPtr = findPluginByUri (desc.fileOrIdentifier); + + if (pluginPtr == nullptr) + return callback (nullptr, "Unable to locate plugin with the requested URI"); + + const lv2_host::Plugin plugin { pluginPtr }; + + auto symap = std::make_unique(); + + const auto missingFeatures = findMissingFeatures (plugin.getRequiredFeatures(), + lv2_host::FeaturesData::getFeatureUris()); + + if (! missingFeatures.empty()) + { + const auto missingFeaturesString = StringArray (missingFeatures.data(), (int) missingFeatures.size()).joinIntoString (", "); + + return callback (nullptr, "plugin requires missing features: " + missingFeaturesString); + } + + auto stateToApply = [&] + { + if (! plugin.hasFeature (world->newUri (LV2_STATE__loadDefaultState))) + return lv2_host::PluginState{}; + + auto map = symap->getMapFeature(); + return lv2_host::PluginState { lilv_state_new_from_world (world->get(), &map, plugin.getUri().get()) }; + }(); + + auto ports = lv2_host::Ports::getPorts (*world, uris, plugin, *symap); + + if (! ports.hasValue()) + return callback (nullptr, "Plugin has ports of an unsupported type"); + + auto instance = std::make_unique (*world, + std::move (symap), + plugin, + std::move (*ports), + (int32_t) initialBufferSize, + initialSampleRate); + + if (instance->instance == nullptr) + return callback (nullptr, "Plugin was located, but could not be opened"); + + auto potentialPresets = world->findNodes (nullptr, + world->newUri (LV2_CORE__appliesTo).get(), + plugin.getUri().get()); + + const lv2_host::Uis pluginUis { plugin.get() }; + + const auto uiToUse = [&]() -> const LilvUI* + { + const auto bestMatch = findEmbeddableUi (&pluginUis); + + if (bestMatch == nullptr) + return bestMatch; + + const auto uiUri = lilv_ui_get_uri (bestMatch); + lilv_world_load_resource (world->get(), uiUri); + + const auto queryUi = [&] (const char* featureUri) + { + const auto featureUriNode = world->newUri (featureUri); + return world->findNodes (uiUri, featureUriNode.get(), nullptr); + }; + + const auto missingUiFeatures = findMissingFeatures (queryUi (LV2_CORE__requiredFeature), + lv2_host::UiFeaturesData::getFeatureUris()); + + return missingUiFeatures.empty() ? bestMatch : nullptr; + }(); + + auto uiBundleUri = uiToUse != nullptr ? String::fromUTF8 (lilv_node_as_uri (lilv_ui_get_bundle_uri (uiToUse))) + : String(); + + auto wrapped = std::make_unique (world, + plugin, + uris, + std::move (instance), + getDescription (pluginPtr), + findPresetUrisForPlugin (plugin.get()), + std::move (stateToApply), + std::move (uiBundleUri), + getUiDescriptor (uiToUse)); + callback (std::move (wrapped), {}); + } + +private: + struct Free { void operator() (char* ptr) const noexcept { free (ptr); } }; + using StringPtr = std::unique_ptr; + + const LilvPlugin* findPluginByUri (const String& s) + { + return world->getAllPlugins().getByUri (world->newUri (s.toRawUTF8())); + } + + template + void visitParentClasses (const LilvPluginClass* c, Fn&& fn) const + { + if (c == nullptr) + return; + + const lv2_host::PluginClass wrapped { c }; + fn (wrapped); + + const auto parentUri = wrapped.getParentUri(); + + if (parentUri.get() != nullptr) + visitParentClasses (world->getPluginClasses().getByUri (parentUri), fn); + } + + std::vector collectPluginClassUris (const LilvPluginClass* c) const + { + std::vector results; + + visitParentClasses (c, [&results] (const lv2_host::PluginClass& wrapped) + { + results.emplace_back (wrapped.getUri()); + }); + + return results; + } + + PluginDescription getDescription (const LilvPlugin* plugin) + { + if (plugin == nullptr) + return {}; + + const auto wrapped = lv2_host::Plugin { plugin }; + const auto bundle = wrapped.getBundleUri().getTyped(); + const auto bundleFile = File { StringPtr { lilv_file_uri_parse (bundle, nullptr) }.get() }; + + const auto numInputs = wrapped.getNumPortsOfClass (uris.mLV2_CORE__AudioPort, uris.mLV2_CORE__InputPort); + const auto numOutputs = wrapped.getNumPortsOfClass (uris.mLV2_CORE__AudioPort, uris.mLV2_CORE__OutputPort); + + PluginDescription result; + result.name = wrapped.getName().getTyped(); + result.descriptiveName = wrapped.getName().getTyped(); + result.lastFileModTime = bundleFile.getLastModificationTime(); + result.lastInfoUpdateTime = Time::getCurrentTime(); + result.manufacturerName = wrapped.getAuthorName().getTyped(); + result.pluginFormatName = LV2PluginFormat::getFormatName(); + result.numInputChannels = static_cast (numInputs); + result.numOutputChannels = static_cast (numOutputs); + + const auto classPtr = wrapped.getClass(); + const auto classes = collectPluginClassUris (classPtr); + const auto isInstrument = std::any_of (classes.cbegin(), + classes.cend(), + [this] (const lv2_host::NodeUri& uri) + { + return uri.equals (uris.mLV2_CORE__GeneratorPlugin); + }); + + result.category = lv2_host::PluginClass { classPtr }.getLabel().getTyped(); + result.isInstrument = isInstrument; + + // The plugin URI is required to be globally unique, so a hash of it should be too + result.fileOrIdentifier = wrapped.getUri().getTyped(); + + const auto uid = DefaultHashFunctions::generateHash (result.fileOrIdentifier, std::numeric_limits::max());; + result.deprecatedUid = result.uniqueId = uid; + return result; + } + + std::vector findPresetUrisForPlugin (const LilvPlugin* plugin) + { + std::vector presetUris; + + lv2_host::OwningNodes potentialPresets { lilv_plugin_get_related (plugin, world->newUri (LV2_PRESETS__Preset).get()) }; + + for (const auto* potentialPreset : potentialPresets) + presetUris.push_back (lilv_node_as_string (potentialPreset)); + + return presetUris; + } + + TemporaryFile lv2ResourceFolder; + std::shared_ptr world = std::make_shared(); + lv2_host::UsefulUris uris { world->get() }; +}; + +//============================================================================== +LV2PluginFormat::LV2PluginFormat() + : pimpl (std::make_unique()) {} + +LV2PluginFormat::~LV2PluginFormat() = default; + +void LV2PluginFormat::findAllTypesForFile (OwnedArray& results, + const String& fileOrIdentifier) +{ + pimpl->findAllTypesForFile (results, fileOrIdentifier); +} + +bool LV2PluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier) +{ + return pimpl->fileMightContainThisPluginType (fileOrIdentifier); +} + +String LV2PluginFormat::getNameOfPluginFromIdentifier (const String& fileOrIdentifier) +{ + return pimpl->getNameOfPluginFromIdentifier (fileOrIdentifier); +} + +bool LV2PluginFormat::pluginNeedsRescanning (const PluginDescription& desc) +{ + return pimpl->pluginNeedsRescanning (desc); +} + +bool LV2PluginFormat::doesPluginStillExist (const PluginDescription& desc) +{ + return pimpl->doesPluginStillExist (desc); +} + +bool LV2PluginFormat::canScanForPlugins() const { return true; } +bool LV2PluginFormat::isTrivialToScan() const { return true; } + +StringArray LV2PluginFormat::searchPathsForPlugins (const FileSearchPath& directoriesToSearch, + bool recursive, + bool allowAsync) +{ + return pimpl->searchPathsForPlugins (directoriesToSearch, recursive, allowAsync); +} + +FileSearchPath LV2PluginFormat::getDefaultLocationsToSearch() +{ + return pimpl->getDefaultLocationsToSearch(); +} + +bool LV2PluginFormat::requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const +{ + return false; +} + +void LV2PluginFormat::createPluginInstance (const PluginDescription& desc, + double sampleRate, + int bufferSize, + PluginCreationCallback callback) +{ + pimpl->createPluginInstance (desc, sampleRate, bufferSize, std::move (callback)); +} + +} // namespace juce + +#endif diff --git a/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h b/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h new file mode 100644 index 00000000..0518de26 --- /dev/null +++ b/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.h @@ -0,0 +1,78 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +#if JUCE_PLUGINHOST_LV2 || DOXYGEN + +/** + Implements a plugin format for LV2 plugins. + + @tags{Audio} +*/ +class JUCE_API LV2PluginFormat : public AudioPluginFormat +{ +public: + LV2PluginFormat(); + ~LV2PluginFormat() override; + + static String getFormatName() { return "LV2"; } + String getName() const override { return getFormatName(); } + + void findAllTypesForFile (OwnedArray& results, + const String& fileOrIdentifier) override; + + bool fileMightContainThisPluginType (const String& fileOrIdentifier) override; + + String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) override; + + bool pluginNeedsRescanning (const PluginDescription&) override; + + bool doesPluginStillExist (const PluginDescription&) override; + + bool canScanForPlugins() const override; + + bool isTrivialToScan() const override; + + StringArray searchPathsForPlugins (const FileSearchPath& directoriesToSearch, + bool recursive, + bool allowPluginsWhichRequireAsynchronousInstantiation = false) override; + + FileSearchPath getDefaultLocationsToSearch() override; + +private: + bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const override; + void createPluginInstance (const PluginDescription&, double, int, PluginCreationCallback) override; + + class Pimpl; + std::unique_ptr pimpl; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LV2PluginFormat) +}; + +#endif + +} // namespace juce diff --git a/modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp b/modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp new file mode 100644 index 00000000..3264b381 --- /dev/null +++ b/modules/juce_audio_processors/format_types/juce_LV2PluginFormat_test.cpp @@ -0,0 +1,272 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "juce_LV2Common.h" + +namespace juce +{ + +class LV2PluginFormatTests : public UnitTest +{ +public: + LV2PluginFormatTests() + : UnitTest ("LV2 Hosting", UnitTestCategories::audioProcessors) + { + } + + void runTest() override + { + using namespace lv2_shared; + + beginTest ("ChannelMapping for well-ordered stereo buses does no mapping"); + { + const AudioProcessor::BusesLayout host { { AudioChannelSet::stereo() }, { AudioChannelSet::stereo() } }; + const ParsedBuses client { { ParsedGroup { "a", { SinglePortInfo { 0, AudioChannelSet::left, false }, + SinglePortInfo { 1, AudioChannelSet::right, false } } } }, + { ParsedGroup { "b", { SinglePortInfo { 2, AudioChannelSet::left, false }, + SinglePortInfo { 3, AudioChannelSet::right, false } } } } }; + const PortToAudioBufferMap map { host, client }; + + expect (map.getChannelForPort (0) == 0); + expect (map.getChannelForPort (1) == 1); + + expect (map.getChannelForPort (2) == 0); + expect (map.getChannelForPort (3) == 1); + + expect (map.getChannelForPort (4) == -1); + } + + beginTest ("ChannelMapping for layout with backwards ports is converted to JUCE order"); + { + const AudioProcessor::BusesLayout host { { AudioChannelSet::stereo() }, { AudioChannelSet::stereo() } }; + const ParsedBuses client { { ParsedGroup { "a", { SinglePortInfo { 0, AudioChannelSet::right, false }, + SinglePortInfo { 1, AudioChannelSet::left, false } } } }, + { ParsedGroup { "b", { SinglePortInfo { 2, AudioChannelSet::right, false }, + SinglePortInfo { 3, AudioChannelSet::left, false } } } } }; + const PortToAudioBufferMap map { host, client }; + + expect (map.getChannelForPort (0) == 1); + expect (map.getChannelForPort (1) == 0); + + expect (map.getChannelForPort (2) == 1); + expect (map.getChannelForPort (3) == 0); + + expect (map.getChannelForPort (4) == -1); + } + + beginTest ("ChannelMapping for layout with multiple buses works as expected"); + { + const AudioProcessor::BusesLayout host { { AudioChannelSet::create5point1(), AudioChannelSet::mono() }, + { AudioChannelSet::mono(), AudioChannelSet::createLCRS(), AudioChannelSet::stereo() } }; + const ParsedBuses client { { ParsedGroup { "a", { SinglePortInfo { 0, AudioChannelSet::right, false }, + SinglePortInfo { 1, AudioChannelSet::left, false }, + SinglePortInfo { 2, AudioChannelSet::LFE, false }, + SinglePortInfo { 3, AudioChannelSet::centre, false }, + SinglePortInfo { 4, AudioChannelSet::rightSurround, false }, + SinglePortInfo { 5, AudioChannelSet::leftSurround, false } } }, + ParsedGroup { "b", { SinglePortInfo { 6, AudioChannelSet::centre, false } } } }, + { ParsedGroup { "c", { SinglePortInfo { 7, AudioChannelSet::centre, false } } }, + ParsedGroup { "d", { SinglePortInfo { 8, AudioChannelSet::surround, false }, + SinglePortInfo { 9, AudioChannelSet::centre, false }, + SinglePortInfo { 10, AudioChannelSet::right, false }, + SinglePortInfo { 11, AudioChannelSet::left, false } } }, + ParsedGroup { "e", { SinglePortInfo { 12, AudioChannelSet::left, false }, + SinglePortInfo { 13, AudioChannelSet::right, false } } } } }; + const PortToAudioBufferMap map { host, client }; + + expect (map.getChannelForPort ( 0) == 1); + expect (map.getChannelForPort ( 1) == 0); + expect (map.getChannelForPort ( 2) == 3); + expect (map.getChannelForPort ( 3) == 2); + expect (map.getChannelForPort ( 4) == 5); + expect (map.getChannelForPort ( 5) == 4); + expect (map.getChannelForPort ( 6) == 6); + + expect (map.getChannelForPort ( 7) == 0); + expect (map.getChannelForPort ( 8) == 4); + expect (map.getChannelForPort ( 9) == 3); + expect (map.getChannelForPort (10) == 2); + expect (map.getChannelForPort (11) == 1); + expect (map.getChannelForPort (12) == 5); + expect (map.getChannelForPort (13) == 6); + + expect (map.getChannelForPort (14) == -1); + } + + beginTest ("Optional client buses may correspond to a disabled host bus"); + { + const ParsedBuses client { { ParsedGroup { "a", { SinglePortInfo { 0, AudioChannelSet::right, true }, + SinglePortInfo { 1, AudioChannelSet::left, true }, + SinglePortInfo { 2, AudioChannelSet::LFE, true }, + SinglePortInfo { 3, AudioChannelSet::centre, true }, + SinglePortInfo { 4, AudioChannelSet::rightSurround, true }, + SinglePortInfo { 5, AudioChannelSet::leftSurround, true } } }, + ParsedGroup { "b", { SinglePortInfo { 6, AudioChannelSet::centre, true } } } }, + { ParsedGroup { "c", { SinglePortInfo { 7, AudioChannelSet::centre, true } } }, + ParsedGroup { "d", { SinglePortInfo { 8, AudioChannelSet::surround, true }, + SinglePortInfo { 9, AudioChannelSet::centre, true }, + SinglePortInfo { 10, AudioChannelSet::right, true }, + SinglePortInfo { 11, AudioChannelSet::left, true } } }, + ParsedGroup { "e", { SinglePortInfo { 12, AudioChannelSet::left, true }, + SinglePortInfo { 13, AudioChannelSet::right, true } } } } }; + + const PortToAudioBufferMap mapA { AudioProcessor::BusesLayout { { AudioChannelSet::disabled(), AudioChannelSet::mono() }, + { AudioChannelSet::mono(), AudioChannelSet::disabled(), AudioChannelSet::stereo() } }, + client }; + + expect (mapA.getChannelForPort ( 0) == -1); + expect (mapA.getChannelForPort ( 1) == -1); + expect (mapA.getChannelForPort ( 2) == -1); + expect (mapA.getChannelForPort ( 3) == -1); + expect (mapA.getChannelForPort ( 4) == -1); + expect (mapA.getChannelForPort ( 5) == -1); + expect (mapA.getChannelForPort ( 6) == 0); + + expect (mapA.getChannelForPort ( 7) == 0); + expect (mapA.getChannelForPort ( 8) == -1); + expect (mapA.getChannelForPort ( 9) == -1); + expect (mapA.getChannelForPort (10) == -1); + expect (mapA.getChannelForPort (11) == -1); + expect (mapA.getChannelForPort (12) == 1); + expect (mapA.getChannelForPort (13) == 2); + + expect (mapA.getChannelForPort (14) == -1); + + const PortToAudioBufferMap mapB { AudioProcessor::BusesLayout { { AudioChannelSet::create5point1(), AudioChannelSet::disabled() }, + { AudioChannelSet::disabled(), AudioChannelSet::disabled(), AudioChannelSet::stereo() } }, + client }; + + expect (mapB.getChannelForPort ( 0) == 1); + expect (mapB.getChannelForPort ( 1) == 0); + expect (mapB.getChannelForPort ( 2) == 3); + expect (mapB.getChannelForPort ( 3) == 2); + expect (mapB.getChannelForPort ( 4) == 5); + expect (mapB.getChannelForPort ( 5) == 4); + expect (mapB.getChannelForPort ( 6) == -1); + + expect (mapB.getChannelForPort ( 7) == -1); + expect (mapB.getChannelForPort ( 8) == -1); + expect (mapB.getChannelForPort ( 9) == -1); + expect (mapB.getChannelForPort (10) == -1); + expect (mapB.getChannelForPort (11) == -1); + expect (mapB.getChannelForPort (12) == 0); + expect (mapB.getChannelForPort (13) == 1); + + expect (mapB.getChannelForPort (14) == -1); + } + + beginTest ("A plugin with only grouped ports will have the same number of buses as groups"); + { + const auto parsed = findStableBusOrder ("foo", + { { "sidechain", { SinglePortInfo { 0, AudioChannelSet::left, false }, + SinglePortInfo { 1, AudioChannelSet::right, false } } }, + { "foo", { SinglePortInfo { 2, AudioChannelSet::centre, false } } } }, + {}); + expect (parsed.size() == 2); + + expect (parsed[0].uid == "foo"); // The main bus should always be first + expect (parsed[0].info.size() == 1); + + expect (parsed[1].uid == "sidechain"); + expect (parsed[1].info.size() == 2); + } + + beginTest ("A plugin with grouped and ungrouped ports will add a bus for each ungrouped port"); + { + const auto parsed = findStableBusOrder ("foo", + { { "sidechain", { SinglePortInfo { 0, AudioChannelSet::left, false }, + SinglePortInfo { 1, AudioChannelSet::right, false } } }, + { "foo", { SinglePortInfo { 2, AudioChannelSet::centre, false } } } }, + { SinglePortInfo { 3, AudioChannelSet::leftSurround, false }, + SinglePortInfo { 4, AudioChannelSet::centre, true }, + SinglePortInfo { 5, AudioChannelSet::rightSurround, false } }); + expect (parsed.size() == 5); + + expect (parsed[0].uid == "foo"); // The main bus should always be first + expect (parsed[0].info.size() == 1); + + expect (parsed[1].uid == "sidechain"); + expect (parsed[1].info.size() == 2); + + expect (parsed[2].uid == ""); + expect (parsed[2].info.size() == 1); + + expect (parsed[3].uid == ""); + expect (parsed[3].info.size() == 1); + + expect (parsed[4].uid == ""); + expect (parsed[4].info.size() == 1); + } + + beginTest ("A plugin with only ungrouped, required ports will have a single bus"); + { + const auto parsed = findStableBusOrder ("foo", + {}, + { SinglePortInfo { 0, AudioChannelSet::leftSurround, false }, + SinglePortInfo { 1, AudioChannelSet::rightSurround, false }, + SinglePortInfo { 2, AudioChannelSet::left, false }, + SinglePortInfo { 3, AudioChannelSet::right, false } }); + + expect (parsed == std::vector { { "", { SinglePortInfo { 0, AudioChannelSet::leftSurround, false }, + SinglePortInfo { 1, AudioChannelSet::rightSurround, false }, + SinglePortInfo { 2, AudioChannelSet::left, false }, + SinglePortInfo { 3, AudioChannelSet::right, false } } } }); + } + + beginTest ("A plugin with only ungrouped, optional ports will have a bus per port"); + { + const auto parsed = findStableBusOrder ("foo", + {}, + { SinglePortInfo { 0, AudioChannelSet::leftSurround, true }, + SinglePortInfo { 1, AudioChannelSet::rightSurround, true }, + SinglePortInfo { 2, AudioChannelSet::left, true }, + SinglePortInfo { 3, AudioChannelSet::right, true } }); + + expect (parsed == std::vector { { "", { SinglePortInfo { 0, AudioChannelSet::leftSurround, true } } }, + { "", { SinglePortInfo { 1, AudioChannelSet::rightSurround, true } } }, + { "", { SinglePortInfo { 2, AudioChannelSet::left, true } } }, + { "", { SinglePortInfo { 3, AudioChannelSet::right, true } } } }); + } + + beginTest ("A plugin with a mix of required and optional ports will have the required ports grouped together on a single bus"); + { + const auto parsed = findStableBusOrder ("foo", + {}, + { SinglePortInfo { 0, AudioChannelSet::leftSurround, true }, + SinglePortInfo { 1, AudioChannelSet::rightSurround, false }, + SinglePortInfo { 2, AudioChannelSet::left, true }, + SinglePortInfo { 3, AudioChannelSet::right, false } }); + + expect (parsed == std::vector { { "", { SinglePortInfo { 1, AudioChannelSet::rightSurround, false }, + SinglePortInfo { 3, AudioChannelSet::right, false } } }, + { "", { SinglePortInfo { 0, AudioChannelSet::leftSurround, true } } }, + { "", { SinglePortInfo { 2, AudioChannelSet::left, true } } } }); + } + } +}; + +static LV2PluginFormatTests lv2PluginFormatTests; + +} // namespace juce diff --git a/modules/juce_audio_processors/format_types/juce_LV2Resources.h b/modules/juce_audio_processors/format_types/juce_LV2Resources.h new file mode 100644 index 00000000..0ff36da9 --- /dev/null +++ b/modules/juce_audio_processors/format_types/juce_LV2Resources.h @@ -0,0 +1,10235 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +/* + This file is auto-generated by generate_lv2_bundle_sources.py. +*/ + +#pragma once + +#ifndef DOXYGEN + +#include + +namespace juce +{ +namespace lv2 +{ + +struct BundleResource +{ + const char* name; + const char* contents; +}; + +struct Bundle +{ + const char* name; + std::vector contents; + + static std::vector getAllBundles(); +}; + +} +} + +std::vector juce::lv2::Bundle::getAllBundles() +{ + return { +juce::lv2::Bundle +{ +"instance-access", +{ +juce::lv2::BundleResource +{ +"instance-access.ttl", +R"lv2ttl(@prefix ia: . +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Feature ; + rdfs:label "instance access" ; + rdfs:comment "A feature that provides access to a plugin instance." ; + rdfs:seeAlso , + . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"instance-access.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix ia: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Instance Access" ; + doap:shortdesc "Provides access to the LV2_Handle of a plugin." ; + doap:created "2010-10-04" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature which allows plugin UIs to get a direct handle +to an LV2 plugin instance (LV2_Handle), if possible. + +Note that the use of this extension by UIs violates the important principle of +UI/plugin separation, and is potentially a source of many problems. +Accordingly, **use of this extension is highly discouraged**, and plugins +should not expect hosts to support it, since it is often impossible to do so. + +To support this feature the host must pass an LV2_Feature struct to the UI +instantiate method with URI LV2_INSTANCE_ACCESS_URI and data pointed directly +to the LV2_Handle of the plugin instance. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"port-groups", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"port-groups.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix pg: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Port Groups" ; + rdfs:comment "Multi-channel groups of LV2 ports." ; + rdfs:seeAlso . + +pg:Group + a rdfs:Class ; + rdfs:label "Port Group" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:symbol ; + owl:cardinality 1 ; + rdfs:comment "A Group MUST have exactly one string lv2:symbol." + ] ; + rdfs:comment "A set of ports that are logicaly grouped together." . + +pg:InputGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Input Group" ; + rdfs:comment "A group which contains exclusively inputs." . + +pg:OutputGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Output Group" ; + rdfs:comment "A group which contains exclusively outputs." . + +pg:Element + a rdfs:Class ; + rdfs:label "Element" ; + rdfs:comment "An ordered element of a group." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:designation ; + owl:cardinality 1 ; + rdfs:comment "An element MUST have exactly one lv2:designation." + ] ; + rdfs:comment "An element of a group, with a designation and optional index." . + +pg:element + a rdf:Property , + owl:ObjectProperty ; + rdfs:range pg:Element ; + rdfs:label "element" ; + rdfs:comment "An element within a port group." . + +pg:sideChainOf + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "side-chain of" ; + rdfs:comment "Port or group is a side chain of another." . + +pg:subGroupOf + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain pg:Group ; + rdfs:range pg:Group ; + rdfs:label "sub-group of" ; + rdfs:comment "Group is a child of another group." . + +pg:source + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain pg:OutputGroup ; + rdfs:range pg:InputGroup ; + rdfs:label "source" ; + rdfs:comment "Port or group that this group is the output of." . + +pg:mainInput + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Plugin ; + rdfs:range pg:InputGroup ; + rdfs:label "main input" ; + rdfs:comment "Input group that is the primary input of the plugin." . + +pg:mainOutput + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Plugin ; + rdfs:range pg:OutputGroup ; + rdfs:label "main output" ; + rdfs:comment "Output group that is the primary output of the plugin." . + +pg:group + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Port ; + rdfs:range pg:Group ; + rdfs:label "group" ; + rdfs:comment "Group that this port is a part of." . + +pg:DiscreteGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Discrete Group" ; + rdfs:comment "A group of discrete channels." . + +pg:left + a lv2:Channel ; + rdfs:label "left" ; + rdfs:comment "The left channel of a stereo audio group." . + +pg:right + a lv2:Channel ; + rdfs:label "right" ; + rdfs:comment "The right channel of a stereo audio group." . + +pg:center + a lv2:Channel ; + rdfs:label "center" ; + rdfs:comment "The center channel of a discrete audio group." . + +pg:side + a lv2:Channel ; + rdfs:label "side" ; + rdfs:comment "The side channel of a mid-side audio group." . + +pg:centerLeft + a lv2:Channel ; + rdfs:label "center left" ; + rdfs:comment "The center-left channel of a 7.1 wide surround sound group." . + +pg:centerRight + a lv2:Channel ; + rdfs:label "center right" ; + rdfs:comment "The center-right channel of a 7.1 wide surround sound group." . + +pg:sideLeft + a lv2:Channel ; + rdfs:label "side left" ; + rdfs:comment "The side-left channel of a 6.1 or 7.1 surround sound group." . + +pg:sideRight + a lv2:Channel ; + rdfs:label "side right" ; + rdfs:comment "The side-right channel of a 6.1 or 7.1 surround sound group." . + +pg:rearLeft + a lv2:Channel ; + rdfs:label "rear left" ; + rdfs:comment "The rear-left channel of a surround sound group." . + +pg:rearRight + a lv2:Channel ; + rdfs:label "rear right" ; + rdfs:comment "The rear-right channel of a surround sound group." . + +pg:rearCenter + a lv2:Channel ; + rdfs:label "rear center" ; + rdfs:comment "The rear-center channel of a surround sound group." . + +pg:lowFrequencyEffects + a lv2:Channel ; + rdfs:label "low-frequency effects" ; + rdfs:comment "The LFE channel of a *.1 surround sound group." . + +pg:MonoGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Mono" ; + rdfs:comment "A single channel audio group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:center + ] . + +pg:StereoGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Stereo" ; + rdfs:comment "A 2-channel discrete stereo audio group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:right + ] . + +pg:MidSideGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "Mid-Side Stereo" ; + rdfs:comment "A 2-channel mid-side stereo audio group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:center + ] , [ + lv2:index 1 ; + lv2:designation pg:side + ] . + +pg:ThreePointZeroGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "3.0 Surround" ; + rdfs:comment "A 3.0 discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:right + ] , [ + lv2:index 2 ; + lv2:designation pg:rearCenter + ] . + +pg:FourPointZeroGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "4.0 Surround" ; + rdfs:comment "A 4.0 (Quadraphonic) discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:rearCenter + ] . + +pg:FivePointZeroGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "5.0 Surround" ; + rdfs:comment "A 5.0 (3-2 stereo) discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:rearRight + ] . + +pg:FivePointOneGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "5.1 Surround" ; + rdfs:comment "A 5.1 (3-2 stereo with sub) discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:rearRight + ] , [ + lv2:index 5 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:SixPointOneGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "6.1 Surround" ; + rdfs:comment "A 6.1 discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:sideLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:sideRight + ] , [ + lv2:index 5 ; + lv2:designation pg:rearCenter + ] , [ + lv2:index 6 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:SevenPointOneGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "7.1 Surround" ; + rdfs:comment "A 7.1 discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:center + ] , [ + lv2:index 2 ; + lv2:designation pg:right + ] , [ + lv2:index 3 ; + lv2:designation pg:sideLeft + ] , [ + lv2:index 4 ; + lv2:designation pg:sideRight + ] , [ + lv2:index 5 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 6 ; + lv2:designation pg:rearRight + ] , [ + lv2:index 7 ; + lv2:designation pg:lowFreq)lv2ttl" R"lv2ttl(uencyEffects + ] . + +pg:SevenPointOneWideGroup + a rdfs:Class ; + rdfs:subClassOf pg:DiscreteGroup ; + rdfs:label "7.1 Surround (Wide)" ; + rdfs:comment "A 7.1 wide discrete surround sound group." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:left + ] , [ + lv2:index 1 ; + lv2:designation pg:centerLeft + ] , [ + lv2:index 2 ; + lv2:designation pg:center + ] , [ + lv2:index 3 ; + lv2:designation pg:centerRight + ] , [ + lv2:index 4 ; + lv2:designation pg:right + ] , [ + lv2:index 5 ; + lv2:designation pg:rearLeft + ] , [ + lv2:index 6 ; + lv2:designation pg:rearRight + ] , [ + lv2:index 7 ; + lv2:designation pg:lowFrequencyEffects + ] . + +pg:letterCode + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Channel ; + rdfs:range rdf:PlainLiteral ; + rdfs:label "ambisonic letter code" ; + rdfs:comment "The YuMa letter code for an Ambisonic channel." . + +pg:harmonicDegree + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Channel ; + rdfs:range xsd:integer ; + rdfs:label "harmonic degree" ; + rdfs:comment "The degree coefficient (l) of the spherical harmonic for an Ambisonic channel." . + +pg:harmonicIndex + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Channel ; + rdfs:range xsd:integer ; + rdfs:label "harmonic index" ; + rdfs:comment "The index coefficient (m) of the spherical harmonic for an Ambisonic channel." . + +pg:ACN0 + a lv2:Channel ; + pg:letterCode "W" ; + pg:harmonicDegree 0 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN0" ; + rdfs:comment "Ambisonic channel 0 (W): degree 0, index 0." . + +pg:ACN1 + a lv2:Channel ; + pg:letterCode "Y" ; + pg:harmonicDegree 1 ; + pg:harmonicIndex -1 ; + rdfs:label "ACN1" ; + rdfs:comment "Ambisonic channel 1 (Y): degree 1, index -1." . + +pg:ACN2 + a lv2:Channel ; + pg:letterCode "Z" ; + pg:harmonicDegree 1 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN2" ; + rdfs:comment "Ambisonic channel 2 (Z): degree 1, index 0." . + +pg:ACN3 + a lv2:Channel ; + pg:letterCode "X" ; + pg:harmonicDegree 1 ; + pg:harmonicIndex 1 ; + rdfs:label "ACN3" ; + rdfs:comment "Ambisonic channel 3 (X): degree 1, index 1." . + +pg:ACN4 + a lv2:Channel ; + pg:letterCode "V" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex -2 ; + rdfs:label "ACN4" ; + rdfs:comment "Ambisonic channel 4 (V): degree 2, index -2." . + +pg:ACN5 + a lv2:Channel ; + pg:letterCode "T" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex -1 ; + rdfs:label "ACN5" ; + rdfs:comment "Ambisonic channel 5 (T): degree 2, index -1." . + +pg:ACN6 + a lv2:Channel ; + pg:letterCode "R" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN6" ; + rdfs:comment "Ambisonic channel 6 (R): degree 2, index 0." . + +pg:ACN7 + a lv2:Channel ; + pg:letterCode "S" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex 1 ; + rdfs:label "ACN7" ; + rdfs:comment "Ambisonic channel 7 (S): degree 2, index 1." . + +pg:ACN8 + a lv2:Channel ; + pg:letterCode "U" ; + pg:harmonicDegree 2 ; + pg:harmonicIndex 2 ; + rdfs:label "ACN8" ; + rdfs:comment "Ambisonic channel 8 (U): degree 2, index 2." . + +pg:ACN9 + a lv2:Channel ; + pg:letterCode "Q" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex -3 ; + rdfs:label "ACN9" ; + rdfs:comment "Ambisonic channel 9 (Q): degree 3, index -3." . + +pg:ACN10 + a lv2:Channel ; + pg:letterCode "O" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex -2 ; + rdfs:label "ACN10" ; + rdfs:comment "Ambisonic channel 10 (O): degree 3, index -2." . + +pg:ACN11 + a lv2:Channel ; + pg:letterCode "M" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex -1 ; + rdfs:label "ACN11" ; + rdfs:comment "Ambisonic channel 11 (M): degree 3, index -1." . + +pg:ACN12 + a lv2:Channel ; + pg:letterCode "K" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 0 ; + rdfs:label "ACN12" ; + rdfs:comment "Ambisonic channel 12 (K): degree 3, index 0." . + +pg:ACN13 + a lv2:Channel ; + pg:letterCode "L" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 1 ; + rdfs:label "ACN13" ; + rdfs:comment "Ambisonic channel 13 (L): degree 3, index 1." . + +pg:ACN14 + a lv2:Channel ; + pg:letterCode "N" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 2 ; + rdfs:label "ACN14" ; + rdfs:comment "Ambisonic channel 14 (N): degree 3, index 2." . + +pg:ACN15 + a lv2:Channel ; + pg:letterCode "P" ; + pg:harmonicDegree 3 ; + pg:harmonicIndex 3 ; + rdfs:label "ACN15" ; + rdfs:comment "Ambisonic channel 15 (P): degree 3, index 3." . + +pg:AmbisonicGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Ambisonic Group" ; + rdfs:comment "A group of Ambisonic channels." . + +pg:AmbisonicBH1P0Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH1P0" ; + rdfs:comment "Ambisonic B stream of horizontal order 1 and peripheral order 0." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN3 + ] . + +pg:AmbisonicBH1P1Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH1P1" ; + rdfs:comment "Ambisonic B stream of horizontal order 1 and peripheral order 1." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] . + +pg:AmbisonicBH2P0Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH2P0" ; + rdfs:comment "Ambisonic B stream of horizontal order 2 and peripheral order 0." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN8 + ] . + +pg:AmbisonicBH2P1Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH2P1" ; + rdfs:comment "Ambisonic B stream of horizontal order 2 and peripheral order 1." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN8 + ] . + +pg:AmbisonicBH2P2Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH2P2" ; + rdfs:comment "Ambisonic B stream of horizontal order 2 and peripheral order 2." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN5 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN6 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN7 + ] , [ + lv2:index 8 ; + lv2:designation pg:ACN8 + ] . + +pg:AmbisonicBH3P0Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P0" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 0." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN15 + ] . + +pg:AmbisonicBH3P1Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P1" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 1." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN15 + ] . + +pg:AmbisonicBH3P2Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P2" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 2." ; + pg:e)lv2ttl" R"lv2ttl(lement [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN5 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN6 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN7 + ] , [ + lv2:index 8 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 9 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 10 ; + lv2:designation pg:ACN15 + ] . + +pg:AmbisonicBH3P3Group + a rdfs:Class ; + rdfs:subClassOf pg:AmbisonicGroup ; + rdfs:label "Ambisonic BH3P3" ; + rdfs:comment "Ambisonic B stream of horizontal order 3 and peripheral order 3." ; + pg:element [ + lv2:index 0 ; + lv2:designation pg:ACN0 + ] , [ + lv2:index 1 ; + lv2:designation pg:ACN1 + ] , [ + lv2:index 2 ; + lv2:designation pg:ACN2 + ] , [ + lv2:index 3 ; + lv2:designation pg:ACN3 + ] , [ + lv2:index 4 ; + lv2:designation pg:ACN4 + ] , [ + lv2:index 5 ; + lv2:designation pg:ACN5 + ] , [ + lv2:index 6 ; + lv2:designation pg:ACN6 + ] , [ + lv2:index 7 ; + lv2:designation pg:ACN7 + ] , [ + lv2:index 8 ; + lv2:designation pg:ACN8 + ] , [ + lv2:index 9 ; + lv2:designation pg:ACN9 + ] , [ + lv2:index 10 ; + lv2:designation pg:ACN10 + ] , [ + lv2:index 11 ; + lv2:designation pg:ACN11 + ] , [ + lv2:index 12 ; + lv2:designation pg:ACN12 + ] , [ + lv2:index 13 ; + lv2:designation pg:ACN13 + ] , [ + lv2:index 14 ; + lv2:designation pg:ACN14 + ] , [ + lv2:index 15 ; + lv2:designation pg:ACN15 + ] . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"port-groups.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix pg: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Port Groups" ; + doap:shortdesc "Multi-channel groups of LV2 ports." ; + doap:created "2008-00-00" ; + doap:developer , + ; + doap:release [ + doap:revision "1.4" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Replace broken links with detailed Ambisonic channel descriptions." + ] , [ + rdfs:label "Remove incorrect type of pg:letterCode." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] . + +pg:Group + lv2:documentation """ + +A group logically combines ports which should be considered part of the same +stream. For example, two audio ports in a group may form a stereo stream. + +Like ports, groups have a lv2:symbol that is unique within the context of the +plugin, where group symbols and port symbols reside in the same namespace. In +other words, a group on a plugin MUST NOT have the same symbol as any other +group or port on that plugin. This makes it possible to uniquely reference a +port or group on a plugin with a single identifier and no context. + +Group definitions may be shared across plugins for brevity. For example, a +plugin collection may define a single URI for a pg:StereoGroup with the symbol +"input" and use it in many plugins. + +"""^^lv2:Markdown . + +pg:sideChainOf + lv2:documentation """ + +Indicates that this port or group should be considered a "side chain" of some +other port or group. The precise definition of "side chain" depends on the +plugin, but in general this group should be considered a modifier to some other +group, rather than an independent input itself. + +"""^^lv2:Markdown . + +pg:subGroupOf + lv2:documentation """ + +Indicates that this group is a child of another group. This property has no +meaning with respect to plugin execution, but the host may find this +information useful to provide a better user interface. Note that being a +sub-group does not relax the restriction that the group MUST have a unique +symbol with respect to the plugin. + +"""^^lv2:Markdown . + +pg:source + lv2:documentation """ + +Indicates that this port or group should be considered the "result" of some +other port or group. This property only makes sense on groups with outputs +when the source is a group with inputs. This can be used to convey a +relationship between corresponding input and output groups with different +types, for example in a mono to stereo plugin. + +"""^^lv2:Markdown . + +pg:mainInput + lv2:documentation """ + +Indicates that this group should be considered the "main" input, i.e. the +primary task is processing the signal in this group. A plugin MUST NOT have +more than one pg:mainInput property. + +"""^^lv2:Markdown . + +pg:mainOutput + lv2:documentation """ + +Indicates that this group should be considered the "main" output. The main +output group SHOULD have the main input group as a pg:source. + +"""^^lv2:Markdown . + +pg:group + lv2:documentation """ + +Indicates that this port is a part of a group of ports on the plugin. The port +should also have an lv2:designation property to define its designation within +that group. + +"""^^lv2:Markdown . + +pg:DiscreteGroup + lv2:documentation """ + +These groups are divided into channels where each represents a particular +speaker location. The position of sound in one of these groups depends on a +particular speaker configuration. + +"""^^lv2:Markdown . + +pg:AmbisonicGroup + lv2:documentation """ + +These groups are divided into channels which together represent a position in +an abstract n-dimensional space. The position of sound in one of these groups +does not depend on a particular speaker configuration; a decoder can be used to +convert an ambisonic stream for any speaker configuration. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"ui", +{ +juce::lv2::BundleResource +{ +"ui.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdf: . +@prefix rdfs: . +@prefix ui: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 UI" ; + doap:shortdesc "User interfaces for LV2 plugins." ; + doap:created "2006-00-00" ; + doap:developer ; + doap:maintainer ; + doap:release [ + doap:revision "2.22" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add ui:requestValue feature." + ] , [ + rdfs:label "Add ui:scaleFactor, ui:foregroundColor, and ui:backgroundColor properties." + ] , [ + rdfs:label "Deprecate ui:binary." + ] + ] + ] , [ + doap:revision "2.20" ; + doap:created "2015-07-25" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] , [ + rdfs:label "Add missing property labels." + ] + ] + ] , [ + doap:revision "2.18" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add show interface so UIs can gracefully degrade to separate windows if hosts can not use their widget directly." + ] , [ + rdfs:label "Fix identifier typos in documentation." + ] + ] + ] , [ + doap:revision "2.16" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix LV2_UI_INVALID_PORT_INDEX identifier in documentation." + ] + ] + ] , [ + doap:revision "2.14" ; + doap:created "2013-03-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add idle interface so native UIs and foreign toolkits can drive their event loops." + ] , [ + rdfs:label "Add ui:updateRate property." + ] + ] + ] , [ + doap:revision "2.12" ; + doap:created "2012-12-01" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect linker flag in ui:makeSONameResident documentation." + ] + ] + ] , [ + doap:revision "2.10" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add types for WindowsUI, CocoaUI, and Gtk3UI." + ] , [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add missing LV2_SYMBOL_EXPORT declaration for lv2ui_descriptor prototype." + ] + ] + ] , [ + doap:revision "2.8" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add ui:parent and ui:resize." + ] , [ + rdfs:label "Add support for referring to ports by symbol." + ] , [ + rdfs:label "Add ui:portMap for accessing ports by symbol, allowing for UIs to be distributed separately from plugins." + ] , [ + rdfs:label "Add port protocols and a dynamic notification subscription mechanism, for more flexible communication, and audio port metering without control port kludges." + ] , [ + rdfs:label "Add touch feature to notify the host that the user has grabbed a control." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "2.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Deprecate ui:makeSONameResident." + ] , [ + rdfs:label "Add Qt4 and X11 widget types." + ] , [ + rdfs:label "Install header to URI-based system path." + ] , [ + rdfs:label "Add pkg-config file." + ] , [ + rdfs:label "Make ui.ttl a valid OWL 2 DL ontology." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Convert documentation to HTML and use lv2:documentation." + ] , [ + rdfs:label "Use lv2:Specification to be discovered as an extension." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2010-10-06" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension makes it possible to create user interfaces for LV2 plugins. + +UIs are implemented as an LV2UI_Descriptor loaded via lv2ui_descriptor() in a +shared library, and are distributed in bundles just like plugins. + +UIs are associated with plugins in data: + + :::turtle + @prefix ui: . + + ui:ui . + a ui:X11UI ; + lv2:binary . + +where `http://my.plugin` is the URI of the plugin, `http://my.pluginui` is the +URI of the plugin UI and `myui.so` is the relative URI to the shared object +file. + +While it is possible to have the plugin UI and the plugin in the same shared +object file, it is a good idea to keep them separate so that hosts can avoid +loading the UI code if they do not need it. A UI MUST specify its class in the +RDF data (`ui:X11UI` in the above example). The class defines what type the UI +is, for example what graphics toolkit it uses. Any type of UI class can be +defined separately from this extension. + +It is possible to have multiple UIs for the same plugin, or to have the UI for +a plugin in a different bundle from the actual plugin. This allows plugin UIs +to be written independently. + +Note that the process that loads the shared object file containing the UI code +and the process that loads the shared object file containing the actual plugin +implementation are not necessarily the same process (and not even necessarily +on the same machine). This means that plugin and UI code MUST NOT use +singletons and global variables and expect them to refer to the same objects in +the UI and the actual plugin. The function callback interface defined in this +header is the only method of communication between UIs and plugin instances +(extensions may define more, though this is discouraged unless absolutely +necessary since the significant benefits of network transparency and +serialisability are lost). + +UI functionality may be extended via features, much like plugins: + + :::turtle + lv2:requiredFeature . + lv2:optionalFeature . + +The rules for a UI with a required or optional feature are identical to those +of lv2:Plugin instances: if a UI declares a feature as required, the host is +NOT allowed to load it unless it supports that feature; and if it does support +a feature, it MUST pass an appropriate LV2_Feature struct to the UI's +instantiate() method. This extension defines several standard features for +common functionality. + +UIs written to this specification do not need to be thread-safe. All functions +may only be called in the UI thread. There is only one UI thread (for +too)lv2ttl" R"lv2ttl(lkits, the one the UI main loop runs in). There is no requirement that a +UI actually be a graphical widget. + +Note that UIs are completely separate from plugins. From the plugin's +perspective, control from a UI is indistinguishable from any other control, as +it all occcurs via ports. + +"""^^lv2:Markdown . + +ui:GtkUI + lv2:documentation """ + +The host must guarantee that the Gtk+ 2 library has been initialised and the +Glib main loop is running before the UI is instantiated. Note that this UI +type is not suitable for binary distribution since multiple versions of Gtk can +not be used in the same process. + +"""^^lv2:Markdown . + +ui:Gtk3UI + lv2:documentation """ + +The host must guarantee that the Gtk+ 3 library has been initialised and the +Glib main loop is running before the UI is instantiated. Note that this UI +type is not suitable for binary distribution since multiple versions of Gtk can +not be used in the same process. + +"""^^lv2:Markdown . + +ui:Qt4UI + lv2:documentation """ + +The host must guarantee that the Qt4 library has been initialised and the Qt4 +main loop is running before the UI is instantiated. Note that this UI type is +not suitable for binary distribution since multiple versions of Qt can not be +used in the same process. + +"""^^lv2:Markdown . + +ui:Qt5UI + lv2:documentation """ + +The host must guarantee that the Qt5 library has been initialised and the Qt5 +main loop is running before the UI is instantiated. Note that this UI type is +not suitable for binary distribution since multiple versions of Qt can not be +used in the same process. + +"""^^lv2:Markdown . + +ui:X11UI + lv2:documentation """ + +Note that the LV2UI_Widget for this type of UI is not a pointer, but should be +interpreted directly as an X11 `Window` ID. This is the native UI type on most +POSIX systems. + +"""^^lv2:Markdown . + +ui:WindowsUI + lv2:documentation """ + +Note that the LV2UI_Widget for this type of UI is not a pointer, but should be +interpreted directly as a `HWND`. This is the native UI type on Microsoft +Windows. + +"""^^lv2:Markdown . + +ui:CocoaUI + lv2:documentation """ + +This is the native UI type on Mac OS X. + +"""^^lv2:Markdown . + +ui:binary + lv2:documentation """ + +This property is redundant and deprecated: new UIs should use lv2:binary +instead, however hosts must still support ui:binary. + +"""^^lv2:Markdown . + +ui:makeSONameResident + lv2:documentation """ + +This feature was intended to support UIs that link against toolkit libraries +which may not be unloaded during the lifetime of the host. This is better +achieved by using the appropriate flags when linking the UI, for example `gcc +-Wl,-z,nodelete`. + +"""^^lv2:Markdown . + +ui:noUserResize + lv2:documentation """ + +If a UI has this feature, it indicates that it does not make sense to let the +user resize the main widget, and the host should prevent that. This feature +may not make sense for all UI types. The data pointer for this feature should +always be set to NULL. + +"""^^lv2:Markdown . + +ui:fixedSize + lv2:documentation """ + +If a UI has this feature, it indicates the same thing as ui:noUserResize, and +additionally that the UI will not resize itself on its own. That is, the UI +will always remain the same size. This feature may not make sense for all UI +types. The data pointer for this feature should always be set to NULL. + +"""^^lv2:Markdown . + +ui:scaleFactor + lv2:documentation """ + +HiDPI (High Dots Per Inch) displays have a high resolution on a relatively +small form factor. Many systems use a scale factor to compensate for this, so +for example, a scale factor of 2 means things are drawn twice as large as +normal. + +Hosts can pass this as an option to UIs to communicate this information, so +that the UI can draw at an appropriate scale. + +"""^^lv2:Markdown . + +ui:backgroundColor + lv2:documentation """ + +The background color of the host's UI. The host can pass this as an option so +that UIs can integrate nicely with the host window around it. + +Hosts should pass this as an option to UIs with an integer RGBA32 color value. +If the value is a 32-bit integer, it is guaranteed to be in RGBA32 format, but +the UI must check the value type and not assume this, to allow for other types +of color in the future. + +"""^^lv2:Markdown . + +ui:foregroundColor + lv2:documentation """ + +The foreground color of the host's UI. The host can pass this as an option so +that UIs can integrate nicely with the host window around it. + +Hosts should pass this as an option to UIs with an integer RGBA32 color value. +If the value is a 32-bit integer, it is guaranteed to be in RGBA32 format, but +the UI must check the value type and not assume this, to allow for other types +of color in the future. + +"""^^lv2:Markdown . + +ui:parent + lv2:documentation """ + +This feature can be used to pass a parent that the UI should be a child of. +The format of data pointer of this feature is determined by the UI type, and is +generally the same type as the LV2UI_Widget that the UI would return. For +example, for a ui:X11UI, the parent should be a `Window`. This is particularly +useful for embedding, where the parent often must be known at construction time +for embedding to work correctly. + +UIs should not _require_ this feature unless it is necessary for them to work +at all, but hosts should provide it whenever possible. + +"""^^lv2:Markdown . + +ui:PortNotification + lv2:documentation """ + +This describes which ports the host must send notifications to the UI about. +The port must be specific either by index, using the ui:portIndex property, or +symbol, using the lv2:symbol property. Since port indices are not guaranteed +to be stable, using the symbol is recommended, and the inde MUST NOT be used +except by UIs that are shipped in the same bundle as the corresponding plugin. + +"""^^lv2:Markdown . + +ui:portNotification + lv2:documentation """ + +Specifies that a UI should receive notifications about changes to a particular +port's value via LV2UI_Descriptor::port_event(). + +For example: + + :::turtle + eg:ui + a ui:X11UI ; + ui:portNotification [ + ui:plugin eg:plugin ; + lv2:symbol "gain" ; + ui:protocol ui:floatProtocol + ] . + +"""^^lv2:Markdown . + +ui:notifyType + lv2:documentation """ + +Specifies a particular type that the UI should be notified of. + +This is useful for message-based ports where several types of data can be +present, but only some are interesting to the UI. For example, if UI control +is multiplexed in the same port as MIDI, this property can be used to ensure +that only the relevant events are forwarded to the UI, and not potentially high +frequency MIDI data. + +"""^^lv2:Markdown . + +ui:resize + lv2:documentation """ + +This feature corresponds to the LV2UI_Resize struct, which should be passed +with the URI LV2_UI__resize. This struct may also be provided by the UI as +extension data using the same URI, in which case it is used by the host to +request that the UI change its size. + +"""^^lv2:Markdown . + +ui:portMap + lv2:documentation """ + +This makes it possible to implement and distribute UIs separately from the +plugin binaries they control. + +This feature corresponds to the LV2UI_Port_Index struct, which should be passed +with the URI LV2_UI__portIndex. + +"""^^lv2:Markdown . + +ui:portSubscribe + lv2:documentation """ + +This makes it possible for a UI to explicitly request a particular style of +update from a port at run-time, in a more flexible and powerful way than +listing subscriptions statically allows. + +This feature corresponds to the LV2UI_Port_Subscribe struct, which should be +passed with the URI LV2_UI__portSubscribe. + +"""^^lv2:Markdown . + +ui:touch + lv2:documentation """ + +This is useful for automation, so the host can allow the user to take control +of a port, even if that port would otherwise be automated (much like grabbing a +physical motorised fader). + +It can also be used for MIDI learn or in any other situation where the host +needs to do something with a particular control and it would be convenient for +the user to select it directly from the plugin UI. + +Thi)lv2ttl" R"lv2ttl(s feature corresponds to the LV2UI_Touch struct, which should be passed with +the URI LV2_UI__touch. + +"""^^lv2:Markdown . + +ui:requestValue + lv2:documentation """ + +This allows a plugin UI to request a new parameter value using the host's UI, +for example by showing a dialog or integrating with the host's built-in content +browser. This should only be used for complex parameter types where the plugin +UI is not capable of showing the expected native platform or host interface to +choose a value, such as file path parameters. + +This feature corresponds to the LV2UI_Request_Value struct, which should be +passed with the URI LV2_UI__requestValue. + +"""^^lv2:Markdown . + +ui:idleInterface + lv2:documentation """ + +To support this feature, the UI should list it as a lv2:optionalFeature or +lv2:requiredFeature in its data, and also as lv2:extensionData. When the UI's +extension_data() is called with this URI (LV2_UI__idleInterface), it should +return a pointer to an LV2UI_Idle_Interface. + +To indicate support, the host should pass a feature to instantiate() with this +URI, with NULL for data. + +"""^^lv2:Markdown . + +ui:showInterface + lv2:documentation """ + +This allows UIs to gracefully degrade to separate windows when the host is +unable to embed the UI widget for whatever reason. When the UI's +extension_data() is called with this URI (LV2_UI__showInterface), it should +return a pointer to an LV2UI_Show_Interface. + +"""^^lv2:Markdown . + +ui:PortProtocol + lv2:documentation """ + +A PortProtocol MUST define: + +Port Type +: Which plugin port types the buffer type is valid for. + +Feature Data +: What data (if any) should be passed in the LV2_Feature. + +A PortProtocol for an output port MUST define: + +Update Frequency +: When the host should call port_event(). + +Update Format +: The format of the data in the buffer passed to port_event(). + +Options +: The format of the options passed to subscribe() and unsubscribe(). + +A PortProtocol for an input port MUST define: + +Write Format +: The format of the data in the buffer passed to write_port(). + +Write Effect +: What happens when the UI calls write_port(). + +For an example, see ui:floatProtocol or ui:peakProtocol. + +PortProtocol is a subclass of lv2:Feature, so UIs use lv2:optionalFeature and +lv2:requiredFeature to specify which PortProtocols they want to use. + +"""^^lv2:Markdown . + +ui:floatProtocol + lv2:documentation """ + +A protocol for transferring single floating point values. The rules for this +protocol are: + +Port Type +: lv2:ControlPort + +Feature Data +: None. + +Update Frequency +: The host SHOULD call port_event() as soon as possible when the port value has + changed, but there are no timing guarantees. + +Update Format +: A single float. + +Options +: None. + +Write Format +: A single float. + +Write Effect +: The host SHOULD set the port to the received value as soon as possible, but + there is no guarantee that run() actually sees this value. + +"""^^lv2:Markdown . + +ui:peakProtocol + lv2:documentation """ + +This port protocol defines a way for the host to send continuous peak +measurements of the audio signal at a certain port to the UI. The intended use +is visualisation, for example an animated meter widget that shows the level of +the audio input or output. + +A contiguous sequence of audio samples for which a peak value has been computed +is called a _measurement period_. + +The rules for this protocol are: + +Port Type +: lv2:AudioPort + +Feature Data +: None. + +Update Frequency +: The host SHOULD call port_event() at regular intervals. The measurement + periods used for calls to port_event() for the same port SHOULD be + contiguous (i.e. the measurement period for one call should begin right + after the end of the measurement period for the previous call ends) unless + the UI has removed and re-added the port subscription between those calls. + However, UIs MUST NOT depend on either the regularity of the calls or the + contiguity of the measurement periods; hosts may change the call rate or + skip calls for performance or other reasons. Measurement periods for + different calls to port_event() for the same port MUST NOT overlap. + +Update Format +: A single LV2UI_Peak_Data object. + +Options +: None. + +Write Format +: None. + +Write Effect +: None. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 22 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"ui.ttl", +R"lv2ttl(@prefix lv2: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix ui: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 UI" ; + rdfs:comment "User interfaces for LV2 plugins." ; + owl:imports ; + rdfs:seeAlso , + . + +ui:UI + a rdfs:Class , + owl:Class ; + rdfs:label "User Interface" ; + rdfs:comment "A UI for an LV2 plugin." . + +ui:GtkUI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "GTK2 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Gtk+ 2.0 GtkWidget." . + +ui:Gtk3UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "GTK3 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Gtk+ 3.0 GtkWidget." . + +ui:Qt4UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Qt4 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Qt4 QWidget." . + +ui:Qt5UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Qt5 UI" ; + rdfs:comment "A UI where the widget is a pointer to a Qt5 QWidget." . + +ui:X11UI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "X11 UI" ; + rdfs:comment "A UI where the widget is an X11 Window window ID." . + +ui:WindowsUI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Windows UI" ; + rdfs:comment "A UI where the widget is a Windows HWND window ID." . + +ui:CocoaUI + a rdfs:Class , + owl:Class ; + rdfs:subClassOf ui:UI ; + rdfs:label "Cocoa UI" ; + rdfs:comment "A UI where the widget is a pointer to a NSView." . + +ui:ui + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:Plugin ; + rdfs:range ui:UI ; + rdfs:label "user interface" ; + rdfs:comment "Relates a plugin to a UI that applies to it." . + +ui:binary + a rdf:Property , + owl:ObjectProperty ; + owl:sameAs lv2:binary ; + owl:deprecated "true"^^xsd:boolean ; + rdfs:label "binary" ; + rdfs:comment "The shared library that a UI resides in." . + +ui:makeSONameResident + a lv2:Feature ; + owl:deprecated "true"^^xsd:boolean ; + rdfs:label "make SO name resident" ; + rdfs:comment "UI binary must not be unloaded." . + +ui:noUserResize + a lv2:Feature ; + rdfs:label "no user resize" ; + rdfs:comment "Non-resizable UI." . + +ui:fixedSize + a lv2:Feature ; + rdfs:label "fixed size" ; + rdfs:comment "Non-resizable UI that will never resize itself." . + +ui:scaleFactor + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:range xsd:float ; + rdfs:label "scale factor" ; + rdfs:comment "Scale factor for high resolution screens." . + +ui:backgroundColor + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "background color" ; + rdfs:comment """The background color of the host's UI.""" . + +ui:foregroundColor + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "foreground color" ; + rdfs:comment """The foreground color of the host's UI.""" . + +ui:parent + a lv2:Feature ; + rdfs:label "parent" ; + rdfs:comment "The parent for a UI." . + +ui:PortNotification + a rdfs:Class , + owl:Class ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty ui:plugin ; + owl:cardinality 1 ; + rdfs:comment "A PortNotification MUST have exactly one ui:plugin." + ] ; + rdfs:label "Port Notification" ; + rdfs:comment "A description of port updates that a host must send a UI." . + +ui:portNotification + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:UI ; + rdfs:range ui:PortNotification ; + rdfs:label "port notification" ; + rdfs:comment "Specifies a port notification that is required by a UI." . + +ui:plugin + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range lv2:Plugin ; + rdfs:label "plugin" ; + rdfs:comment "The plugin a portNotification applies to." . + +ui:portIndex + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range xsd:decimal ; + rdfs:label "port index" ; + rdfs:comment "The index of the port a portNotification applies to." . + +ui:notifyType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:PortNotification ; + rdfs:label "notify type" ; + rdfs:comment "A particular type that the UI should be notified of." . + +ui:resize + a lv2:Feature , + lv2:ExtensionData ; + rdfs:label "resize" ; + rdfs:comment """A feature that control of, and notifications about, a UI's size.""" . + +ui:portMap + a lv2:Feature ; + rdfs:label "port map" ; + rdfs:comment "A feature for accessing the index of a port by symbol." . + +ui:portSubscribe + a lv2:Feature ; + rdfs:label "port subscribe" ; + rdfs:comment "A feature for dynamically subscribing to updates from a port." . + +ui:touch + a lv2:Feature ; + rdfs:label "touch" ; + rdfs:comment "A feature to notify that the user has grabbed a port control." . + +ui:requestValue + a lv2:Feature ; + rdfs:label "request value" ; + rdfs:comment "A feature to request a parameter value from the user via the host." . + +ui:idleInterface + a lv2:Feature , + lv2:ExtensionData ; + rdfs:label "idle interface" ; + rdfs:comment "A feature that provides a callback for the host to drive the UI." . + +ui:showInterface + a lv2:ExtensionData ; + rdfs:label "show interface" ; + rdfs:comment "An interface for showing and hiding a window for a UI." . + +ui:windowTitle + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:string ; + rdfs:label "window title" ; + rdfs:comment "The title for the window shown by LV2UI_Show_Interface." . + +ui:updateRate + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:float ; + rdfs:label "update rate" ; + rdfs:comment "The target rate, in Hz, to send updates to the UI." . + +ui:protocol + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ui:PortNotification ; + rdfs:range ui:PortProtocol ; + rdfs:label "protocol" ; + rdfs:comment "The protocol to be used for this notification." . + +ui:PortProtocol + a rdfs:Class ; + rdfs:subClassOf lv2:Feature ; + rdfs:label "Port Protocol" ; + rdfs:comment "A method to communicate port data between a UI and plugin." . + +ui:floatProtocol + a ui:PortProtocol ; + rdfs:label "float protocol" ; + rdfs:comment "A protocol for transferring single floating point values." . + +ui:peakProtocol + a ui:PortProtocol ; + rdfs:label "peak protocol" ; + rdfs:comment "A protocol for sending continuous peak measurements of an audio signal." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"options", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"options.ttl", +R"lv2ttl(@prefix lv2: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Options" ; + rdfs:comment "Runtime options for LV2 plugins and UIs." ; + rdfs:seeAlso , + . + +opts:Option + a rdfs:Class ; + rdfs:label "Option" ; + rdfs:subClassOf rdf:Property ; + rdfs:comment "A value for a static option passed to an instance." . + +opts:interface + a lv2:ExtensionData ; + rdfs:label "interface" ; + rdfs:comment "An interface for dynamically setting and getting options." . + +opts:options + a lv2:Feature ; + rdfs:label "options" ; + rdfs:comment "The feature used to provide options to an instance." . + +opts:requiredOption + a rdf:Property , + owl:ObjectProperty ; + rdfs:range rdf:Property ; + rdfs:label "required option" ; + rdfs:comment "An option required by the instance to function at all." . + +opts:supportedOption + a rdf:Property , + owl:ObjectProperty ; + rdfs:range rdf:Property ; + rdfs:label "supported option" ; + rdfs:comment "An option supported or by the instance." . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"options.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix opts: . +@prefix rdf: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Options" ; + doap:shortdesc "Runtime options for LV2 plugins and UIs." ; + doap:created "2012-08-20" ; + doap:developer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Relax range of opts:requiredOption and opts:supportedOption" + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2013-01-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Set the range of opts:requiredOption and opts:supportedOption to opts:Option." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a facility for options, which are values the host +passes to a plugin or UI at run time. + +There are two facilities for passing options to an instance: opts:options +allows passing options at instantiation time, and the opts:interface interface +allows options to be dynamically set and retrieved after instantiation. + +Note that this extension is only for allowing hosts to configure plugins, and +is not a live control mechanism. For real-time control, use event-based +control via an atom:AtomPort with an atom:Sequence buffer. + +Instances may indicate they require an option with the opts:requiredOption +property, or that they optionally support an option with the +opts:supportedOption property. + +"""^^lv2:Markdown . + +opts:Option + lv2:documentation """ + +It is not required for a property to explicitly be an Option in order to be +used as such. However, properties which are primarily intended for use as +options, or are at least particularly useful as options, should be explicitly +given this type for documentation purposes, and to assist hosts in discovering +option definitions. + +"""^^lv2:Markdown . + +opts:interface + lv2:documentation """ + +An interface (LV2_Options_Interface) for dynamically setting and getting +options. Note that this is intended for use by the host for configuring +plugins only, and is not a live plugin control mechanism. + +The plugin data file should advertise this interface like so: + + :::turtle + @prefix opts: . + + + a lv2:Plugin ; + lv2:extensionData opts:interface . + +"""^^lv2:Markdown . + +opts:options + lv2:documentation """ + +To implement this feature, hosts MUST pass an LV2_Feature to the appropriate +instantiate method with this URI and data pointed to an array of +LV2_Options_Option terminated by an element with both key and value set to +zero. The instance should cast this data pointer to `const +LV2_Options_Option*` and scan the array for any options of interest. The +instance MUST NOT modify the options array in any way. + +Note that requiring this feature may reduce the number of compatible hosts. +Unless some options are strictly required by the instance, this feature SHOULD +be listed as an lv2:optionalFeature. + +"""^^lv2:Markdown . + +opts:requiredOption + lv2:documentation """ + +The host MUST pass a value for the specified option via opts:options during +instantiation. + +Note that use of this property may reduce the number of compatible hosts. +Wherever possible, it is better to list options with opts:supportedOption and +fall back to a reasonable default value if it is not provided. + +"""^^lv2:Markdown . + +opts:supportedOption + lv2:documentation """ + +The host SHOULD provide a value for the specified option if one is known, or +provide the user an opportunity to specify one if possible. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"resize-port", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 0 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"resize-port.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix rsz: . + + + a doap:Project ; + doap:name "LV2 Resize Port" ; + doap:shortdesc "Dynamically sized LV2 port buffers." ; + doap:created "2007-00-00" ; + doap:developer ; + doap:release [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature, rsz:resize, which allows plugins to +dynamically resize their output port buffers. + +In addition to the dynamic feature, there are properties which describe the +space required for a particular port buffer which can be used statically in +data files. + +"""^^lv2:Markdown . + +rsz:resize + lv2:documentation """ + +A feature to resize output port buffers in LV2_Plugin_Descriptor::run(). + +To support this feature, the host must pass an LV2_Feature to the plugin's +instantiate method with URI LV2_RESIZE_PORT__resize and a pointer to a +LV2_Resize_Port_Resize structure. This structure provides a resize_port +function which plugins may use to resize output port buffers as necessary. + +"""^^lv2:Markdown . + +rsz:asLargeAs + lv2:documentation """ + +Indicates that a port requires at least as much buffer space as the port with +the given symbol on the same plugin instance. This may be used for any ports, +but is generally most useful to indicate an output port must be at least as +large as some input port (because it will copy from it). If a port is +asLargeAs several ports, it is asLargeAs the largest such port (not the sum of +those ports' sizes). + +The host guarantees that whenever an ObjectPort's run method is called, any +output `O` that is rsz:asLargeAs an input `I` is connected to a buffer large +enough to copy `I`, or `NULL` if the port is lv2:connectionOptional. + +"""^^lv2:Markdown . + +rsz:minimumSize + lv2:documentation """ + +Indicates that a port requires a buffer at least this large, in bytes. Any +host that supports the resize-port feature MUST connect any port with a +minimumSize specified to a buffer at least as large as the value given for this +property. Any host, especially those that do NOT support dynamic port +resizing, SHOULD do so or reduced functionality may result. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"resize-port.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix rsz: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Resize Port" ; + rdfs:comment "Dynamically sized LV2 port buffers." ; + rdfs:seeAlso , + . + +rsz:resize + a lv2:Feature ; + rdfs:label "resize" ; + rdfs:comment "A feature for resizing output port buffers." . + +rsz:asLargeAs + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:range lv2:Symbol ; + rdfs:label "as large as" ; + rdfs:comment "Port that this port must have at least as much buffer space as." . + +rsz:minimumSize + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "minimum size" ; + rdfs:comment "Minimum buffer size required by a port, in bytes." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"core", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix doap: . +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 18 ; + lv2:microVersion 0 ; + rdfs:seeAlso . + + + a doap:Project ; + rdfs:seeAlso , + . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix lv2: . +@prefix meta: . +@prefix rdf: . +@prefix rdfs: . + + + rdf:value """ +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +""" . + + + a doap:Project ; + lv2:symbol "lv2" ; + rdfs:label "LV2" ; + rdfs:comment "The LV2 Plugin Interface Project." ; + doap:name "LV2" ; + doap:license ; + doap:shortdesc "The LV2 Plugin Interface Project." ; + doap:description "LV2 is a plugin standard for audio systems. It defines a minimal yet extensible C API for plugin code and a format for plugin bundles" ; + doap:created "2006-05-10" ; + doap:homepage ; + doap:mailing-list ; + doap:programming-language "C" ; + doap:repository [ + a doap:SVNRepository ; + doap:location + ] ; + doap:developer , + ; + doap:helper meta:larsl , + meta:bmwiedemann , + meta:gabrbedd , + meta:daste , + meta:kfoltman , + meta:paniq ; + doap:release [ + doap:revision "1.18.2" ; + doap:created "2021-01-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "eg-sampler: Save and restore gain parameter value." + ] , [ + rdfs:label "Various code cleanups and infrastructure improvements." + ] + ] + ] , [ + doap:revision "1.18.0" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] , [ + rdfs:label "Separate extended documentation from primary data." + ] + ] + ] , [ + doap:revision "1.16.0" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add core/attributes.h utility header." + ] , [ + rdfs:label "eg-sampler: Add waveform display to UI." + ] , [ + rdfs:label "eg-midigate: Respond to \"all notes off\" MIDI message." + ] , [ + rdfs:label "Simplify use of lv2specgen." + ] , [ + rdfs:label "Add lv2_validate utility." + ] , [ + rdfs:label "Install headers to simpler paths." + ] , [ + rdfs:label "Aggressively deprecate uri-map and event extensions." + ] , [ + rdfs:label "Upgrade build system and fix building with Python 3.7." + ] + ] + ] , [ + doap:revision "1.14.0" ; + doap:created "2016-09-19" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label """eg-scope: Don't feed back UI state updates.""" + ] , [ + rdfs:label "eg-sampler: Fix handling of state file paths." + ] , [ + rdfs:label "eg-sampler: Support thread-safe state restoration." + ] + ] + ] , [ + doap:revision "1.12.0" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "eg-sampler: Support patch:Get, and request initial state from UI." + ] , [ + rdfs:label "eg-sampler: Add gain parameter." + ] , [ + rdfs:label "Fix merging of version histories in specification documentation." + ] , [ + rdfs:label "Improve API documentation." + ] , [ + rdfs:label "Simplify property restrictions by removing redundancy." + ] + ] + ] , [ + doap:revision "1.10.0" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "lv2specgen: Display deprecated warning on classes marked owl:deprecated." + ] , [ + rdfs:label "Fix -Wconversion warnings in headers." + ] , [ + rdfs:label "Upgrade to waf 1.7.16." + ] + ] + ] , [ + doap:revision "1.8.0" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add scope example plugin from Robin Gareus." + ] , [ + rdfs:label "lv2specgen: Fix links to externally defined terms." + ] , [ + rdfs:label "Install lv2specgen for use by other projects." + ] + ] + ] , [ + doap:revision "1.6.0" ; + doap:created "2013-08-09" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix port indices of metronome example." + ] , [ + rdfs:label "Fix lv2specgen usage from command line." + ] , [ + rdfs:label "Upgrade to waf 1.7.11." + ] + ] + ] , [ + doap:revision "1.4.0" ; + doap:created "2013-02-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add metronome example plugin to demonstrate sample accurate tempo sync." + ] , [ + rdfs:label "Generate book-style HTML documentation from example plugins." + ] + ] + ] , [ + doap:revision "1.2.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Move all project metadata for extensions (e.g. change log) to separate files to spare hosts from loading them during discovery." + ] , [ + rdfs:label "Use stricter datatype definitions conformant with the XSD and OWL specifications for better validation." + ] + ] + ] , [ + doap:revision "1.0.0" ; + doap:created "2012-04-16" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label """Initial release as a unified project. Projects can now simply depend on the pkg-config package 'lv2' for all official LV2 APIs.""" + ] , [ + rdfs:label "New extensions: atom, log, parameters, patch, port-groups, port-props, resize-port, state, time, worker." + ] + ] + ] . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"people.ttl", +R"lv2ttl(@prefix foaf: . +@prefix meta: . +@prefix rdfs: . + + + a foaf:Person ; + foaf:name "David Robillard" ; + foaf:mbox ; + rdfs:seeAlso . + + + a foaf:Person ; + foaf:name "Steve Harris" ; + foaf:mbox ; + rdfs:seeAlso . + +meta:larsl + a foaf:Person ; + foaf:name "Lars Luthman" ; + foaf:mbox . + +meta:gabrbedd + a foaf:Person ; + foaf:name "Gabriel M. Beddingfield" ; + foaf:mbox . + +meta:daste + a foaf:Person ; + foaf:name """Stefano D'Angelo""" ; + foaf:mbox . + +meta:kfoltman + a foaf:Person ; + foaf:name "Krzysztof Foltman" ; + foaf:mbox . + +meta:paniq + a foaf:Person ; + foaf:name "Leonard Ritter" ; + foaf:mbox . + +meta:harry + a foaf:Person ; + foaf:name "Harry van Haaren" ; + foaf:mbox . + +meta:bmwiedemann + a foaf:Person ; + foaf:name "Bernhard M. Wiedemann" ; + foaf:mbox . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"lv2core.meta.ttl", +R"lv2ttl(@prefix lv2: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2" ; + doap:homepage ; + doap:created "2004-04-21" ; + doap:shortdesc "An extensible open standard for audio plugins" ; + doap:programming-language "C" ; + doap:developer , + ; + doap:maintainer ; + doap:release [ + doap:revision "18.0" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:Markdown datatype." + ] , [ + rdfs:label "Deprecate lv2:reportsLatency." + ] + ] + ] , [ + doap:revision "16.0" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:MIDIPlugin class." + ] , [ + rdfs:label "Rework port restrictions so that presets can be validated." + ] + ] + ] , [ + doap:revision "14.0" ; + doap:created "2016-09-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2_util.h with lv2_features_data() and lv2_features_query()." + ] , [ + rdfs:label "Add lv2:enabled designation." + ] + ] + ] , [ + doap:revision "12.4" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Relax domain of lv2:minimum lv2:maximum and lv2:default so they can be used to describe properties/parameters as well." + ] , [ + rdfs:label "Add extern C and visibility attribute to LV2_SYMBOL_EXPORT." + ] , [ + rdfs:label "Add lv2:isSideChain port property." + ] + ] + ] , [ + doap:revision "12.2" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Clarify lv2_descriptor() and lv2_lib_descriptor() documentation." + ] + ] + ] , [ + doap:revision "12.0" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:prototype for property inheritance." + ] + ] + ] , [ + doap:revision "10.0" ; + doap:created "2013-02-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2:EnvelopePlugin class." + ] , [ + rdfs:label "Add lv2:control for designating primary event-based control ports." + ] , [ + rdfs:label "Set range of lv2:designation to lv2:Designation." + ] , [ + rdfs:label "Make lv2:Parameter rdfs:subClassOf rdf:Property." + ] , [ + rdfs:label "Reserve minor version 0 for unstable development plugins." + ] + ] + ] , [ + doap:revision "8.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "8.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix LV2_SYMBOL_EXPORT and lv2_descriptor prototype for Windows." + ] , [ + rdfs:label "Add metadata concept of a designation, a channel or parameter description which can be assigned to ports for more intelligent use by hosts." + ] , [ + rdfs:label "Add new discovery API which allows libraries to read bundle files during discovery, makes library construction/destruction explicit, and adds extensibility to prevent future breakage." + ] , [ + rdfs:label "Relax the range of lv2:index so it can be used for things other than ports." + ] , [ + rdfs:label "Remove lv2:Resource, which turned out to be meaningless." + ] , [ + rdfs:label "Add lv2:CVPort." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "6.0" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Rename core.lv2 and lv2.ttl to lv2core.lv2 and lv2core.ttl to adhere to modern conventions." + ] , [ + rdfs:label "Add lv2:extensionData and lv2:ExtensionData for plugins to indicate that they support some URI for extension_data()." + ] , [ + rdfs:label "Remove lv2config in favour of the simple convention that specifications install headers to standard URI-based paths." + ] , [ + rdfs:label "Switch to the ISC license, a simple BSD-style license (with permission of all contributors to lv2.h and its ancestor, ladspa.h)." + ] , [ + rdfs:label "Make lv2core.ttl a valid OWL 2 DL ontology." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "4.0" ; + doap:created "2011-03-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make doap:license suggested, but not required (for wrappers)." + ] , [ + rdfs:label "Define lv2:binary (MUST be in manifest.ttl)." + ] , [ + rdfs:label "Define lv2:minorVersion and lv2:microVersion (MUST be in manifest.ttl)." + ] , [ + rdfs:label "Define lv2:documentation and use it to document lv2core." + ] , [ + rdfs:label "Add lv2:FunctionPlugin and lv2:ConstantPlugin classes." + ] , [ + rdfs:label "Move lv2:AmplifierPlugin under lv2:DynamicsPlugin." + ] , [ + rdfs:label "Loosen domain of lv2:optionalFeature and lv2:requiredFeature (to allow re-use in extensions)." + ] , [ + rdfs:label "Add generic lv2:Resource and lv2:PluginBase classes." + ] , [ + rdfs:label "Fix definition of lv2:minimum etc. (used for values, not scale points)." + ] , [ + rdfs:label "More precisely define properties with OWL." + ] , [ + rdfs:label "Move project metadata to manifest." + ] , [ + rdfs:label "Add lv2:enumeration port property." + ] , [ + rdfs:label "Define run() pre-roll special case (sample_count == 0)." + ] + ] + ] , [ + doap:revision "3.0" ; + doap:created "2008-11-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Require that serialisations refer to ports by symbol rather than index." + ] , [ + rdfs:label "Minor stylistic changes to lv2.ttl." + ] , [ + rdfs:label "No header changes." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2008-02-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +LV2 is an interface for writing audio plugins in C or compatible languages, +which can be dynamically loaded into many _host_ applications. This core +specification is simple and minimal, but is designed so that _extensions_ can +be defined to add more advanced features, making it possible to implement +nearly any feature. + +LV2 maintains a strong distinction between code and data. Plugin code is in a +shared library, while data is in a companion data file written in +[Turtle](https://www.w3.org/TR/turtle/). Code, data, and any other resources +(such as wav)lv2ttl" R"lv2ttl(eforms) are shipped together in a bundle directory. The code +contains only the executable portions of the plugin. All other data is +provided in the data file(s). This makes plugin data flexible and extensible, +and allows the host to do everything but run the plugin without loading or +executing any code. Among other advantages, this makes hosts more robust +(broken plugins can't crash a host during discovery) and allows generic tools +written in any language to work with LV2 data. The LV2 specification itself is +distributed in a similar way. + +An LV2 plugin library is suitable for dynamic loading (for example with +`dlopen()`) and provides one or more plugin descriptors via `lv2_descriptor()` +or `lv2_lib_descriptor()`. These can be instantiated to create plugin +instances, which can be run directly on data or connected together to perform +advanced signal processing tasks. + +Plugins communicate via _ports_, which can transmit any type of data. Data is +processed by first connecting each port to a buffer, then repeatedly calling +the `run()` method to process blocks of data. + +This core specification defines two types of port, equivalent to those in +[LADSPA](http://www.ladspa.org/), lv2:ControlPort and lv2:AudioPort, as well as +lv2:CVPort which has the same format as an audio port but is interpreted as +non-audible control data. Audio ports contain arrays with one `float` element +per sample, allowing a block of audio to be processed in a single call to +`run()`. Control ports contain single `float` values, which are fixed and +valid for the duration of the call to `run()`. Thus the _control rate_ is +determined by the block size, which is controlled by the host (and not +necessarily constant). + +### Threading Rules + +To faciliate use in multi-threaded programs, LV2 functions are partitioned into +several threading classes: + +| Discovery Class | Instantiation Class | Audio Class | +|----------------------------------|-------------------------------|------------------------------- | +| lv2_descriptor() | LV2_Descriptor::instantiate() | LV2_Descriptor::run() | +| lv2_lib_descriptor() | LV2_Descriptor::cleanup() | LV2_Descriptor::connect_port() | +| LV2_Descriptor::extension_data() | LV2_Descriptor::activate() | | +| | LV2_Descriptor::deactivate() | | + +Hosts MUST guarantee that: + + * A function in any class is never called concurrently with another function + in that class. + + * A _Discovery_ function is never called concurrently with any other fuction + in the same shared object file. + + * An _Instantiation_ function for an instance is never called concurrently + with any other function for that instance. + +Any simultaneous calls that are not explicitly forbidden by these rules are +allowed. For example, a host may call `run()` for two different plugin +instances simultaneously. + +Plugin functions in any class MUST NOT manipulate any state which might affect +other plugins or the host (beyond the contract of that function), for example +by using non-reentrant global functions. + +Extensions to this specification which add new functions MUST declare in which +of these classes the functions belong, define new classes for them, or +otherwise precisely describe their threading rules. + +"""^^lv2:Markdown . + +lv2:Specification + lv2:documentation """ + +An LV2 specification typically contains a vocabulary description, C headers to +define an API, and any other resources that may be useful. Specifications, +like plugins, are distributed and installed as bundles so that hosts may +discover them. + +"""^^lv2:Markdown . + +lv2:Markdown + lv2:documentation """ + +This datatype is typically used for documentation in +[Markdown](https://daringfireball.net/projects/markdown/syntax) syntax. + +Generally, documentation with this datatype should stay as close to readable +plain text as possible, but may use core Markdown syntax for nicer +presentation. Documentation can assume that basic extensions like codehilite +and tables are available. + +"""^^lv2:Markdown . + +lv2:documentation + lv2:documentation """ + +Relates a Resource to extended documentation. + +LV2 specifications are documented using this property with an lv2:Markdown +datatype. + +If the value has no explicit datatype, it is assumed to be a valid XHTML Basic +1.1 fragment suitable for use as the content of the `body` element of a page. + +XHTML Basic is a W3C Recommendation which defines a simplified subset of XHTML +intended to be reasonable to implement with limited resources, for exampe on +embedded devices. See [XHTML Basic, Section +3](http://www.w3.org/TR/xhtml-basic/#s_xhtmlmodules) for a list of valid tags. + +"""^^lv2:Markdown . + +lv2:PluginBase + lv2:documentation """ + +An abstract plugin-like resource that may not actually be an LV2 plugin, for +example that may not have a lv2:binary. This is useful for describing things +that share common structure with a plugin, but are not themselves an actul +plugin, such as presets. + +"""^^lv2:Markdown . + +lv2:Plugin + lv2:documentation """ + +To be discovered by hosts, plugins MUST explicitly have an rdf:type of lv2:Plugin +in their bundle's manifest, for example: + + :::turtle + a lv2:Plugin . + +Plugins should have a doap:name property that is at most a few words in length +using title capitalization, for example Tape Delay Unit. + +"""^^lv2:Markdown . + +lv2:PortBase + lv2:documentation """ + +Similar to lv2:PluginBase, this is an abstract port-like resource that may not +be a fully specified LV2 port. For example, this is used for preset "ports" +which do not specify an index. + +"""^^lv2:Markdown . + +lv2:Port + lv2:documentation """ + +All LV2 port descriptions MUST have a rdf:type that is one of lv2:Port, +lv2:InputPort or lv2:OutputPort. Additionally, there MUST be at least one +other rdf:type which more precisely describes type of the port, for example +lv2:AudioPort. + +Hosts that do not support a specific port class MUST NOT instantiate the +plugin, unless that port has the lv2:connectionOptional property set. + +A port has two identifiers: a (numeric) index, and a (textual) symbol. The +index can be used as an identifier at run-time, but persistent references to +ports (for example in presets or save files) MUST use the symbol. Only the +symbol is guaranteed to refer to the same port on all plugins with a given URI, +that is the index for a port may differ between plugin binaries. + +"""^^lv2:Markdown . + +lv2:AudioPort + lv2:documentation """ + +Ports of this type are connected to a buffer of `float` audio samples, which +the host guarantees have `sample_count` elements in any call to +LV2_Descriptor::run(). + +Audio samples are normalized between -1.0 and 1.0, though there is no +requirement for samples to be strictly within this range. + +"""^^lv2:Markdown . + +lv2:CVPort + lv2:documentation """ + +Ports of this type have the same buffer format as an lv2:AudioPort, except the +buffer represents audio-rate control data rather than audio. Like a +lv2:ControlPort, a CV port SHOULD have properties describing its value, in +particular lv2:minimum, lv2:maximum, and lv2:default. + +Hosts may present CV ports to users as controls in the same way as control +ports. Conceptually, aside from the buffer format, a CV port is the same as a +control port, so hosts can use all the same properties and expectations. + +In particular, this port type does not imply any range, unit, or meaning for +its values. However, if there is no inherent unit to the values, for example +if the port is used to modulate some other value, then plugins SHOULD use a +normalized range, either from -1.0 to 1.0, or from 0.0 to 1.0. + +It is generally safe to connect an audio output to a CV input, but not +vice-versa. Hosts must take care to prevent data from a CVPort port from being +used as audio. + +"""^^lv2:Markdown . + +lv2:project + lv2:documentation """ + +This property provides a way to )lv2ttl" R"lv2ttl(group plugins and/or related resources. A +project may have useful metadata common to all plugins (such as homepage, +author, version history) which would be wasteful to list separately for each +plugin. + +Grouping via projects also allows users to find plugins in hosts by project, +which is often how they are remembered. For this reason, a project that +contains plugins SHOULD always have a doap:name. It is also a good idea for +each plugin and the project itself to have an lv2:symbol property, which allows +nice quasi-global identifiers for plugins, for example `myproj.superamp` which +can be useful for display or fast user entry. + +"""^^lv2:Markdown . + +lv2:prototype + lv2:documentation """ + +This property can be used to include common properties in several +descriptions, serving as a sort of template mechanism. If a plugin has a +prototype, then the host must load all the properties for the prototype as if +they were properties of the plugin. That is, if `:plug lv2:prototype :prot`, +then for each triple `:prot p o`, the triple `:plug p o` should be loaded. + +This facility is useful for distributing data-only plugins that rely on a +common binary, for example those where the internal state is loaded from some +other file. Such plugins can refer to a prototype in a template LV2 bundle +which is installed by the corresponding software. + +"""^^lv2:Markdown . + +lv2:minorVersion + lv2:documentation """ + +This, along with lv2:microVersion, is used to distinguish between different +versions of the same resource, for example to load only the bundle with +the most recent version of a plugin. An LV2 version has a minor and micro +number with the usual semantics: + + * The minor version MUST be incremented when backwards (but not forwards) + compatible additions are made, for example the addition of a port to a + plugin. + + * The micro version is incremented for changes which do not affect + compatibility at all, for example bug fixes or documentation updates. + +Note that there is deliberately no major version: all versions with the same +URI are compatible by definition. Replacing a resource with a newer version of +that resource MUST NOT break anything. If a change violates this rule, then +the URI of the resource (which serves as the major version) MUST be changed. + +Plugins and extensions MUST adhere to at least the following rules: + + * All versions of a plugin with a given URI MUST have the same set of + mandatory (not lv2:connectionOptional) ports with respect to lv2:symbol and + rdf:type. In other words, every port on a particular version is guaranteed + to exist on a future version with same lv2:symbol and at least those + rdf:types. + + * New ports MAY be added without changing the plugin URI if and only if they + are lv2:connectionOptional and the minor version is incremented. + + * The minor version MUST be incremented if the index of any port (identified + by its symbol) is changed. + + * All versions of a specification MUST be compatible in the sense that an + implementation of the new version can interoperate with an implementation + of any previous version. + +Anything that depends on a specific version of a plugin (including referencing +ports by index) MUST refer to the plugin by both URI and version. However, +implementations should be tolerant where possible. + +When hosts discover several installed versions of a resource, they SHOULD warn +the user and load only the most recent version. + +An odd minor _or_ micro version, or minor version zero, indicates that the +resource is a development version. Hosts and tools SHOULD clearly indicate +this wherever appropriate. Minor version zero is a special case for +pre-release development of plugins, or experimental plugins that are not +intended for stable use at all. Hosts SHOULD NOT expect such a plugin to +remain compatible with any future version. Where feasible, hosts SHOULD NOT +expose such plugins to users by default, but may provide an option to display +them. + +"""^^lv2:Markdown . + +lv2:microVersion + lv2:documentation """ + +Releases of plugins and extensions MUST be explicitly versioned. Correct +version numbers MUST always be maintained for any versioned resource that is +published. For example, after a release, if a change is made in the development +version in source control, the micro version MUST be incremented (to an odd +number) to distinguish this modified version from the previous release. + +This property describes half of a resource version. For detailed documentation +on LV2 resource versioning, see lv2:minorVersion. + +"""^^lv2:Markdown . + +lv2:binary + lv2:documentation """ + +The value of this property must be the URI of a shared library object, +typically in the same bundle as the data file which contains this property. +The actual type of the library is platform specific. + +This is a required property of a lv2:Plugin which MUST be included in the +bundle's `manifest.ttl` file. The lv2:binary of a lv2:Plugin is the shared +object containing the lv2_descriptor() or lv2_lib_descriptor() function. This +probably may also be used similarly by extensions to relate other resources to +their implementations (it is not implied that a lv2:binary on an arbitrary +resource is an LV2 plugin library). + +"""^^lv2:Markdown . + +lv2:appliesTo + lv2:documentation """ + +This is primarily intended for discovery purposes: bundles that describe +resources that work with particular plugins (like presets or user interfaces) +SHOULD specify this in their `manifest.ttl` so the host can associate them with +the correct plugin. For example: + + :::turtle + + a ext:Thing ; + lv2:appliesTo ; + rdfs:seeAlso . + +Using this pattern is preferable for large amounts of data, since the host may +choose whether/when to load the data. + +"""^^lv2:Markdown . + +lv2:Symbol + lv2:documentation """ + +The first character of a symbol must be one of `_`, `a-z` or `A-Z`, and +subsequent characters may additionally be `0-9`. This is, among other things, +a valid C identifier, and generally compatible in most contexts which have +restrictions on string identifiers, such as file paths. + +"""^^lv2:Markdown . + +lv2:symbol + lv2:documentation """ + +The value of this property MUST be a valid lv2:Symbol, and MUST NOT have a +language tag. + +A symbol is a unique identifier with respect to the parent, for example a +port's symbol is a unique identifiers with respect to its plugin. The plugin +author MUST change the plugin URI if any port symbol is changed or removed. + +"""^^lv2:Markdown . + +lv2:name + lv2:documentation """ + +Unlike lv2:symbol, this is unrestricted, may be translated, and is not relevant +for compatibility. The name is not necessarily unique and MUST NOT be used as +an identifier. + +"""^^lv2:Markdown . + +lv2:shortName + lv2:documentation """ + +This is the same as lv2:name, with the additional requirement that the value is +shorter than 16 characters. + +"""^^lv2:Markdown . + +lv2:Designation + lv2:documentation """ + +A designation is metadata that describes the meaning or role of something. By +assigning a designation to a port using lv2:designation, the port's content +becomes meaningful and can be used more intelligently by the host. + +"""^^lv2:Markdown . + +lv2:Channel + lv2:documentation """ + +A specific channel, for example the left channel of a stereo stream. A +channel may be audio, or another type such as a MIDI control stream. + +"""^^lv2:Markdown . + +lv2:Parameter + lv2:documentation """ + +A parameter is a designation for a control. + +A parameter defines the meaning of a control, not the method of conveying its +value. For example, a parameter could be controlled via a lv2:ControlPort, +messages, or both. + +A lv2:ControlPort can be associated with a parameter using lv2:designation. + +"""^^lv2:Markdown . + +lv2:designation + lv2:documentation """ + +This property is used to give a port's contents a well-defined meaning. For +example, if a port has the designation `eg:gain`, then the value of that port +re)lv2ttl" R"lv2ttl(presents the `eg:gain` of the plugin instance. + +Ports should be given designations whenever possible, particularly if a +suitable designation is already defined. This allows the host to act more +intelligently and provide a more effective user interface. For example, if the +plugin has a BPM parameter, the host may automatically set that parameter to +the current tempo. + +"""^^lv2:Markdown . + +lv2:freeWheeling + lv2:documentation """ + +If true, this means that all processing is happening as quickly as possible, +not in real-time. When free-wheeling there is no relationship between the +passage of real wall-clock time and the passage of time in the data being +processed. + +"""^^lv2:Markdown . + +lv2:enabled + lv2:documentation """ + +If this value is greater than zero, the plugin processes normally. If this +value is zero, the plugin is expected to bypass all signals unmodified. The +plugin must provide a click-free transition between the enabled and disabled +(bypassed) states. + +Values less than zero are reserved for future use (such as click-free +insertion/removal of latent plugins), and should be treated like zero +(bypassed) by current implementations. + +"""^^lv2:Markdown . + +lv2:control + lv2:documentation """ + +This should be used as the lv2:designation of ports that are used to send +commands and receive responses. Typically this will be an event port that +supports some protocol, for example MIDI or LV2 Atoms. + +"""^^lv2:Markdown . + +lv2:Point + lv2:documentation """ + + * A Point MUST have at least one rdfs:label which is a string. + + * A Point MUST have exactly one rdf:value with a type that is compatible with + the type of the corresponding Port. + +"""^^lv2:Markdown . + +lv2:default + lv2:documentation """ + +The host SHOULD set the port to this value initially, and in any situation +where the port value should be cleared or reset. + +"""^^lv2:Markdown . + +lv2:minimum + lv2:documentation """ + +This is a soft limit: the plugin is required to gracefully accept all values in +the range of a port's data type. + +"""^^lv2:Markdown . + +lv2:maximum + lv2:documentation """ + +This is a soft limit: the plugin is required to gracefully accept all values in +the range of a port's data type. + +"""^^lv2:Markdown . + +lv2:optionalFeature + lv2:documentation """ + +To support this feature, the host MUST pass its URI and any additional data to +the plugin in LV2_Descriptor::instantiate(). + +The plugin MUST NOT fail to instantiate if an optional feature is not supported +by the host. + +"""^^lv2:Markdown . + +lv2:requiredFeature + lv2:documentation """ + +To support this feature, the host MUST pass its URI and any additional data to +the plugin in LV2_Descriptor::instantiate(). + +The host MUST check this property before attempting to instantiate a plugin, +and not attempt to instantiate plugins which require features it does not +support. The plugin MUST fail to instantiate if a required feature is not +supported by the host. Note that these rules are intentionally redundant for +resilience: neither host nor plugin should assume that the other does not +violate them. + +"""^^lv2:Markdown . + +lv2:ExtensionData + lv2:documentation """ + +This is additional data that a plugin may return from +LV2_Descriptor::extension_data(). This is generally used to add APIs to extend +that defined by LV2_Descriptor. + +"""^^lv2:Markdown . + +lv2:extensionData + lv2:documentation """ + +If a plugin has a value for this property, it must be a URI that defines the +extension data. The plugin should return the appropriate data when +LV2_Descriptor::extension_data() is called with that URI as a parameter. + +"""^^lv2:Markdown . + +lv2:isLive + lv2:documentation """ + +This feature is for plugins that have time-sensitive internals, for example +communicating in real time over a socket. It indicates to the host that its +input and output must not be cached or subject to significant latency, and that +calls to LV2_Descriptor::run() should be made at a rate that roughly +corresponds to wall clock time (according to the `sample_count` parameter). + +Note that this feature is not related to hard real-time execution +requirements (see lv2:hardRTCapable). + +"""^^lv2:Markdown . + +lv2:inPlaceBroken + lv2:documentation """ + +This feature indicates that the plugin may not work correctly if the host +elects to use the same data location for both input and output. Plugins that +will fail to work correctly if ANY input port is connected to the same location +as ANY output port MUST require this feature. Doing so should be avoided +whenever possible since it prevents hosts from running the plugin on data +in-place. + +"""^^lv2:Markdown . + +lv2:hardRTCapable + lv2:documentation """ + +This feature indicates that the plugin is capable of running in a hard +real-time environment. This should be the case for most audio processors, +so most plugins are expected to have this feature. + +To support this feature, plugins MUST adhere to the following in all of their +audio class functions (LV2_Descriptor::run() and +LV2_Descriptor::connect_port()): + + * There is no use of `malloc()`, `free()` or any other heap memory management + functions. + + * There is no use of any library functions which do not adhere to these + rules. The plugin may assume that the standard C math library functions + are safe. + + * There is no access to files, devices, pipes, sockets, system calls, or any + other mechanism that might result in the process or thread blocking. + + * The maximum amount of time for a `run()` call is bounded by some expression + of the form `A + B * sample_count`, where `A` and `B` are platform specific + constants. Note that this bound does not depend on input signals or plugin + state. + +"""^^lv2:Markdown . + +lv2:portProperty + lv2:documentation """ + +States that a port has a particular lv2:PortProperty. This may be ignored +without catastrophic effects, though it may be useful, for example to provide a +sensible user interface for the port. + +"""^^lv2:Markdown . + +lv2:connectionOptional + lv2:documentation """ + +This property means that the port does not have to be connected to valid data +by the host. To leave a port unconnected, the host MUST explicitly +connect the port to `NULL`. + +"""^^lv2:Markdown . + +lv2:reportsLatency + lv2:documentation """ + +This property indicates that the port is used to express the processing latency +incurred by the plugin, expressed in samples. The latency may be affected by +the current sample rate, plugin settings, or other factors, and may be changed +by the plugin at any time. Where the latency is frequency dependent the plugin +may choose any appropriate value. If a plugin introduces latency it MUST +provide EXACTLY ONE port with this property set. In fuzzy cases the +value should be the most reasonable one based on user expectation of +input/output alignment. For example, musical delay plugins should not report +their delay as latency, since it is an intentional effect that the host should +not compensate for. + +This property is deprecated, use a lv2:designation of lv2:latency instead, +following the same rules as above: + + :::turtle + + lv2:port [ + a lv2:OutputPort , lv2:ControlPort ; + lv2:designation lv2:latency ; + lv2:symbol "latency" ; + ] + +"""^^lv2:Markdown . + +lv2:toggled + lv2:documentation """ + +Indicates that the data item should be considered a boolean toggle. Data less +than or equal to zero should be considered off or false, and data +above zero should be considered on or true. + +"""^^lv2:Markdown . + +lv2:sampleRate + lv2:documentation """ + +Indicates that any specified bounds should be interpreted as multiples of the +sample rate. For example, a frequency range from 0 Hz to the Nyquist frequency +(half the sample rate) can be specified by using this property with lv2:minimum +0.0 and lv2:maximum 0.5. Hosts that support bounds at all MUST support this +property. + +"""^^lv2:Markdown . + +lv2:integer + lv2:documentation """ + +Indicates that all the reasonable values for a port)lv2ttl" R"lv2ttl( are integers. For such +ports, a user interface should provide a stepped control that only allows +choosing integer values. + +Note that this is only a hint, and that the plugin MUST operate reasonably even +if such a port has a non-integer value. + +"""^^lv2:Markdown . + +lv2:enumeration + lv2:documentation """ + +Indicates that all the rasonable values for a port are defined by +lv2:scalePoint properties. For such ports, a user interface should provide a selector that allows the user to choose any of the scale point values by name. It is recommended to show the value as well if possible. + +Note that this is only a hint, and that the plugin MUST operate reasonably even +if such a port has a value that does not correspond to a scale point. + +"""^^lv2:Markdown . + +lv2:isSideChain + lv2:documentation """ + +Indicates that a port is a sidechain, which affects the output somehow +but should not be considered a part of the main signal chain. Sidechain ports +SHOULD be lv2:connectionOptional, and may be ignored by hosts. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"lv2core.ttl", +R"lv2ttl(@prefix doap: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2" ; + rdfs:comment "An extensible open standard for audio plugins." ; + rdfs:seeAlso , + , + . + +lv2:Specification + a rdfs:Class , + owl:Class ; + rdfs:subClassOf doap:Project ; + rdfs:label "Specification" ; + rdfs:comment "An LV2 specifiation." . + +lv2:Markdown + a rdfs:Datatype ; + owl:onDatatype xsd:string ; + rdfs:label "Markdown" ; + rdfs:comment "A string in Markdown syntax." . + +lv2:documentation + a rdf:Property , + owl:AnnotationProperty ; + rdfs:range rdfs:Literal ; + rdfs:label "documentation" ; + rdfs:comment "Extended documentation." ; + rdfs:seeAlso . + +lv2:PluginBase + a rdfs:Class , + owl:Class ; + rdfs:label "Plugin Base" ; + rdfs:comment "Base class for a plugin-like resource." . + +lv2:Plugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:PluginBase ; + rdfs:label "Plugin" ; + rdfs:comment "An LV2 plugin." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty doap:name ; + owl:someValuesFrom rdf:PlainLiteral ; + rdfs:comment "A plugin MUST have at least one untranslated doap:name." + ] , [ + a owl:Restriction ; + owl:onProperty lv2:port ; + owl:allValuesFrom lv2:Port ; + rdfs:comment "All ports on a plugin MUST be fully specified lv2:Port instances." + ] . + +lv2:PortBase + a rdfs:Class , + owl:Class ; + rdfs:label "Port Base" ; + rdfs:comment "Base class for a port-like resource." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:symbol ; + owl:cardinality 1 ; + rdfs:comment "A port MUST have exactly one lv2:symbol." + ] . + +lv2:Port + a rdfs:Class , + owl:Class ; + rdfs:label "Port" ; + rdfs:comment "An LV2 plugin port." ; + rdfs:subClassOf lv2:PortBase , + [ + a owl:Restriction ; + owl:onProperty lv2:name ; + owl:minCardinality 1 ; + rdfs:comment "A port MUST have at least one lv2:name." + ] . + +lv2:InputPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Input Port" ; + rdfs:comment "A port connected to constant data which is read during `run()`." . + +lv2:OutputPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Output Port" ; + rdfs:comment "A port connected to data which is written during `run()`." . + +lv2:ControlPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Control Port" ; + rdfs:comment "A port connected to a single `float`." . + +lv2:AudioPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Audio Port" ; + rdfs:comment "A port connected to an array of float audio samples." . + +lv2:CVPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "CV Port" ; + rdfs:comment "A port connected to an array of float control values." . + +lv2:port + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:PluginBase ; + rdfs:range lv2:PortBase ; + rdfs:label "port" ; + rdfs:comment "A port (input or output) on this plugin." . + +lv2:project + a rdf:Property , + owl:ObjectProperty ; + rdfs:range doap:Project ; + rdfs:label "project" ; + rdfs:comment "The project this is a part of." . + +lv2:prototype + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "prototype" ; + rdfs:comment "The prototype to inherit properties from." . + +lv2:minorVersion + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "minor version" ; + rdfs:comment "The minor version of this resource." . + +lv2:microVersion + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "micro version" ; + rdfs:comment "The micro version of this resource." . + +lv2:binary + a rdf:Property , + owl:ObjectProperty ; + rdfs:range owl:Thing ; + rdfs:label "binary" ; + rdfs:comment "The binary of this resource." . + +lv2:appliesTo + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:Plugin ; + rdfs:label "applies to" ; + rdfs:comment "The plugin this resource is related to." . + +lv2:index + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:range xsd:unsignedInt ; + rdfs:label "index" ; + rdfs:comment "A non-negative zero-based 32-bit index." . + +lv2:Symbol + a rdfs:Datatype ; + owl:onDatatype xsd:string ; + owl:withRestrictions ( + [ + xsd:pattern "[_a-zA-Z][_a-zA-Z0-9]*" + ] + ) ; + rdfs:label "Symbol" ; + rdfs:comment "A short restricted name used as a strong identifier." . + +lv2:symbol + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "symbol" ; + rdfs:range lv2:Symbol , + rdf:PlainLiteral ; + rdfs:comment "The symbol that identifies this resource in the context of its parent." . + +lv2:name + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "name" ; + rdfs:range xsd:string ; + rdfs:comment "A display name for labeling in a user interface." . + +lv2:shortName + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "short name" ; + rdfs:range xsd:string ; + rdfs:comment "A short display name for labeling in a user interface." . + +lv2:Designation + a rdfs:Class , + owl:Class ; + rdfs:subClassOf rdf:Property ; + rdfs:label "Designation" ; + rdfs:comment "A designation which defines the meaning of some data." . + +lv2:Channel + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Designation ; + rdfs:label "Channel" ; + rdfs:comment "An individual channel, such as left or right." . + +lv2:Parameter + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Designation , + rdf:Property ; + rdfs:label "Parameter" ; + rdfs:comment "A property that is a plugin parameter." . + +lv2:designation + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:range rdf:Property ; + rdfs:label "designation" ; + rdfs:comment "The designation that defines the meaning of this input or output." . + +lv2:latency + a rdf:Property , + owl:DatatypeProperty ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "latency" ; + rdfs:comment "The latency introduced, in frames." . + +lv2:freeWheeling + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "free-wheeling" ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether processing is currently free-wheeling." . + +lv2:enabled + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "enabled" ; + rdfs:range xsd:int ; + rdfs:comment "Whether processing is currently enabled (not bypassed)." . + +lv2:control + a lv2:Channel ; + rdfs:label "control" ; + rdfs:comment "The primary control channel." . + +lv2:Point + a rdfs:Class , + owl:Class ; + rdfs:label "Point" ; + rdfs:comment "An interesting point in a value range." . + +lv2:ScalePoint + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Point ; + rdfs:label "Scale Point" ; + rdfs:comment "A single `float` Point for control inputs." . + +lv2:scalePoint + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:ScalePoint ; + rdfs:label "scale point" ; + rdfs:comment "A scale point of a port or parameter." . + +lv2:default + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "default" ; + rdfs:comment "The default value for this control." . + +lv2:minimum + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "minimum" ; + rdfs:comment "The minimum value for this control." . + +lv2:maximum + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "maximum" ; + rdfs:comment "The maximum value for this control." . + +lv2:Feature + a rdfs:Class , + owl:Class ; + rdfs:label "Feature" ; + rdfs:comment "An additional feature which may be used or required." . + +lv2:optionalFeature + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:Feature ; + rdfs:label "optional feature" ; + rdfs:comment "An optional feature that is supported if available." . + +lv2:requiredFeature + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:Feature ; + rdfs:label "required feature" ; + rdfs:comment "A requir)lv2ttl" R"lv2ttl(ed feature that must be available to run." . + +lv2:ExtensionData + a rdfs:Class , + owl:Class ; + rdfs:label "Extension Data" ; + rdfs:comment "Additional data defined by an extension." . + +lv2:extensionData + a rdf:Property , + owl:ObjectProperty ; + rdfs:range lv2:ExtensionData ; + rdfs:label "extension data" ; + rdfs:comment "Extension data provided by a plugin or other binary." . + +lv2:isLive + a lv2:Feature ; + rdfs:label "is live" ; + rdfs:comment "Plugin has a real-time dependency." . + +lv2:inPlaceBroken + a lv2:Feature ; + rdfs:label "in-place broken" ; + rdfs:comment "Plugin requires separate locations for input and output." . + +lv2:hardRTCapable + a lv2:Feature ; + rdfs:label "hard real-time capable" ; + rdfs:comment "Plugin is capable of running in a hard real-time environment." . + +lv2:PortProperty + a rdfs:Class , + owl:Class ; + rdfs:label "Port Property" ; + rdfs:comment "A particular property that a port has." . + +lv2:portProperty + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:Port ; + rdfs:range lv2:PortProperty ; + rdfs:label "port property" ; + rdfs:comment "A property of this port hosts may find useful." . + +lv2:connectionOptional + a lv2:PortProperty ; + rdfs:label "connection optional" ; + rdfs:comment "The property that this port may be connected to NULL." . + +lv2:reportsLatency + a lv2:PortProperty ; + owl:deprecated "true"^^xsd:boolean ; + rdfs:label "reports latency" ; + rdfs:comment "Control port value is the plugin latency in frames." . + +lv2:toggled + a lv2:PortProperty ; + rdfs:label "toggled" ; + rdfs:comment "Control port value is considered a boolean toggle." . + +lv2:sampleRate + a lv2:PortProperty ; + rdfs:label "sample rate" ; + rdfs:comment "Control port bounds are interpreted as multiples of the sample rate." . + +lv2:integer + a lv2:PortProperty ; + rdfs:label "integer" ; + rdfs:comment "Control port values are treated as integers." . + +lv2:enumeration + a lv2:PortProperty ; + rdfs:label "enumeration" ; + rdfs:comment "Control port scale points represent all useful values." . + +lv2:isSideChain + a lv2:PortProperty ; + rdfs:label "is side-chain" ; + rdfs:comment "Signal for port should not be considered a main input or output." . + +lv2:GeneratorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Generator Plugin" ; + rdfs:comment "A plugin that generates new sound internally." . + +lv2:InstrumentPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Instrument Plugin" ; + rdfs:comment "A plugin intended to be played as a musical instrument." . + +lv2:OscillatorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Oscillator Plugin" ; + rdfs:comment "A plugin that generates output with an oscillator." . + +lv2:UtilityPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Utility Plugin" ; + rdfs:comment "A utility plugin that is not a typical audio effect or generator." . + +lv2:ConverterPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Converter Plugin" ; + rdfs:comment "A plugin that converts its input into a different form." . + +lv2:AnalyserPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Analyser Plugin" ; + rdfs:comment "A plugin that analyses its input and emits some useful information." . + +lv2:MixerPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Mixer Plugin" ; + rdfs:comment "A plugin that mixes some number of inputs into some number of outputs." . + +lv2:SimulatorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Simulator Plugin" ; + rdfs:comment "A plugin that aims to emulate some environmental effect or musical equipment." . + +lv2:DelayPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Delay Plugin" ; + rdfs:comment "An effect that intentionally delays its input as an effect." . + +lv2:ModulatorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Modulator Plugin" ; + rdfs:comment "An effect that modulats its input as an effect." . + +lv2:ReverbPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin , + lv2:SimulatorPlugin , + lv2:DelayPlugin ; + rdfs:label "Reverb Plugin" ; + rdfs:comment "An effect that adds reverberation to its input." . + +lv2:PhaserPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Phaser Plugin" ; + rdfs:comment "An effect that periodically sweeps a filter over its input." . + +lv2:FlangerPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Flanger Plugin" ; + rdfs:comment "An effect that mixes slightly delayed copies of its input." . + +lv2:ChorusPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:ModulatorPlugin ; + rdfs:label "Chorus Plugin" ; + rdfs:comment "An effect that mixes significantly delayed copies of its input." . + +lv2:FilterPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Filter Plugin" ; + rdfs:comment "An effect that manipulates the frequency spectrum of its input." . + +lv2:LowpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Lowpass Filter Plugin" ; + rdfs:comment "A filter that attenuates frequencies above some cutoff." . + +lv2:BandpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Bandpass Filter Plugin" ; + rdfs:comment "A filter that attenuates frequencies outside of some band." . + +lv2:HighpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Highpass Filter Plugin" ; + rdfs:comment "A filter that attenuates frequencies below some cutoff." . + +lv2:CombPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Comb FilterPlugin" ; + rdfs:comment "A filter that adds a delayed version of its input to itself." . + +lv2:AllpassPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Allpass Plugin" ; + rdfs:comment "A filter that changes the phase relationship between frequency components." . + +lv2:EQPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:FilterPlugin ; + rdfs:label "Equaliser Plugin" ; + rdfs:comment "A plugin that adjusts the balance between frequency components." . + +lv2:ParaEQPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:EQPlugin ; + rdfs:label "Parametric EQ Plugin" ; + rdfs:comment "A plugin that adjusts the balance between configurable frequency components." . + +lv2:MultiEQPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:EQPlugin ; + rdfs:label "Multiband EQ Plugin" ; + rdfs:comment "A plugin that adjusts the balance between a fixed set of frequency components." . + +lv2:SpatialPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Spatial Plugin" ; + rdfs:comment "A plugin that manipulates the position of audio in space." . + +lv2:SpectralPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Spectral Plugin" ; + rdfs:comment "A plugin that alters the spectral properties of audio." . + +lv2:PitchPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:SpectralPlugin ; + rdfs:label "Pitch Shifter Plugin" ; + rdfs:comment "A plugin that shifts the pitch of its input." . + +lv2:AmplifierPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Amplifier Plugin" ; + rdfs:comment "A plugin that primarily changes the volume of its input." . + +lv2:EnvelopePlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Envelope Plugin" ; + rdfs:comment "A plugin that applies an envelope to its input." . + +lv2:DistortionPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Distortion Plugin" ; + rdfs:comment "A plugin that adds distortion to its input." . + +lv2:WaveshaperPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DistortionPlugin ; + rdfs:label "Waveshaper Plugin" ; + rdfs:comment "An effect that alters t)lv2ttl" R"lv2ttl(he shape of input waveforms." . + +lv2:DynamicsPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "Dynamics Plugin" ; + rdfs:comment "A plugin that alters the envelope or dynamic range of its input." . + +lv2:CompressorPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Compressor Plugin" ; + rdfs:comment "A plugin that reduces the dynamic range of its input." . + +lv2:ExpanderPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Expander Plugin" ; + rdfs:comment "A plugin that expands the dynamic range of its input." . + +lv2:LimiterPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Limiter Plugin" ; + rdfs:comment "A plugin that limits its input to some maximum level." . + +lv2:GatePlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:DynamicsPlugin ; + rdfs:label "Gate Plugin" ; + rdfs:comment "A plugin that attenuates signals below some threshold." . + +lv2:FunctionPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:UtilityPlugin ; + rdfs:label "Function Plugin" ; + rdfs:comment "A plugin whose output is a mathmatical function of its input." . + +lv2:ConstantPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:GeneratorPlugin ; + rdfs:label "Constant Plugin" ; + rdfs:comment "A plugin that emits constant values." . + +lv2:MIDIPlugin + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Plugin ; + rdfs:label "MIDI Plugin" ; + rdfs:comment "A plugin that primarily processes MIDI messages." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"port-props", +{ +juce::lv2::BundleResource +{ +"port-props.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix pprops: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Port Properties" ; + rdfs:comment "Various properties for LV2 plugin ports." ; + rdfs:seeAlso . + +pprops:trigger + a lv2:PortProperty ; + rdfs:label "trigger" ; + rdfs:comment "Port is a momentary trigger." . + +pprops:supportsStrictBounds + a lv2:Feature ; + rdfs:label "supports strict bounds" ; + rdfs:comment "A feature indicating plugin support for strict port bounds." . + +pprops:hasStrictBounds + a lv2:PortProperty ; + rdfs:label "has strict bounds" ; + rdfs:comment "Port has strict bounds which are not internally clamped." . + +pprops:expensive + a lv2:PortProperty ; + rdfs:label "changes are expensive" ; + rdfs:comment "Input port is expensive to change." . + +pprops:causesArtifacts + a lv2:PortProperty ; + rdfs:label "changes cause artifacts" ; + rdfs:comment "Input port causes audible artifacts when changed." . + +pprops:continuousCV + a lv2:PortProperty ; + rdfs:label "smooth modulation signal" ; + rdfs:comment "Port carries a smooth modulation signal." . + +pprops:discreteCV + a lv2:PortProperty ; + rdfs:label "discrete modulation signal" ; + rdfs:comment "Port carries a discrete modulation signal." . + +pprops:logarithmic + a lv2:PortProperty ; + rdfs:label "logarithmic" ; + rdfs:comment "Port value is logarithmic." . + +pprops:notAutomatic + a lv2:PortProperty ; + rdfs:label "not automatic" ; + rdfs:comment "Port that is not intended to be fed with a modulation signal." . + +pprops:notOnGUI + a lv2:PortProperty ; + rdfs:label "not on GUI" ; + rdfs:comment "Port that should not be displayed on a GUI." . + +pprops:displayPriority + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "display priority" ; + rdfs:comment "A priority ranking this port in importance to its plugin." . + +pprops:rangeSteps + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain lv2:Port ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "range steps" ; + rdfs:comment "The number of even steps the range should be divided into." . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 2 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"port-props.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix pprops: . +@prefix rdf: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Port Properties" ; + doap:created "2009-01-01" ; + doap:shortdesc "Various properties for LV2 plugin ports." ; + doap:maintainer ; + doap:developer ; + doap:release [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This vocabulary defines various properties for plugin ports, which can be used +to better describe how a plugin can be controlled. Using this metadata, hosts +can build better UIs for plugins, and provide more advanced automatic +functionality. + +"""^^lv2:Markdown . + +pprops:trigger + lv2:documentation """ + +Indicates that the data item corresponds to a momentary event that has been +detected (control output ports) or is to be triggered (control input ports). +For input ports, the port needs to be reset to lv2:default value after run() +function of the plugin has returned. If the control port is assigned a GUI +widget by the host, the widget should be of auto-off (momentary, one-shot) type +- for example, a push button if the port is also declared as lv2:toggled, or a +series of push button or auto-clear input box with a "Send" button if the port +is also lv2:integer. + +"""^^lv2:Markdown . + +pprops:supportsStrictBounds + lv2:documentation """ + +Indicates use of host support for pprops:hasStrictBounds port property. A +plugin that specifies it as optional feature can omit value clamping for +hasStrictBounds ports, if the feature is supported by the host. When specified +as required feature, it indicates that the plugin does not do any clamping for +input ports that have a pprops:hasStrictBounds property. + +"""^^lv2:Markdown . + +pprops:hasStrictBounds + lv2:documentation """ + +For hosts that support pprops:supportsStrictBounds, this indicates that the +value of the port should never exceed the port's minimum and maximum control +points. For input ports, it moves the responsibility for limiting the range of +values to host, if it supports pprops:supportsStrictBounds. For output ports, +it indicates that values within specified range are to be expected, and +breaking that should be considered by the host as error in plugin +implementation. + +"""^^lv2:Markdown . + +pprops:expensive + lv2:documentation """ + +Input ports only. Indicates that any changes to the port value may trigger +expensive background calculation (for example, regeneration of lookup tables in +a background thread). Any value changes may have not have immediate effect, or +may cause silence or diminished-quality version of the output until background +processing is finished. Ports having this property are typically not well +suited for connection to outputs of other plugins, and should not be offered as +connection targets or for automation by default. + +"""^^lv2:Markdown . + +pprops:causesArtifacts + lv2:documentation """ + +Input ports only. Indicates that any changes to the port value may produce +slight artifacts to produced audio signals (zipper noise and other results of +signal discontinuities). Connecting ports of this type to continuous signals +is not recommended, and when presenting a list of automation targets, those +ports may be marked as artifact-producing. + +"""^^lv2:Markdown . + +pprops:continuousCV + lv2:documentation """ + +Indicates that the port carries a "smooth" modulation signal. Control input +ports of this type are well-suited for being connected to sources of smooth +signals (knobs with smoothing, modulation rate oscillators, output ports with +continuousCV type, etc.). Typically, the plugin with ports which have this +property will implement appropriate smoothing to avoid audio artifacts. For +output ports, this property suggests the value of the port is likely to change +frequently, and describes a smooth signal (so successive values may be +considered points along a curve). + +"""^^lv2:Markdown . + +pprops:discreteCV + lv2:documentation """ + +Indicates that the port carries a "discrete" modulation signal. Input ports of +this type are well-suited for being connected to sources of discrete signals +(switches, buttons, classifiers, event detectors, etc.). May be combined with +pprops:trigger property. For output ports, this property suggests the value of +the port describe discrete values that should be interpreted as steps (and not +points along a curve). + +"""^^lv2:Markdown . + +pprops:logarithmic + lv2:documentation """ + +Indicates that port value behaviour within specified range (bounds) is a value +using logarithmic scale. The lower and upper bounds must be specified, and +must be of the same sign. + +"""^^lv2:Markdown . + +pprops:notAutomatic + lv2:documentation """ + +Indicates that the port is not primarily intended to be fed with modulation +signals from external sources (other plugins, etc.). It is merely a UI hint +and hosts may allow the user to override it. + +"""^^lv2:Markdown . + +pprops:notOnGUI + lv2:documentation """ + +Indicates that the port is not primarily intended to be represented by a +separate control in the user interface window (or any similar mechanism used +for direct, immediate control of control ports). It is merely a UI hint and +hosts may allow the user to override it. + +"""^^lv2:Markdown . + +pprops:displayPriority + lv2:documentation """ + +Indicates how important a port is to controlling the plugin. If a host can +only display some ports of a plugin, it should prefer ports with a higher +display priority. Priorities do not need to be unique, and are only meaningful +when compared to each other. + +"""^^lv2:Markdown . + +pprops:rangeSteps + lv2:documentation """ + +This value indicates into how many evenly-divided points the (control) port +range should be divided for step-wise control. This may be used for changing +the value with step-based controllers like arrow keys, mouse wheel, rotary +encoders, and so on. + +Note that when used with a pprops:logarithmic port, the steps are logarithmic +too, and port value can be calculated as: + + :::c + value = lower * pow(upper / lower, step / (steps - 1)) + +and the step from value is: + + :::c + step = (steps - 1) * log(value / lower) / log(upper / lower) + +where: + + * `value` is the port value. + + * `step` is the step number (0..steps). + + * `steps` is the number of steps (= value of :rangeSteps property). + + * `lower` and upper are the bounds. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"midi", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 10 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"midi.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix midi: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 MIDI" ; + doap:shortdesc "A normalised definition of raw MIDI." ; + doap:maintainer ; + doap:created "2006-00-00" ; + doap:developer , + ; + doap:release [ + doap:revision "1.10" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect range of midi:chunk." + ] + ] + ] , [ + doap:revision "1.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add midi:binding and midi:channel predicates." + ] , [ + rdfs:label "Add midi:HexByte datatype for status bytes and masks." + ] , [ + rdfs:label "Remove non-standard midi:Tick message type." + ] , [ + rdfs:label "Add C definitions for message types and standard controllers." + ] , [ + rdfs:label "Fix definition of SystemExclusive status byte." + ] + ] + ] , [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add class definitions for various message types." + ] , [ + rdfs:label "Document how to serialise a MidiEvent to a string." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This specification defines a data type for a MIDI message, midi:MidiEvent, +which is normalised for fast and convenient real-time processing. MIDI is the +Musical Instrument Digital Interface, a ubiquitous binary standard for +controlling digital music devices. + +For plugins that process MIDI (or other situations where MIDI is sent via a +generic transport) the main type defined here, midi:MidiEvent, can be mapped to +an integer and used as the type of an LV2 [Atom](atom.html#Atom) or +[Event](event.html#Event). + +This specification also defines a complete vocabulary for the MIDI standard, +except for standard controller numbers. These descriptions are detailed enough +to express any MIDI message as properties. + +"""^^lv2:Markdown . + +midi:MidiEvent + lv2:documentation """ + +A single raw MIDI message (a sequence of bytes). + +This is equivalent to a standard MIDI messages, except with the following +restrictions to simplify handling: + + * Running status is not allowed, every message must have its own status byte. + + * Note On messages with velocity 0 are not allowed. These messages are + equivalent to Note Off in standard MIDI streams, but here only proper Note + Off messages are allowed. + + * "Realtime messages" (status bytes 0xF8 to 0xFF) are allowed, but may not + occur inside other messages like they can in standard MIDI streams. + + * All messages are complete valid MIDI messages. This means, for example, + that only the first byte in each event (the status byte) may have the + eighth bit set, that Note On and Note Off events are always 3 bytes long, + etc. + +Where messages are communicated, the writer is responsible for writing valid +messages, and the reader may assume that all events are valid. + +If a midi:MidiEvent is serialised to a string, the format should be +xsd:hexBinary, for example: + + :::turtle + [] eg:someEvent "901A01"^^midi:MidiEvent . + +"""^^lv2:Markdown . + +midi:statusMask + lv2:documentation """ + +This is a status byte with the lower nibble set to zero. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"midi.ttl", +R"lv2ttl(@prefix atom: . +@prefix ev: . +@prefix lv2: . +@prefix midi: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 MIDI" ; + rdfs:comment "A normalised definition of raw MIDI." ; + rdfs:seeAlso , + . + +midi:ActiveSense + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Active Sense" ; + rdfs:comment "MIDI active sense message." ; + midi:status "FE"^^xsd:hexBinary . + +midi:Aftertouch + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Aftertouch" ; + rdfs:comment "MIDI aftertouch message." ; + midi:statusMask "A0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:noteNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:pressure + ] . + +midi:Bender + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Bender" ; + rdfs:comment "MIDI bender message." ; + midi:statusMask "E0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 , + 1 ; + midi:property midi:benderValue + ] . + +midi:ChannelPressure + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Channel Pressure" ; + rdfs:comment "MIDI channel pressure message." ; + midi:statusMask "D0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:pressure + ] . + +midi:Chunk + a rdfs:Class ; + rdfs:label "Chunk" ; + rdfs:comment "A sequence of contiguous bytes in a MIDI message." . + +midi:Clock + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Clock" ; + rdfs:comment "MIDI clock message." ; + midi:status "F8"^^xsd:hexBinary . + +midi:Continue + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Continue" ; + rdfs:comment "MIDI continue message." ; + midi:status "FB"^^xsd:hexBinary . + +midi:Controller + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Controller" ; + rdfs:comment "MIDI controller change message." ; + midi:statusMask "B0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:controllerNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:controllerValue + ] . + +midi:HexByte + a rdfs:Datatype ; + owl:onDatatype xsd:hexBinary ; + owl:withRestrictions ( + [ + xsd:maxInclusive "FF" + ] + ) ; + rdfs:label "Hex Byte" ; + rdfs:comment "A hexadecimal byte, which has a value <= FF." . + +midi:MidiEvent + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf ev:Event , + atom:Atom ; + owl:onDatatype xsd:hexBinary ; + rdfs:label "MIDI Message" ; + rdfs:comment "A single raw MIDI message." . + +midi:NoteOff + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Note Off" ; + rdfs:comment "MIDI note off message." ; + midi:statusMask "80"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:noteNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:velocity + ] . + +midi:NoteOn + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Note On" ; + rdfs:comment "MIDI note on message." ; + midi:statusMask "90"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:noteNumber + ] , [ + midi:byteNumber 1 ; + midi:property midi:velocity + ] . + +midi:ProgramChange + a rdfs:Class ; + rdfs:subClassOf midi:VoiceMessage ; + rdfs:label "Program Change" ; + rdfs:comment "MIDI program change message." ; + midi:statusMask "C0"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 ; + midi:property midi:programNumber + ] . + +midi:QuarterFrame + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Quarter Frame" ; + rdfs:comment "MIDI quarter frame message." ; + midi:status "F1"^^xsd:hexBinary . + +midi:Reset + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Reset" ; + rdfs:comment "MIDI reset message." ; + midi:status "FF"^^xsd:hexBinary . + +midi:SongPosition + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Song Position" ; + rdfs:comment "MIDI song position pointer message." ; + midi:status "F2"^^xsd:hexBinary ; + midi:chunk [ + midi:byteNumber 0 , + 1 ; + midi:property midi:songPosition + ] . + +midi:SongSelect + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Song Select" ; + rdfs:comment "MIDI song select message." ; + midi:status "F3"^^xsd:hexBinary . + +midi:Start + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Start" ; + rdfs:comment "MIDI start message." ; + midi:status "FA"^^xsd:hexBinary . + +midi:Stop + a rdfs:Class ; + rdfs:subClassOf midi:SystemRealtime ; + rdfs:label "Stop" ; + rdfs:comment "MIDI stop message." ; + midi:status "FC"^^xsd:hexBinary . + +midi:SystemCommon + a rdfs:Class ; + rdfs:subClassOf midi:SystemMessage ; + rdfs:label "System Common" ; + rdfs:comment "MIDI system common message." . + +midi:SystemExclusive + a rdfs:Class ; + rdfs:subClassOf midi:SystemMessage ; + rdfs:label "System Exclusive" ; + rdfs:comment "MIDI system exclusive message." ; + midi:status "F0"^^xsd:hexBinary . + +midi:SystemMessage + a rdfs:Class ; + rdfs:subClassOf midi:MidiEvent ; + rdfs:label "System Message" ; + rdfs:comment "MIDI system message." ; + midi:statusMask "F0"^^xsd:hexBinary . + +midi:SystemRealtime + a rdfs:Class ; + rdfs:subClassOf midi:SystemMessage ; + rdfs:label "System Realtime" ; + rdfs:comment "MIDI system realtime message." . + +midi:TuneRequest + a rdfs:Class ; + rdfs:subClassOf midi:SystemCommon ; + rdfs:label "Tune Request" ; + rdfs:comment "MIDI tune request message." ; + midi:status "F6"^^xsd:hexBinary . + +midi:VoiceMessage + a rdfs:Class ; + rdfs:subClassOf midi:MidiEvent ; + rdfs:label "Voice Message" ; + rdfs:comment "MIDI voice message." ; + midi:statusMask "F0"^^xsd:hexBinary . + +midi:benderValue + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "bender value" ; + rdfs:range xsd:short ; + rdfs:comment "MIDI pitch bender message (-8192 to 8192)." . + +midi:binding + a rdf:Property , + owl:ObjectProperty ; + rdfs:range midi:MidiEvent ; + rdfs:label "binding" ; + rdfs:comment "The MIDI event to bind a parameter to." . + +midi:byteNumber + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "byte number" ; + rdfs:domain midi:Chunk ; + rdfs:range xsd:unsignedByte ; + rdfs:comment "The 0-based index of a byte which is part of this chunk." . + +midi:channel + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "MIDI channel" ; + rdfs:range xsd:unsignedByte ; + rdfs:comment "The channel number of a MIDI message." . + +midi:chunk + a rdf:Property , + owl:ObjectProperty ; + rdfs:range midi:Chunk ; + rdfs:label "MIDI chunk" ; + rdfs:comment "A chunk of a MIDI message." . + +midi:controllerNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "MIDI controller number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a controller (0 to 127)." . + +midi:controllerValue + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "MIDI controller value" ; + rdfs:range xsd:byte ; + rdfs:comment "The value of a controller (0 to 127)." . + +midi:noteNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "note number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a note (0 to 127)." . + +midi:pressure + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "key pressure" ; + rdfs:range xsd:byte ; + rdfs:comment "Key pressure (0 to 127)." . + +midi:programNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "program number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a program (0 to 127)." . + +midi:property + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:label "property" ; + rdfs:domain midi:Chunk ; + rdfs:range rdf:Property ; + rdfs:comment "The property this chunk represents." . + +midi:songNumber + a rdf:Property , + owl:)lv2ttl" R"lv2ttl(DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "song number" ; + rdfs:range xsd:byte ; + rdfs:comment "The numeric ID of a song (0 to 127)." . + +midi:songPosition + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "song position" ; + rdfs:range xsd:short ; + rdfs:comment "Song position in MIDI beats (16th notes) (-8192 to 8192)." . + +midi:status + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "status byte" ; + rdfs:range midi:HexByte ; + rdfs:comment "The exact status byte for a message of this type." . + +midi:statusMask + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "status mask" ; + rdfs:range midi:HexByte ; + rdfs:comment "The status byte for a message of this type on channel 1." . + +midi:velocity + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "velocity" ; + rdfs:range midi:HexByte ; + rdfs:comment "The velocity of a note message (0 to 127)." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"atom", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 2 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"atom.meta.ttl", +R"lv2ttl(@prefix atom: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Atom" ; + doap:shortdesc "A generic value container and several data types." ; + doap:license ; + doap:created "2007-00-00" ; + doap:developer ; + doap:release [ + doap:revision "2.2" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2_atom_object_get_typed() for easy type-safe access to object properties." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Deprecate Blank and Resource in favour of just Object." + ] , [ + rdfs:label "Add lv2_atom_forge_is_object_type() and lv2_atom_forge_is_blank() to ease backwards compatibility." + ] , [ + rdfs:label "Add lv2_atom_forge_key() for terser object writing." + ] , [ + rdfs:label "Add lv2_atom_sequence_clear() and lv2_atom_sequence_append_event() helper functions." + ] + ] + ] , [ + doap:revision "1.8" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make lv2_atom_*_is_end() arguments const." + ] + ] + ] , [ + doap:revision "1.6" ; + doap:created "2013-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix crash in forge.h when pushing atoms to a full buffer." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2013-01-27" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix lv2_atom_sequence_end()." + ] , [ + rdfs:label "Remove atom:stringType in favour of owl:onDatatype so generic tools can understand and validate atom literals." + ] , [ + rdfs:label "Improve atom documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix implicit conversions in forge.h that are invalid in C++11." + ] , [ + rdfs:label "Fix lv2_atom_object_next() on 32-bit platforms." + ] , [ + rdfs:label "Add lv2_atom_object_body_get()." + ] , [ + rdfs:label "Fix outdated documentation in forge.h." + ] , [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add LV2_ATOM_CONTENTS_CONST and LV2_ATOM_BODY_CONST." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +An atom:Atom is a simple generic data container for holding any type of Plain +Old Data (POD). An Atom can contain simple primitive types like integers, +floating point numbers, and strings; as well as structured data like lists and +dictionary-like Objects. Since Atoms are POD, they can be easily copied +(for example, with `memcpy()`) anywhere and are suitable for use in real-time +code. + +Every atom starts with an LV2_Atom header, followed by the contents. This +allows code to process atoms without requiring special code for every type of +data. For example, plugins that mutually understand a type can be used +together in a host that does not understand that type, because the host is only +required to copy atoms, not interpret their contents. Similarly, plugins (such +as routers, delays, or data structures) can meaningfully process atoms of a +type unknown to them. + +Atoms should be used anywhere values of various types must be stored or +transmitted. An atom:AtomPort can be used to transmit atoms via ports. An +atom:AtomPort that contains a atom:Sequence can be used for sample accurate +communication of events, such as MIDI. + +### Serialisation + +Each Atom type defines a binary format for use at runtime, but also a +serialisation that is natural to express in Turtle format. Thus, this +specification defines a powerful real-time appropriate data model, as well as a +portable way to serialise any data in that model. This is particularly useful +for inter-process communication, saving/restoring state, and describing values +in plugin data files. + +### Custom Atom Types + +While it is possible to define new Atom types for any binary format, the +standard types defined here are powerful enough to describe almost anything. +Implementations SHOULD build structures out of the types provided here, rather +than define new binary formats (for example, using atom:Object rather than a +new C `struct` type). Host and tool implementations have support for +serialising all standard types, so new binary formats are an implementation +burden which harms interoperabilty. In particular, plugins SHOULD NOT expect +UI communication or state saving with custom binary types to work. In general, +new Atom types should only be defined where absolutely necessary due to +performance reasons and serialisation is not a concern. + +"""^^lv2:Markdown . + +atom:Atom + lv2:documentation """ + +An LV2_Atom has a 32-bit `size` and `type`, followed by a body of `size` bytes. +Atoms MUST be 64-bit aligned. + +All concrete Atom types (subclasses of this class) MUST define a precise binary +layout for their body. + +The `type` field is the URI of an Atom type mapped to an integer. +Implementations SHOULD gracefully pass through, or ignore, atoms with unknown +types. + +All atoms are POD by definition except references, which as a special case have +`type` 0. An Atom MUST NOT contain a Reference. It is safe to copy any +non-reference Atom with a simple `memcpy`, even if the implementation does not +understand `type`. Though this extension reserves the type 0 for references, +the details of reference handling are currently unspecified. A future revision +of this extension, or a different extension, may define how to use non-POD data +and references. Implementations MUST NOT send references to another +implementation unless the receiver is explicitly known to support references +(e.g. by supporting a feature). + +The special case of a null atom with both `type` and `size` 0 is not considered +a reference. + +"""^^lv2:Markdown . + +atom:Chunk + lv2:documentation """ + +This type is used to indicate a certain amount of space is available. For +example, output ports with a variably sized type are connected to a Chunk so +the plugin knows the size of the buffer available for writing. + +The use of a Chunk should be constrained to a local scope, since +interpreting it is impossible without context. However, if serialised to RDF, +a Chunk may be represented directly as an xsd:base64Binary string, for example: + + :::turtle + [] eg:someChunk "vu/erQ=="^^xsd:base64Binary . + +"""^^lv2:Markdown . + +atom:String + lv2:documentation """ + +The body of an LV2_Atom_String is a C string in UTF-8 encoding, i.e. an array +of bytes (`uint8_t`) terminated with a NULL byte (`'\\0'`). + +This type is for free-form strings, but SHOULD NOT be used for typed data or +text in any language. Use atom:Literal unless translating the string does not +make sense and the string has no meaningful datatype. + +"""^^lv2:Markdown . + +atom:Literal + lv2:documentation """ + +This type is compatible with rdfs:Literal and is capable of )lv2ttl" R"lv2ttl(expressing a +string in any language or a value of any type. A Literal has a +`datatype` and `lang` followed by string data in UTF-8 +encoding. The length of the string data in bytes is `size - +sizeof(LV2_Atom_Literal)`, including the terminating NULL character. The +`lang` field SHOULD be a URI of the form +`http://lexvo.org/id/iso639-3/LANG` or +`http://lexvo.org/id/iso639-1/LANG` where LANG is a 3-character ISO 693-3 +language code, or a 2-character ISO 693-1 language code, respectively. + +A Literal may have a `datatype` or a `lang`, but never both. + +For example, a Literal can be Hello in English: + + :::c + void set_to_hello_in_english(LV2_Atom_Literal* lit) { + lit->atom.type = map(expand("atom:Literal")); + lit->atom.size = 14; + lit->body.datatype = 0; + lit->body.lang = map("http://lexvo.org/id/iso639-1/en"); + memcpy(LV2_ATOM_CONTENTS(LV2_Atom_Literal, lit), + "Hello", + sizeof("Hello")); // Assumes enough space + } + +or a Turtle string: + + :::c + void set_to_turtle_string(LV2_Atom_Literal* lit, const char* ttl) { + lit->atom.type = map(expand("atom:Literal")); + lit->atom.size = 64; + lit->body.datatype = map("http://www.w3.org/2008/turtle#turtle"); + lit->body.lang = 0; + memcpy(LV2_ATOM_CONTENTS(LV2_Atom_Literal, lit), + ttl, + strlen(ttl) + 1); // Assumes enough space + } + +"""^^lv2:Markdown . + +atom:Path + lv2:documentation """ + +A Path is a URI reference with only a path component: no scheme, authority, +query, or fragment. In particular, paths to files in the same bundle may be +cleanly written in Turtle files as a relative URI. However, implementations +may assume any binary Path (e.g. in an event payload) is a valid file path +which can passed to system functions like fopen() directly, without any +character encoding or escape expansion required. + +Any implemenation that creates a Path atom to transmit to another is +responsible for ensuring it is valid. A Path SHOULD always be absolute, unless +there is some mechanism in place that defines a base path. Since this is not +the case for plugin instances, effectively any Path sent to or received from a +plugin instance MUST be absolute. + +"""^^lv2:Markdown . + +atom:URI + lv2:documentation """ + +This is useful when a URI is needed but mapping is inappropriate, for example +with temporary or relative URIs. Since the ability to distinguish URIs from +plain strings is often necessary, URIs MUST NOT be transmitted as atom:String. + +This is not strictly a URI, since UTF-8 is allowed. Escaping and related +issues are the host's responsibility. + +"""^^lv2:Markdown . + +atom:URID + lv2:documentation """ + +A URID is typically generated with the LV2_URID_Map provided by the host . + +"""^^lv2:Markdown . + +atom:Vector + lv2:documentation """ + +A homogeneous series of atom bodies with equivalent type and size. + +An LV2_Atom_Vector is a 32-bit `child_size` and `child_type` followed by `size +/ child_size` atom bodies. + +For example, an atom:Vector containing 42 elements of type atom:Float: + + :::c + struct VectorOf42Floats { + uint32_t size; // sizeof(LV2_Atom_Vector_Body) + (42 * sizeof(float); + uint32_t type; // map(expand("atom:Vector")) + uint32_t child_size; // sizeof(float) + uint32_t child_type; // map(expand("atom:Float")) + float elems[42]; + }; + +Note that it is possible to construct a valid Atom for each element of the +vector, even by an implementation which does not understand `child_type`. + +If serialised to RDF, a Vector SHOULD have the form: + + :::turtle + eg:someVector + a atom:Vector ; + atom:childType atom:Int ; + rdf:value ( + "1"^^xsd:int + "2"^^xsd:int + "3"^^xsd:int + "4"^^xsd:int + ) . + +"""^^lv2:Markdown . + +atom:Tuple + lv2:documentation """ + +The body of a Tuple is simply a series of complete atoms, each aligned to +64 bits. + +If serialised to RDF, a Tuple SHOULD have the form: + + :::turtle + eg:someVector + a atom:Tuple ; + rdf:value ( + "1"^^xsd:int + "3.5"^^xsd:float + "etc" + ) . + +"""^^lv2:Markdown . + +atom:Property + lv2:documentation """ + +An LV2_Atom_Property has a URID `key` and `context`, and an Atom `value`. This +corresponds to an RDF Property, where the key is the predicate +and the value is the object. + +The `context` field can be used to specify a different context for each +property, where this is useful. Otherwise, it may be 0. + +Properties generally only exist as part of an atom:Object. Accordingly, +they will typically be represented directly as properties in RDF (see +atom:Object). If this is not possible, they may be expressed as partial +reified statements, for example: + + :::turtle + eg:someProperty + rdf:predicate eg:theKey ; + rdf:object eg:theValue . + +"""^^lv2:Markdown . + +atom:Object + lv2:documentation """ + +An Object is an atom with a set of properties. This corresponds to an +RDF Resource, and can be thought of as a dictionary with URID keys. + +An LV2_Atom_Object body has a uint32_t `id` and `type`, followed by a series of +atom:Property bodies (LV2_Atom_Property_Body). The LV2_Atom_Object_Body::otype +field is equivalent to a property with key rdf:type, but is included in the +structure to allow for fast dispatching. + +Code SHOULD check for objects using lv2_atom_forge_is_object() or +lv2_atom_forge_is_blank() if a forge is available, rather than checking the +atom type directly. This will correctly handle the deprecated atom:Resource +and atom:Blank types. + +When serialised to RDF, an Object is represented as a resource, for example: + + :::turtle + eg:someObject + eg:firstPropertyKey "first property value" ; + eg:secondPropertyKey "first loser" ; + eg:andSoOn "and so on" . + +"""^^lv2:Markdown . + +atom:Resource + lv2:documentation """ + +This class is deprecated. Use atom:Object directly instead. + +An atom:Object where the id field is a URID, that is, an Object +with a URI. + +"""^^lv2:Markdown . + +atom:Blank + lv2:documentation """ + +This class is deprecated. Use atom:Object with ID 0 instead. + +An atom:Object where the LV2_Atom_Object::id is a blank node ID (NOT a URI). +The ID of a Blank is valid only within the context the Blank appears in. For +ports this is the context of the associated run() call, i.e. all ports share +the same context so outputs can contain IDs that correspond to IDs of blanks in +the input. + +"""^^lv2:Markdown . + +atom:Sound + lv2:documentation """ + +The format of a atom:Sound is the same as the buffer format for lv2:AudioPort +(except the size may be arbitrary). An atom:Sound inherently depends on the +sample rate, which is assumed to be known from context. Because of this, +directly serialising an atom:Sound is probably a bad idea, use a standard +format like WAV instead. + +"""^^lv2:Markdown . + +atom:Event + lv2:documentation """ + +An Event is typically an element of an atom:Sequence. Note that this is not an Atom type since it begins with a timestamp, not an atom header. + +"""^^lv2:Markdown . + +atom:Sequence + lv2:documentation """ + +A flat sequence of atom:Event, that is, a series of time-stamped Atoms. + +LV2_Atom_Sequence_Body.unit describes the time unit for the contained atoms. +If the unit is known from context (e.g. run() stamps are always audio frames), +this field may be zero. Otherwise, it SHOULD be either units:frame or +units:beat, in which case ev.time.frames or ev.time.beats is valid, +respectively. + +If serialised to RDF, a Sequence has a similar form to atom:Vector, but for +brevity the elements may be assumed to be atom:Event, for example: + + :::turtle + eg:someSequence + a atom:Sequence ; + rdf:value ( + [ + atom:frameTime 1 ; + rdf:value "901A01"^^midi:MidiEvent + ] [ + atom:frame)lv2ttl" R"lv2ttl(Time 3 ; + rdf:value "902B02"^^midi:MidiEvent + ] + ) . + +"""^^lv2:Markdown . + +atom:AtomPort + lv2:documentation """ + +Ports of this type are connected to an LV2_Atom with a type specified by +atom:bufferType. + +Output ports with a variably sized type MUST be initialised by the host before +every run() to an atom:Chunk with size set to the available space. The plugin +reads this size to know how much space is available for writing. In all cases, +the plugin MUST write a complete atom (including header) to outputs. However, +to be robust, hosts SHOULD initialise output ports to a safe sentinel (e.g. the +null Atom) before calling run(). + +"""^^lv2:Markdown . + +atom:bufferType + lv2:documentation """ + +Indicates that an AtomPort may be connected to a certain Atom type. A port MAY +support several buffer types. The host MUST NOT connect a port to an Atom with +a type not explicitly listed with this property. The value of this property +MUST be a sub-class of atom:Atom. For example, an input port that is connected +directly to an LV2_Atom_Double value is described like so: + + :::turtle + + lv2:port [ + a lv2:InputPort , atom:AtomPort ; + atom:bufferType atom:Double ; + ] . + +This property only describes the types a port may be directly connected to. It +says nothing about the expected contents of containers. For that, use +atom:supports. + +"""^^lv2:Markdown . + +atom:supports + lv2:documentation """ + +This property is defined loosely, it may be used to indicate that anything +supports an Atom type, wherever that may be useful. It applies +recursively where collections are involved. + +In particular, this property can be used to describe which event types are +expected by a port. For example, a port that receives MIDI events is described +like so: + + :::turtle + + lv2:port [ + a lv2:InputPort , atom:AtomPort ; + atom:bufferType atom:Sequence ; + atom:supports midi:MidiEvent ; + ] . + +"""^^lv2:Markdown . + +atom:eventTransfer + lv2:documentation """ + +Transfer of individual events in a port buffer. Useful as the `format` for a +LV2UI_Write_Function. + +This protocol applies to ports which contain events, usually in an +atom:Sequence. The host must transfer each individual event to the recipient. +The format of the received data is an LV2_Atom, there is no timestamp header. + +"""^^lv2:Markdown . + +atom:atomTransfer + lv2:documentation """ + +Transfer of the complete atom in a port buffer. Useful as the `format` for a +LV2UI_Write_Function. + +This protocol applies to atom ports. The host must transfer the complete atom +contained in the port, including header. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"atom.ttl", +R"lv2ttl(@prefix atom: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix ui: . +@prefix units: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:seeAlso , + , + , + ; + rdfs:label "LV2 Atom" ; + rdfs:comment "A generic value container and several data types." . + +atom:cType + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "C type" ; + rdfs:comment "The C type that describes the binary representation of an Atom type." ; + rdfs:domain rdfs:Class ; + rdfs:range lv2:Symbol . + +atom:Atom + a rdfs:Class ; + rdfs:label "Atom" ; + rdfs:comment "Abstract base class for all atoms." ; + atom:cType "LV2_Atom" . + +atom:Chunk + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Chunk" ; + rdfs:comment "A chunk of memory with undefined contents." ; + owl:onDatatype xsd:base64Binary . + +atom:Number + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Number" ; + rdfs:comment "Base class for numeric types." . + +atom:Int + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Int" ; + rdfs:comment "A native `int32_t`." ; + atom:cType "LV2_Atom_Int" ; + owl:onDatatype xsd:int . + +atom:Long + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Long" ; + rdfs:comment "A native `int64_t`." ; + atom:cType "LV2_Atom_Long" ; + owl:onDatatype xsd:long . + +atom:Float + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Float" ; + rdfs:comment "A native `float`." ; + atom:cType "LV2_Atom_Float" ; + owl:onDatatype xsd:float . + +atom:Double + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Number ; + rdfs:label "Double" ; + rdfs:comment "A native `double`." ; + atom:cType "LV2_Atom_Double" ; + owl:onDatatype xsd:double . + +atom:Bool + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Bool" ; + rdfs:comment "An atom:Int where 0 is false and any other value is true." ; + atom:cType "LV2_Atom_Bool" ; + owl:onDatatype xsd:boolean . + +atom:String + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:Atom ; + rdfs:label "String" ; + rdfs:comment "A UTF-8 string." ; + atom:cType "LV2_Atom_String" ; + owl:onDatatype xsd:string . + +atom:Literal + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Literal" ; + rdfs:comment "A UTF-8 string literal with optional datatype or language." ; + atom:cType "LV2_Atom_Literal" . + +atom:Path + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:URI ; + owl:onDatatype atom:URI ; + rdfs:label "Path" ; + rdfs:comment "A local file path." . + +atom:URI + a rdfs:Class , + rdfs:Datatype ; + rdfs:subClassOf atom:String ; + owl:onDatatype xsd:anyURI ; + rdfs:label "URI" ; + rdfs:comment "A URI string." . + +atom:URID + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "URID" ; + rdfs:comment "An unsigned 32-bit integer ID for a URI." ; + atom:cType "LV2_Atom_URID" . + +atom:Vector + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Vector" ; + rdfs:comment "A homogeneous sequence of atom bodies with equivalent type and size." ; + atom:cType "LV2_Atom_Vector" . + +atom:Tuple + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Tuple" ; + rdfs:comment "A sequence of atoms with varying type and size." . + +atom:Property + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Property" ; + rdfs:comment "A property of an atom:Object." ; + atom:cType "LV2_Atom_Property" . + +atom:Object + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Object" ; + rdfs:comment "A collection of properties." ; + atom:cType "LV2_Atom_Object" . + +atom:Resource + a rdfs:Class ; + rdfs:subClassOf atom:Object ; + rdfs:label "Resource" ; + rdfs:comment "A named collection of properties with a URI." ; + owl:deprecated "true"^^xsd:boolean ; + atom:cType "LV2_Atom_Object" . + +atom:Blank + a rdfs:Class ; + rdfs:subClassOf atom:Object ; + rdfs:label "Blank" ; + rdfs:comment "An anonymous collection of properties without a URI." ; + owl:deprecated "true"^^xsd:boolean ; + atom:cType "LV2_Atom_Object" . + +atom:Sound + a rdfs:Class ; + rdfs:subClassOf atom:Vector ; + rdfs:label "Sound" ; + rdfs:comment "A atom:Vector of atom:Float which represents an audio waveform." ; + atom:cType "LV2_Atom_Vector" . + +atom:frameTime + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:range xsd:decimal ; + rdfs:label "frame time" ; + rdfs:comment "A time stamp in audio frames." . + +atom:beatTime + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:range xsd:decimal ; + rdfs:label "beat time" ; + rdfs:comment "A time stamp in beats." . + +atom:Event + a rdfs:Class ; + rdfs:label "Event" ; + atom:cType "LV2_Atom_Event" ; + rdfs:comment "An atom with a time stamp prefix in a sequence." . + +atom:Sequence + a rdfs:Class ; + rdfs:subClassOf atom:Atom ; + rdfs:label "Sequence" ; + atom:cType "LV2_Atom_Sequence" ; + rdfs:comment "A sequence of events." . + +atom:AtomPort + a rdfs:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Atom Port" ; + rdfs:comment "A port which contains an atom:Atom." . + +atom:bufferType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain atom:AtomPort ; + rdfs:range rdfs:Class ; + rdfs:label "buffer type" ; + rdfs:comment "An atom type that a port may be connected to." . + +atom:childType + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "child type" ; + rdfs:comment "The type of children in a container." . + +atom:supports + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "supports" ; + rdfs:comment "A supported atom type." ; + rdfs:range rdfs:Class . + +atom:eventTransfer + a ui:PortProtocol ; + rdfs:label "event transfer" ; + rdfs:comment "A port protocol for transferring events." . + +atom:atomTransfer + a ui:PortProtocol ; + rdfs:label "atom transfer" ; + rdfs:comment "A port protocol for transferring atoms." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"buf-size", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"buf-size.meta.ttl", +R"lv2ttl(@prefix bufsz: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Buf Size" ; + doap:shortdesc "Access to, and restrictions on, buffer sizes." ; + doap:created "2012-08-07" ; + doap:developer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2015-09-18" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add bufsz:nominalBlockLength option." + ] , [ + rdfs:label "Add bufsz:coarseBlockLength feature." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-12-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix typo in bufsz:sequenceSize label." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a facility for plugins to get information about the +block length (the sample_count parameter of LV2_Descriptor::run) and port +buffer sizes, as well as several features which can be used to restrict the +block length. + +This extension defines features and properties but has no special purpose +API of its own. The host provides all the relevant information to the plugin +as [options](options.html). + +To require restrictions on the block length, plugins can require additional +features: bufsz:boundedBlockLength, bufsz:powerOf2BlockLength, and +bufsz:fixedBlockLength. These features are data-only, that is they merely +indicate a restriction and do not carry any data or API. + +"""^^lv2:Markdown . + +bufsz:boundedBlockLength + lv2:documentation """ + +A feature that indicates the host will provide both the bufsz:minBlockLength +and bufsz:maxBlockLength options to the plugin. Plugins that copy data from +audio inputs can require this feature to ensure they know how much space is +required for auxiliary buffers. Note the minimum may be zero, this feature is +mainly useful to ensure a maximum is available. + +All hosts SHOULD support this feature, since it is simple to support and +necessary for any plugins that may need to copy the input. + +"""^^lv2:Markdown . + +bufsz:fixedBlockLength + lv2:documentation """ + +A feature that indicates the host will always call LV2_Descriptor::run() with +the same value for sample_count. This length MUST be provided as the value of +both the bufsz:minBlockLength and bufsz:maxBlockLength options. + +Note that requiring this feature may severely limit the number of hosts capable +of running the plugin. + +"""^^lv2:Markdown . + +bufsz:powerOf2BlockLength + lv2:documentation """ + +A feature that indicates the host will always call LV2_Descriptor::run() with a +power of two sample_count. Note that this feature does not guarantee the value +is the same each call, to guarantee a fixed power of two block length plugins +must require both this feature and bufsz:fixedBlockLength. + +Note that requiring this feature may severely limit the number of hosts capable +of running the plugin. + +"""^^lv2:Markdown . + +bufsz:coarseBlockLength + lv2:documentation """ + +A feature that indicates the plugin prefers coarse, regular block lengths. For +example, plugins that do not implement sample-accurate control use this feature +to indicate that the host should not split the run cycle because controls have +changed. + +Note that this feature is merely a hint, and does not guarantee a fixed block +length. The run cycle may be split for other reasons, and the blocksize itself +may change anytime. + +"""^^lv2:Markdown . + +bufsz:maxBlockLength + lv2:documentation """ + +The maximum block length the host will ever request the plugin to process at +once, that is, the maximum `sample_count` parameter that will ever be passed to +LV2_Descriptor::run(). + +"""^^lv2:Markdown . + +bufsz:minBlockLength + lv2:documentation """ + +The minimum block length the host will ever request the plugin to process at +once, that is, the minimum `sample_count` parameter that will ever be passed to +LV2_Descriptor::run(). + +"""^^lv2:Markdown . + +bufsz:nominalBlockLength + lv2:documentation """ + +The typical block length the host will request the plugin to process at once, +that is, the typical `sample_count` parameter that will be passed to +LV2_Descriptor::run(). This will usually be equivalent, or close to, the +maximum block length, but there are no strong guarantees about this value +whatsoever. Plugins may use this length for optimization purposes, but MUST +NOT assume the host will always process blocks of this length. In particular, +the host MAY process longer blocks. + +"""^^lv2:Markdown . + +bufsz:sequenceSize + lv2:documentation """ + +This should be provided as an option by hosts that support event ports +(including but not limited to MIDI), so plugins have the ability to allocate +auxiliary buffers large enough to copy the input. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"buf-size.ttl", +R"lv2ttl(@prefix bufsz: . +@prefix lv2: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Buf Size" ; + rdfs:comment "Access to, and restrictions on, buffer sizes." ; + rdfs:seeAlso , + . + +bufsz:boundedBlockLength + a lv2:Feature ; + rdfs:label "bounded block length" ; + rdfs:comment "Block length has lower and upper bounds." . + +bufsz:fixedBlockLength + a lv2:Feature ; + rdfs:label "fixed block length" ; + rdfs:comment "Block length never changes." . + +bufsz:powerOf2BlockLength + a lv2:Feature ; + rdfs:label "power of 2 block length" ; + rdfs:comment "Block length is a power of 2." . + +bufsz:coarseBlockLength + a lv2:Feature ; + rdfs:label "coarse block length" ; + rdfs:comment "Plugin prefers coarse block length without buffer splitting." . + +bufsz:maxBlockLength + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "maximum block length" ; + rdfs:comment "Block length has an upper bound." ; + rdfs:range xsd:nonNegativeInteger . + +bufsz:minBlockLength + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "minimum block length" ; + rdfs:comment "Block length has a lower bound." ; + rdfs:range xsd:nonNegativeInteger . + +bufsz:nominalBlockLength + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "nominal block length" ; + rdfs:comment "Typical block length that will most often be processed." ; + rdfs:range xsd:nonNegativeInteger . + +bufsz:sequenceSize + a rdf:Property , + owl:DatatypeProperty , + opts:Option ; + rdfs:label "sequence size" ; + rdfs:comment "The maximum size of a sequence, in bytes." ; + rdfs:range xsd:nonNegativeInteger . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"morph", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 0 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"morph.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix morph: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Morph" ; + doap:shortdesc "Ports that can dynamically change type." ; + doap:created "2012-05-22" ; + doap:developer ; + doap:release [ + doap:revision "1.0" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines two port types: morph:MorphPort, which has a +host-configurable type, and morph:AutoMorphPort, which may automatically change +type when a MorphPort's type is changed. These ports always have a default +type and work normally work in hosts that are unaware of this extension. Thus, +this extension provides a backwards compatibility mechanism which allows +plugins to use new port types but gracefully fall back to a default type in +hosts that do not support them. + +This extension only defines port types and properties for describing morph +ports. The actual run-time switching is done via the opts:interface API. + +"""^^lv2:Markdown . + +morph:MorphPort + lv2:documentation """ + +Ports of this type MUST have another type which defines the default buffer +format (for example lv2:ControlPort) but can be dynamically changed to a +different type in hosts that support opts:interface. + +The host may change the type of a MorphPort by setting its morph:currentType +with LV2_Options_Interface::set(). If the plugin has any morph:AutoMorphPort +ports, the host MUST check their types after changing any port type since they +may have changed. + +"""^^lv2:Markdown . + +morph:AutoMorphPort + lv2:documentation """ + +Ports of this type MUST have another type which defines the default buffer +format (for example, lv2:ControlPort) but may dynamically change types based on +the configured types of any morph:MorphPort ports on the same plugin instance. + +The type of a port may only change in response to a host call to +LV2_Options_Interface::set(). Whenever any port type on the instance changes, +the host MUST check the type of all morph:AutoMorphPort ports with +LV2_Options_Interface::get() before calling run() again, since they may have +changed. If the type of any port is zero, it means the current configuration +is invalid and the plugin may not be run (unless that port is +lv2:connectionOptional and connected to NULL). + +This is mainly useful for outputs whose type depends on the type of +corresponding inputs. + +"""^^lv2:Markdown . + +morph:supportsType + lv2:documentation """ + +Indicates that a port supports being switched to a certain type. A MorphPort +MUST list each type it supports being switched to in the plugin data using this +property. + +"""^^lv2:Markdown . + +morph:currentType + lv2:documentation """ + +The currently active type of the port. This is for dynamic use as an option +and SHOULD NOT be listed in the static plugin data. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"morph.ttl", +R"lv2ttl(@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix morph: . +@prefix opts: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Morph" ; + rdfs:comment "Ports that can dynamically change type." ; + rdfs:seeAlso , + . + +morph:MorphPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Morph Port" ; + rdfs:comment "A port which can be switched to another type." . + +morph:AutoMorphPort + a rdfs:Class , + owl:Class ; + rdfs:subClassOf lv2:Port ; + rdfs:label "Auto Morph Port" ; + rdfs:comment "A port that can change its type based on that of another." . + +morph:supportsType + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain morph:MorphPort ; + rdfs:label "supports type" ; + rdfs:comment "A type that a port supports being switched to." . + +morph:currentType + a rdf:Property , + opts:Option , + owl:ObjectProperty ; + rdfs:domain morph:MorphPort ; + rdfs:label "current type" ; + rdfs:comment "The currently active type of the port." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"state", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 8 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"state.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix state: . + + + a owl:Ontology ; + rdfs:label "LV2 State" ; + rdfs:comment "An interface for LV2 plugins to save and restore state." ; + rdfs:seeAlso , + . + +state:interface + a lv2:ExtensionData ; + rdfs:label "interface" ; + rdfs:comment "A plugin interface for saving and restoring state." . + +state:State + a rdfs:Class ; + rdfs:label "State" ; + rdfs:comment "LV2 plugin state." . + +state:loadDefaultState + a lv2:Feature ; + rdfs:label "load default state" ; + rdfs:comment "A feature indicating that the plugin has default state." . + +state:state + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "state" ; + rdfs:range state:State ; + rdfs:comment "The state of an LV2 plugin instance." . + +state:mapPath + a lv2:Feature ; + rdfs:label "map path" ; + rdfs:comment "A feature for mapping between absolute and abstract file paths." . + +state:makePath + a lv2:Feature ; + rdfs:label "make path" ; + rdfs:comment "A feature for creating new files and directories." . + +state:threadSafeRestore + a lv2:Feature ; + rdfs:label "thread-safe restore" ; + rdfs:comment "A feature indicating support for thread-safe state restoration." . + +state:freePath + a lv2:Feature ; + rdfs:label "free path" ; + rdfs:comment "A feature for freeing paths allocated by the host." . + +state:StateChanged + a rdfs:Class ; + rdfs:label "State Changed" ; + rdfs:comment "A notification that the internal state of the plugin has changed." . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"state.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix state: . + + + a doap:Project ; + doap:created "2010-11-09" ; + doap:name "LV2 State" ; + doap:shortdesc "An interface for LV2 plugins to save and restore state." ; + doap:license ; + doap:developer , + ; + doap:maintainer ; + doap:release [ + doap:revision "2.8" ; + doap:created "2021-01-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix state:StateChanged URI in metadata and documentation." + ] + ] + ] , [ + doap:revision "2.6" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add state:freePath feature." + ] + ] + ] , [ + doap:revision "2.4" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add state:StateChanged for notification events." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2016-07-31" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add LV2_STATE_ERR_NO_SPACE status flag." + ] , [ + rdfs:label "Add state:threadSafeRestore feature for dropout-free state restoration." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2013-01-16" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add state:loadDefaultState feature so plugins can have their default state loaded without hard-coding default state as a special case." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a simple mechanism that allows hosts to save and restore +a plugin instance's state. The goal is for an instance's state to be +completely described by port values and a simple dictionary. + +The state defined here is conceptually a key:value dictionary, with URI keys +and values of any type. For performance reasons the key and value type are +actually a "URID", a URI mapped to an integer. A single key:value pair is +called a "property". + +This state model is simple yet has many benefits: + + * Both fast and extensible thanks to URID keys. + + * No limitations on possible value types. + + * Easy to serialise in almost any format. + + * Easy to store in a typical "map" or "dictionary" data structure. + + * Elegantly described in Turtle, so state can be described in LV2 data files + (including presets). + + * Does not impose any file formats, data structures, or file system + requirements. + + * Suitable for portable persistent state as well as fast in-memory snapshots. + + * Keys _may_ be well-defined and used meaningfully across several + implementations. + + * State _may_ be dynamic, but plugins are not required to have a dynamic + dictionary data structure available. + +To implement state, the plugin provides a state:interface to the host. To save +or restore, the host calls LV2_State_Interface::save() or +LV2_State_Interface::restore(), passing a callback to be used for handling a +single property. The host is free to implement property storage and retrieval +in any way. + +Since value types are defined by URI, any type is possible. However, a set of +standard types is defined by the [LV2 Atom](atom.html) extension. Use of these +types is recommended. Hosts MUST implement at least +[atom:String](atom.html#String), which is simply a C string. + +### Referring to Files + +Plugins may need to refer to existing files (such as loaded samples) in their +state. This is done by storing the file's path as a property just like any +other value. However, there are some rules which MUST be followed when storing +paths, see state:mapPath for details. Plugins MUST use the type +[atom:Path](atom.html#Path) for all paths in their state. + +Plugins are strongly encouraged to avoid creating files, instead storing all +state as properties. However, occasionally the ability to create files is +necessary. To make this possible, the host can provide the feature +state:makePath which allocates paths for plugin-created files. Plugins MUST +NOT create files in any other locations. + +### Plugin Code Example + + :::c + + /* Namespace for this plugin's keys. This SHOULD be something that could be + published as a document, even if that document does not exist right now. + */ + #define NS_MY "http://example.org/myplugin/schema#" + + #define DEFAULT_GREETING "Hello" + + LV2_Handle + my_instantiate(...) + { + MyPlugin* plugin = ...; + plugin->uris.atom_String = map_uri(LV2_ATOM__String); + plugin->uris.my_greeting = map_uri(NS_MY "greeting"); + plugin->state.greeting = strdup(DEFAULT_GREETING); + return plugin; + } + + LV2_State_Status + my_save(LV2_Handle instance, + LV2_State_Store_Function store, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature *const * features) + { + MyPlugin* plugin = (MyPlugin*)instance; + const char* greeting = plugin->state.greeting; + + store(handle, + plugin->uris.my_greeting, + greeting, + strlen(greeting) + 1, // Careful! Need space for terminator + plugin->uris.atom_String, + LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE); + + return LV2_STATE_SUCCESS; + } + + LV2_State_Status + my_restore(LV2_Handle instance, + LV2_State_Retrieve_Function retrieve, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature *const * features) + { + MyPlugin* plugin = (MyPlugin*)instance; + + size_t size; + uint32_t type; + uint32_t flags; + const char* greeting = retrieve( + handle, plugin->uris.my_greeting, &size, &type, &flags); + + if (greeting) { + free(plugin->state->greeting); + plugin->state->greeting = strdup(greeting); + } else { + plugin->state->greeting = strdup(DEFAULT_GREETING); + } + + return LV2_STATE_SUCCESS; + } + + const void* + my_extension_data(const char* uri) + { + static const LV2_State_Interface state_iface = { my_save, my_restore }; + if (!strcmp(uri, LV2_STATE__interface)) { + return &state_iface; + } + } + +### Host Code Example + + :::c + LV2_State_Status + store_callback(LV2_State_Handle handle, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags) + { + if ((flags & LV2_STATE_IS_POD)) { + // We only care about POD since we're keeping sta)lv2ttl" R"lv2ttl(te in memory only. + // Disk or network use would also require LV2_STATE_IS_PORTABLE. + Map* state_map = (Map*)handle; + state_map->insert(key, Value(copy(value), size, type)); + return LV2_STATE_SUCCESS;; + } else { + return LV2_STATE_ERR_BAD_FLAGS; // Non-POD events are unsupported + } + } + + Map + get_plugin_state(LV2_Handle instance) + { + LV2_State* state = instance.extension_data(LV2_STATE__interface); + + // Request a fast/native/POD save, since we're just copying in memory + Map state_map; + state.save(instance, store_callback, &state_map, + LV2_STATE_IS_POD|LV2_STATE_IS_NATIVE); + + return state_map; + } + +### Extensions to this Specification + +It is likely that other interfaces for working with plugin state will be +developed as needed. This is encouraged, however everything SHOULD work within +the state _model_ defined here. That is, **do not complicate the state +model**. Implementations can assume the following: + + * The current port values and state dictionary completely describe a plugin + instance, at least well enough that saving and restoring will yield an + "identical" instance from the user's perspective. + + * Hosts are not expected to save and/or restore any other attributes of a + plugin instance. + +### The "Property Principle" + +The main benefit of this meaningful state model is that it can double as a +plugin control/query mechanism. For plugins that require more advanced control +than simple control ports, instead of defining a set of commands, define +properties whose values can be set appropriately. This provides both a way to +control and save that state "for free", since there is no need to define +commands _and_ a set of properties for storing their effects. In particular, +this is a good way for UIs to achieve more advanced control of plugins. + +This "property principle" is summed up in the phrase: "Don't stop; set playing +to false". + +This extension does not define a dynamic mechanism for state access and +manipulation. The [LV2 Patch](patch.html) extension defines a generic set of +messages which can be used to access or manipulate properties, and the [LV2 +Atom](atom.html) extension defines a port type and data container capable of +transmitting those messages. + +"""^^lv2:Markdown . + +state:interface + lv2:documentation """ + +A structure (LV2_State_Interface) which contains functions to be called by the +host to save and restore state. In order to support this extension, the plugin +must return a valid LV2_State_Interface from LV2_Descriptor::extension_data() +when it is called with URI LV2_STATE__interface. + +The plugin data file should describe this like so: + + :::turtle + @prefix state: . + + + a lv2:Plugin ; + lv2:extensionData state:interface . + +"""^^lv2:Markdown . + +state:State + lv2:documentation """ + +This type should be used wherever instance state is described. The properties +of a resource with this type correspond directly to the properties of the state +dictionary (except the property that states it has this type). + +"""^^lv2:Markdown . + +state:loadDefaultState + lv2:documentation """ + +This feature indicates that the plugin has default state listed with the +state:state property which should be loaded by the host before running the +plugin. Requiring this feature allows plugins to implement a single state +loading mechanism which works for initialisation as well as restoration, +without having to hard-code default state. + +To support this feature, the host MUST restore the default state after +instantiating the plugin but before calling run(). + +"""^^lv2:Markdown . + +state:state + lv2:documentation """ + +This property may be used anywhere a state needs to be described, for example: + + :::turtle + @prefix eg: . + + + state:state [ + eg:somekey "some value" ; + eg:someotherkey "some other value" ; + eg:favourite-number 2 + ] . + +"""^^lv2:Markdown . + +state:mapPath + lv2:documentation """ + +This feature maps absolute paths to/from abstract paths which are stored +in state. To support this feature a host must pass an LV2_Feature with URI +LV2_STATE__mapPath and data pointed to an LV2_State_Map_Path to the plugin's +LV2_State_Interface methods. + +The plugin MUST map _all_ paths stored in its state (including those inside any +files). This is necessary so that hosts can handle file system references +correctly, for example to share common files, or bundle state for distribution +or archival. + +For example, a plugin may write a path to a state file like so: + + :::c + void write_path(LV2_State_Map_Path* map_path, FILE* myfile, const char* path) + { + char* abstract_path = map_path->abstract_path(map_path->handle, path); + fprintf(myfile, "%s", abstract_path); + free(abstract_path); + } + +Then, later reload the path like so: + + :::c + char* read_path(LV2_State_Map_Path* map_path, FILE* myfile) + { + /* Obviously this is not production quality code! */ + char abstract_path[1024]; + fscanf(myfile, "%s", abstract_path); + return map_path->absolute_path(map_path->handle, abstract_path); + } + +"""^^lv2:Markdown . + +state:makePath + lv2:documentation """ + +This feature allows plugins to create new files and/or directories. To support +this feature the host passes an LV2_Feature with URI LV2_STATE__makePath and +data pointed to an LV2_State_Make_Path to the plugin. The host may make this +feature available only during save by passing it to +LV2_State_Interface::save(), or available any time by passing it to +LV2_Descriptor::instantiate(). If passed to LV2_State_Interface::save(), the +feature MUST NOT be used beyond the scope of that call. + +The plugin is guaranteed a hierarchical namespace unique to that plugin +instance, and may expect the returned path to have the requested path as a +suffix. There is one such namespace, even if the feature is passed to both +LV2_Descriptor::instantiate() and LV2_State_Interface::save(). Beyond this, +the plugin MUST NOT make any assumptions about the returned paths. + +Like any other paths, the plugin MUST map these paths using state:mapPath +before storing them in state. The plugin MUST NOT assume these paths will be +available across a save/restore otherwise, that is, only mapped paths saved to +state are persistent, any other created paths are temporary. + +For example, a plugin may create a file in a subdirectory like so: + + :::c + char* save_myfile(LV2_State_Make_Path* make_path) + { + char* path = make_path->path(make_path->handle, "foo/bar/myfile.txt"); + FILE* myfile = fopen(path, 'w'); + fprintf(myfile, "I am some data"); + fclose(myfile); + return path; + } + +"""^^lv2:Markdown . + +state:threadSafeRestore + lv2:documentation """ + +If a plugin supports this feature, its LV2_State_Interface::restore method is +thread-safe and may be called concurrently with audio class functions. + +To support this feature, the host MUST pass a +[work:schedule](worker.html#schedule) feature to the restore method, which will +be used to complete the state restoration. The usual mechanics of the worker +apply: the host will call the plugin's work method, which emits a response +which is later applied in the audio thread. + +The host is not required to block audio processing while restore() and work() +load the state, so this feature allows state to be restored without dropouts. + +"""^^lv2:Markdown . + +state:freePath + lv2:documentation """ + +This feature provides a function that can be used by plugins to free paths that +were allocated by the host via other state features (state:mapPath and +state:makePath). + +"""^^lv2:Markdown . + +state:StateChanged + lv2:documentation """ + +A notification that the internal state of the plugin has been changed in a way +that the host can not otherwise know about. + +This is a one-way)lv2ttl" R"lv2ttl( notification, intended to be used as the type of an +[Object](atom.html#Object) sent from plugins when necessary. + +Plugins SHOULD emit such an event whenever a change has occurred that would +result in a different state being saved, but not when the host explicity makes +a change which it knows is likely to have that effect, such as changing a +parameter. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"time", +{ +juce::lv2::BundleResource +{ +"time.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix time: . + + + a doap:Project ; + doap:name "LV2 Time" ; + doap:shortdesc "A vocabulary for describing musical time." ; + doap:created "2011-10-05" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Clarify time:beat origin." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2016-07-31" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Define LV2_TIME_PREFIX." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This is a vocabulary for describing a position in time and the speed of time +passage, in both real and musical terms. + +In addition to real time (based on seconds), two units of time are used: +_frames_ and _beats_. A frame is a numbered quantum of time. Frame time is +related to real-time by the _frame rate_ or _sample rate_, +time:framesPerSecond. A beat is a single pulse of musical time. Beat time is +related to real-time by the _tempo_, time:beatsPerMinute. + +Musical time additionally has a _meter_ which describes passage of time in +terms of musical _bars_. A bar is a higher level grouping of beats. The meter +describes how many beats are in one bar. + +"""^^lv2:Markdown . + +time:Position + lv2:documentation """ + +A point in time and/or the speed at which time is passing. A position is both +a point and a speed, which precisely defines a time within a timeline. + +"""^^lv2:Markdown . + +time:Rate + lv2:documentation """ + +The rate of passage of time in terms of one unit with respect to another. + +"""^^lv2:Markdown . + +time:beat + lv2:documentation """ + +This is not the beat within a bar like time:barBeat, but relative to the same +origin as time:bar and monotonically increases unless the transport is +repositioned. + +"""^^lv2:Markdown . + +time:beatUnit + lv2:documentation """ + +Beat unit, the note value that counts as one beat. This is the bottom number +in a time signature: 2 for half note, 4 for quarter note, and so on. + +"""^^lv2:Markdown . + +time:speed + lv2:documentation """ + +The rate of the progress of time as a fraction of normal speed. For example, a +rate of 0.0 is stopped, 1.0 is rolling at normal speed, 0.5 is rolling at half +speed, -1.0 is reverse, and so on. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"time.ttl", +R"lv2ttl(@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix time: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Time" ; + rdfs:comment "A vocabulary for describing musical time." ; + rdfs:seeAlso , + . + +time:Time + a rdfs:Class , + owl:Class ; + rdfs:subClassOf time:Position ; + rdfs:label "Time" ; + rdfs:comment "A point in time in some unit/dimension." . + +time:Position + a rdfs:Class , + owl:Class ; + rdfs:label "Position" ; + rdfs:comment "A point in time and/or the speed at which time is passing." . + +time:Rate + a rdfs:Class , + owl:Class ; + rdfs:subClassOf time:Position ; + rdfs:label "Rate" ; + rdfs:comment "The rate of passage of time." . + +time:position + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:range time:Position ; + rdfs:label "position" ; + rdfs:comment "A musical position." . + +time:barBeat + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:float ; + rdfs:label "beat within bar" ; + rdfs:comment "The beat number within the bar, from 0 to time:beatsPerBar." . + +time:bar + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:long ; + rdfs:label "bar" ; + rdfs:comment "A musical bar or measure." . + +time:beat + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:double ; + rdfs:label "beat" ; + rdfs:comment "The global running beat number." . + +time:beatUnit + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:nonNegativeInteger ; + rdfs:label "beat unit" ; + rdfs:comment "The note value that counts as one beat." . + +time:beatsPerBar + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "beats per bar" ; + rdfs:comment "The number of beats in one bar." . + +time:beatsPerMinute + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "beats per minute" ; + rdfs:comment "Tempo in beats per minute." . + +time:frame + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Time ; + rdfs:range xsd:long ; + rdfs:label "frame" ; + rdfs:comment "A time stamp in audio frames." . + +time:framesPerSecond + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "frames per second" ; + rdfs:comment "Frame rate in frames per second." . + +time:speed + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain time:Rate ; + rdfs:range xsd:float ; + rdfs:label "speed" ; + rdfs:comment "The rate of the progress of time as a fraction of normal speed." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"units", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 5 ; + lv2:microVersion 12 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"units.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix units: . + + + a doap:Project ; + doap:name "LV2 Units" ; + doap:shortdesc "Units for LV2 values." ; + doap:created "2007-02-06" ; + doap:homepage ; + doap:license ; + doap:release [ + doap:revision "5.12" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix outdated port description in documentation." + ] , [ + rdfs:label "Remove overly restrictive domain from units:unit." + ] + ] + ] , [ + doap:revision "5.10" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix non-existent port type in examples." + ] , [ + rdfs:label "Add lv2:Parameter to domain of units:unit." + ] + ] + ] , [ + doap:revision "5.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Remove units:name in favour of rdfs:label." + ] , [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "5.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add unit for audio frames." + ] , [ + rdfs:label "Add header of URI defines." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "5.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make units.ttl a valid OWL 2 DL ontology." + ] , [ + rdfs:label "Define used but undefined resources (units:name, units:render, units:symbol, units:Conversion, units:conversion, units:prefixConversion, units:to, and units:factor)." + ] , [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "5.2" ; + doap:created "2010-10-05" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Convert documentation to HTML and use lv2:documentation." + ] + ] + ] , [ + doap:revision "5.0" ; + doap:created "2010-10-05" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] , [ + rdfs:label "Define used but undefined resources (units:name, units:render, units:symbol, units:Conversion, units:conversion, units:prefixConversion, units:to, and units:factor)." + ] , [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] ; + doap:developer ; + doap:maintainer ; + lv2:documentation """ + +This is a vocabulary for units typically used for control values in audio +processing. + +For example, to say that a gain control is in decibels: + + :::turtle + @prefix units: . + @prefix eg: . + + eg:plugin lv2:port [ + a lv2:ControlPort , lv2:InputPort ; + lv2:index 0 ; + lv2:symbol "gain" ; + lv2:name "Gain" ; + units:unit units:db + ] . + +Using the same form, plugins may also specify one-off units inline, to give +better display hints to hosts: + + :::turtle + eg:plugin lv2:port [ + a lv2:ControlPort , lv2:InputPort ; + lv2:index 0 ; + lv2:symbol "frob" ; + lv2:name "frob level" ; + units:unit [ + a units:Unit ; + rdfs:label "frobnication" ; + units:symbol "fr" ; + units:render "%f f" + ] + ] . + +It is also possible to define conversions between various units, which makes it +possible for hosts to automatically convert between units where possible. The +units defined in this extension include conversion definitions where it makes +sense to do so. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"units.ttl", +R"lv2ttl(@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix units: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Units" ; + rdfs:comment "Units for LV2 values." ; + rdfs:seeAlso , + . + +units:Unit + a rdfs:Class , + owl:Class ; + rdfs:label "Unit" ; + rdfs:comment "A unit for a control value." . + +units:unit + a rdf:Property , + owl:ObjectProperty ; + rdfs:range units:Unit ; + rdfs:label "unit" ; + rdfs:comment "The unit used by the value of a port or parameter." . + +units:render + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "unit format string" ; + rdfs:domain units:Unit ; + rdfs:range xsd:string ; + rdfs:comment """A printf format string for rendering a value (e.g., "%f dB").""" . + +units:symbol + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "unit symbol" ; + rdfs:domain units:Unit ; + rdfs:range xsd:string ; + rdfs:comment """The abbreviated symbol for this unit (e.g., "dB").""" . + +units:Conversion + a rdfs:Class , + owl:Class ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty units:to ; + owl:cardinality 1 ; + rdfs:comment "A conversion MUST have exactly 1 units:to property." + ] ; + rdfs:label "Conversion" ; + rdfs:comment "A conversion from one unit to another." . + +units:conversion + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain units:Unit ; + rdfs:range units:Conversion ; + rdfs:label "conversion" ; + rdfs:comment "A conversion from this unit to another." . + +units:prefixConversion + a rdf:Property , + owl:ObjectProperty ; + rdfs:subPropertyOf units:conversion ; + rdfs:domain units:Unit ; + rdfs:range units:Conversion ; + rdfs:label "prefix conversion" ; + rdfs:comment "A conversion from this unit to another with the same base but a different prefix." . + +units:to + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain units:Conversion ; + rdfs:range units:Unit ; + rdfs:label "conversion target" ; + rdfs:comment "The target unit this conversion converts to." . + +units:factor + a rdf:Property , + owl:DatatypeProperty ; + rdfs:domain units:Conversion ; + rdfs:label "conversion factor" ; + rdfs:comment "The factor to multiply the source value by in order to convert to the target unit." . + +units:s + a units:Unit ; + units:conversion [ + units:factor 0.0166666666 ; + units:to units:min + ] ; + rdfs:label "seconds" ; + rdfs:comment "Seconds, the SI base unit for time." ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:ms + ] ; + units:render "%f s" ; + units:symbol "s" . + +units:ms + a units:Unit ; + rdfs:label "milliseconds" ; + rdfs:comment "Milliseconds (thousandths of seconds)." ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:s + ] ; + units:render "%f ms" ; + units:symbol "ms" . + +units:min + a units:Unit ; + units:conversion [ + units:factor 60.0 ; + units:to units:s + ] ; + rdfs:label "minutes" ; + rdfs:comment "Minutes (60s of seconds and 60ths of an hour)." ; + units:render "%f mins" ; + units:symbol "min" . + +units:bar + a units:Unit ; + rdfs:label "bars" ; + rdfs:comment "Musical bars or measures." ; + units:render "%f bars" ; + units:symbol "bars" . + +units:beat + a units:Unit ; + rdfs:label "beats" ; + rdfs:comment "Musical beats." ; + units:render "%f beats" ; + units:symbol "beats" . + +units:frame + a units:Unit ; + rdfs:label "audio frames" ; + rdfs:comment "Audio frames or samples." ; + units:render "%f frames" ; + units:symbol "frames" . + +units:m + a units:Unit ; + units:conversion [ + units:factor 39.37 ; + units:to units:inch + ] ; + rdfs:label "metres" ; + rdfs:comment "Metres, the SI base unit for length." ; + units:prefixConversion [ + units:factor 100 ; + units:to units:cm + ] , [ + units:factor 1000 ; + units:to units:mm + ] , [ + units:factor 0.001 ; + units:to units:km + ] ; + units:render "%f m" ; + units:symbol "m" . + +units:cm + a units:Unit ; + units:conversion [ + units:factor 0.3937 ; + units:to units:inch + ] ; + rdfs:label "centimetres" ; + rdfs:comment "Centimetres (hundredths of metres)." ; + units:prefixConversion [ + units:factor 0.01 ; + units:to units:m + ] , [ + units:factor 10 ; + units:to units:mm + ] , [ + units:factor 0.00001 ; + units:to units:km + ] ; + units:render "%f cm" ; + units:symbol "cm" . + +units:mm + a units:Unit ; + units:conversion [ + units:factor 0.03937 ; + units:to units:inch + ] ; + rdfs:label "millimetres" ; + rdfs:comment "Millimetres (thousandths of metres)." ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:m + ] , [ + units:factor 0.1 ; + units:to units:cm + ] , [ + units:factor 0.000001 ; + units:to units:km + ] ; + units:render "%f mm" ; + units:symbol "mm" . + +units:km + a units:Unit ; + units:conversion [ + units:factor 0.62138818 ; + units:to units:mile + ] ; + rdfs:label "kilometres" ; + rdfs:comment "Kilometres (thousands of metres)." ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:m + ] , [ + units:factor 100000 ; + units:to units:cm + ] , [ + units:factor 1000000 ; + units:to units:mm + ] ; + units:render "%f km" ; + units:symbol "km" . + +units:inch + a units:Unit ; + units:conversion [ + units:factor 0.0254 ; + units:to units:m + ] ; + rdfs:label "inches" ; + rdfs:comment "An inch, defined as exactly 0.0254 metres." ; + units:render "%f\"" ; + units:symbol "in" . + +units:mile + a units:Unit ; + units:conversion [ + units:factor 1609.344 ; + units:to units:m + ] ; + rdfs:label "miles" ; + rdfs:comment "A mile, defined as exactly 1609.344 metres." ; + units:render "%f mi" ; + units:symbol "mi" . + +units:db + a units:Unit ; + rdfs:label "decibels" ; + rdfs:comment "Decibels, a logarithmic relative unit where 0 is unity." ; + units:render "%f dB" ; + units:symbol "dB" . + +units:pc + a units:Unit ; + units:conversion [ + units:factor 0.01 ; + units:to units:coef + ] ; + rdfs:label "percent" ; + rdfs:comment "Percentage, a ratio as a fraction of 100." ; + units:render "%f%%" ; + units:symbol "%" . + +units:coef + a units:Unit ; + units:conversion [ + units:factor 100 ; + units:to units:pc + ] ; + rdfs:label "coefficient" ; + rdfs:comment "A scale coefficient where 1 is unity, or 100 percent." ; + units:render "* %f" ; + units:symbol "" . + +units:hz + a units:Unit ; + rdfs:label "hertz" ; + rdfs:comment "Hertz, or inverse seconds, the SI derived unit for frequency." ; + units:prefixConversion [ + units:factor 0.001 ; + units:to units:khz + ] , [ + units:factor 0.000001 ; + units:to units:mhz + ] ; + units:render "%f Hz" ; + units:symbol "Hz" . + +units:khz + a units:Unit ; + rdfs:label "kilohertz" ; + rdfs:comment "Kilohertz (thousands of Hertz)." ; + units:prefixConversion [ + units:factor 1000 ; + units:to units:hz + ] , [ + units:factor 0.001 ; + units:to units:mhz + ] ; + units:render "%f kHz" ; + units:symbol "kHz" . + +units:mhz + a units:Unit ; + rdfs:label "megahertz" ; + rdfs:comment "Megahertz (millions of Hertz)." ; + units:prefixConversion [ + units:factor 1000000 ; + units:to units:hz + ] , [ + units:factor 0.001 ; + units:to units:khz + ] ; + units:render "%f MHz" ; + units:symbol "MHz" . + +units:bpm + a units:Unit ; + rdfs:label "beats per minute" ; + rdfs:comment "Beats Per Minute (BPM), the standard unit for musical tempo." ; + units:prefixConversion [ + units:factor 0.0166666666 ; + units:to units:hz + ] ; + units:render "%f BPM" ; + units:symbol "BPM" . + +units:oct + a units:Unit ; + units:conversion [ + units:factor 12.0 ; + units:to units:semitone12TET + ] ; + rdfs:label "octaves" ; + rdfs:comment "Octaves, relative musical pitch where +1 octave doubles the frequency." ; + units:render "%f octaves" ; + units:symbol "oct" . + +units:cent + a units:Unit ; + units:conversion [ + units:factor 0.01 ; + units:to units:semitone12TET + ] ; + rdfs:label "cents" ; + rdfs:comment "Cents (hundredths of semitones)." ; + units:render "%f ct" ; + units:symbol "ct" . + +units:semitone12TET + a units:Unit ; + units:conversion [ + units:factor 0.083333333 ; + units:to units:oct + ] ; + rdfs:label "semitones" ; + rdfs:comment "A semiton)lv2ttl" R"lv2ttl(e in the 12-tone equal temperament scale." ; + units:render "%f semi" ; + units:symbol "semi" . + +units:degree + a units:Unit ; + rdfs:label "degrees" ; + rdfs:comment "An angle where 360 degrees is one full rotation." ; + units:render "%f deg" ; + units:symbol "deg" . + +units:midiNote + a units:Unit ; + rdfs:label "MIDI note" ; + rdfs:comment "A MIDI note number." ; + units:render "MIDI note %d" ; + units:symbol "note" . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"patch", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 8 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"patch.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix patch: . +@prefix rdfs: . + + + a doap:Project ; + doap:created "2012-02-09" ; + doap:license ; + doap:developer ; + doap:name "LV2 Patch" ; + doap:shortdesc "A protocol for accessing and manipulating properties." ; + doap:release [ + doap:revision "2.8" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect type of patch:sequenceNumber." + ] + ] + ] , [ + doap:revision "2.6" ; + doap:created "2019-02-03" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add patch:accept property." + ] , [ + rdfs:label "Add patch:context property." + ] + ] + ] , [ + doap:revision "2.4" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Define patch:Get with no subject to implicitly apply to reciever. This can be used by UIs to get an initial description of a plugin." + ] , [ + rdfs:label "Add patch:Copy method." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add patch:sequenceNumber for associating replies with requests." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2013-01-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make patch:Set a compact message for setting one property." + ] , [ + rdfs:label "Add patch:readable and patch:writable for describing available properties." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This is a vocabulary for messages that access and manipulate properties. +It can be used as a dynamic control interface for plugins, +or anything else with a property-based model. + +The key underlying concept here is to control things by manipulating arbitrary properties, +rather than by calling application-specific methods. +This allows implementations to understand what messages do +(at least in a mechanical sense), +which makes things like caching, proxying, or undo relatively straightforward to implement. +Note, however, that this is only conceptual: +there is no requirement to implement a general property store. +Typically, a plugin will understand a fixed set of properties that represent its parameters or other internal state, and ignore everything else. + +This protocol is syntax-agnostic, +and [homoiconic](https://en.wikipedia.org/wiki/Homoiconicity) +in the sense that the messages use the same format as the data they manipulate. +In particular, messages can be serialised as a binary [Object](atom.html#Object) for realtime plugin control, +or as Turtle for saving to a file, +sending over a network, +printing for debugging purposes, +and so on. + +This specification only defines a semantic protocol, +there is no corresponding API. +It can be used with the [Atom](atom.html) extension to control plugins which support message-based parameters as defined by the [Parameters](parameters.html) extension. + +For example, if a plugin defines a `eg:volume` parameter, it can be controlled by the host by sending a patch:Set message to the plugin instance: + + :::turtle + [ + a patch:Set ; + patch:property eg:volume ; + patch:value 11.0 ; + ] + +Similarly, the host could get the current value for this parameter by sending a patch:Get message: + + :::turtle + [ + a patch:Get ; + patch:property eg:volume ; + ] + +The plugin would then respond with the same patch:Set message as above. +In this case, the plugin instance is implicitly the patch:subject, +but a specific subject can also be given for deeper control. + +"""^^lv2:Markdown . + +patch:Copy + lv2:documentation """ + +After this, the destination has the same description as the subject, +and the subject is unchanged. + +It is an error if the subject does not exist, +or if the destination already exists. + +Multiple subjects may be given if the destination is a container, +but the semantics of this case are application-defined. + +"""^^lv2:Markdown . + +patch:Get + lv2:documentation """ + +If a patch:property is given, +then the receiver should respond with a patch:Set message that gives only that property. + +Otherwise, it should respond with a [concise bounded description](http://www.w3.org/Submission/CBD/) in a patch:Put message, +that is, a description that recursively includes any blank node values. + +If a patch:subject is given, then the response should have the same subject. +If no subject is given, then the receiver is implicitly the subject. + +If a patch:request node or a patch:sequenceNumber is given, +then the response should be a patch:Response and have the same property. +If neither is given, then the receiver can respond with a simple patch:Put message. +For example: + + :::turtle + [] + a patch:Get ; + patch:subject eg:something . + +Could result in: + + :::turtle + [] + a patch:Put ; + patch:subject eg:something ; + patch:body [ + eg:name "Something" ; + eg:ratio 1.6180339887 ; + ] . + +"""^^lv2:Markdown . + +patch:Insert + lv2:documentation """ + +If the subject does not exist, it is created. If the subject does already +exist, it is added to. + +This request only adds properties, it never removes them. The user must take +care that multiple values are not set for properties which should only have +one. + +"""^^lv2:Markdown . + +patch:Message + lv2:documentation """ + +This is an abstract base class for all patch messages. Concrete messages are +either a patch:Request or a patch:Response. + +"""^^lv2:Markdown . + +patch:Move + lv2:documentation """ + +After this, the destination has the description that the subject had, and the +subject no longer exists. + +It is an error if the subject does not exist, or if the destination already +exists. + +"""^^lv2:Markdown . + +patch:Patch + lv2:documentation """ + +This method always has at least one subject, and exactly one patch:add and +patch:remove property. The value of patch:add and patch:remove are nodes which +have the properties to add or remove from the subject(s), respectively. The +special value patch:wildcard may be used as the value of a remove property to +remove all properties with the given predicate. For example: + + :::turtle + [] + a patch:Patch ; + patch:subject ; + patch:add [ + eg:name "New name" ; + eg:age 42 ; + ] ; + patch:remove [ + eg:name "Old name" ; + eg:age patch:wildcard ; # Remove all old eg:age properties + ] . + +"""^^lv2:Markdown . + +patch:Put + lv2:documentation """ + +If the subject does not already exist, it is created. If the subject does +already exist, the patch:body is considered an updated version of it, and the +previous version is replaced. + + :::turtle + [] + a patch:Put ; + patch:subject ; + patch:body [ + eg:name "New name" ; + eg:age 42 ; + ] . + +"""^^lv2:Markdown . + +patch:Request + a rdfs:Class ; + rdfs:label "Request" ; + rdfs:subClassOf)lv2ttl" R"lv2ttl( patch:Message ; + lv2:documentation """ + +A request may have a patch:subject property, which specifies the resource that +the request applies to. The subject may be omitted in contexts where it is +implicit, for example if the recipient is the subject. + +"""^^lv2:Markdown . + +patch:Set + lv2:documentation """ + +This is equivalent to a patch:Patch which removes _all_ pre-existing values for +the property before setting the new value. For example: + + :::turtle + [] + a patch:Set ; + patch:subject ; + patch:property eg:name ; + patch:value "New name" . + +Which is equivalent to: + + :::turtle + [] + a patch:Patch ; + patch:subject ; + patch:add [ + eg:name "New name" ; + ] ; + patch:remove [ + eg:name patch:wildcard ; + ] . + +"""^^lv2:Markdown . + +patch:body + lv2:documentation """ + +The details of this property's value depend on the type of message it is a part +of. + +"""^^lv2:Markdown . + +patch:context + lv2:documentation """ + +For example, a plugin may have a special context for ephemeral properties which +are only relevant during the lifetime of the instance and should not be saved +in state. + +The specific uses for contexts are application specific. However, the context +MUST be a URI, and can be interpreted as the ID of a data model where +properties should be stored. Implementations MAY have special support for +contexts, for example by storing in a quad store or serializing to a format +that supports multiple RDF graphs such as TriG. + +"""^^lv2:Markdown . + +patch:readable + lv2:documentation """ + +See the similar patch:writable property for details. + +"""^^lv2:Markdown . + +patch:request + lv2:documentation """ + +This can be used if referring directly to the URI or blank node ID of the +request is possible. Otherwise, use patch:sequenceNumber. + +"""^^lv2:Markdown . + +patch:sequenceNumber + lv2:documentation """ + +This property is used to associate replies with requests when it is not +feasible to refer to request URIs with patch:request. A patch:Response with a +given sequence number is the reply to the previously send patch:Request with +the same sequence number. + +The special sequence number 0 means that no reply is desired. + +"""^^lv2:Markdown . + +patch:wildcard + lv2:documentation """ + +This makes it possible to describe the removal of all values for a given +property. + +"""^^lv2:Markdown . + +patch:writable + lv2:documentation """ + +This is used to list properties that can be changed, for example to allow user +interfaces to present appropriate controls. For example: + + :::turtle + @prefix eg: . + @prefix rdf: . + @prefix rdfs: . + @prefix xsd: . + + eg:title + a rdf:Property ; + rdfs:label "title" ; + rdfs:range xsd:string . + + eg:plugin + patch:writable eg:title . + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"patch.ttl", +R"lv2ttl(@prefix foaf: . +@prefix owl: . +@prefix patch: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:seeAlso , + ; + rdfs:label "LV2 Patch" ; + rdfs:comment "A protocol for accessing and manipulating properties." . + +patch:Ack + a rdfs:Class ; + rdfs:subClassOf patch:Response ; + rdfs:label "Ack" ; + rdfs:comment "An acknowledgement that a request was successful." . + +patch:Copy + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Copy" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty patch:subject + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:destination + ] ; + rdfs:comment "A request to copy the patch:subject to the patch:destination." . + +patch:Delete + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Delete" ; + rdfs:comment "Request that the patch:subject or subjects be deleted." . + +patch:Error + a rdfs:Class ; + rdfs:subClassOf patch:Response ; + rdfs:label "Error" ; + rdfs:comment "A response indicating an error processing a request." . + +patch:Get + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Get" ; + rdfs:comment "A request for a description of the patch:subject." . + +patch:Insert + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Insert" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:subject + ] ; + rdfs:comment "A request to insert a patch:body into the patch:subject." . + +patch:Message + a rdfs:Class ; + rdfs:label "Patch Message" ; + rdfs:comment "A patch message." . + +patch:Move + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Move" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:subject + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:destination + ] ; + rdfs:comment "A request to move the patch:subject to the patch:destination." . + +patch:Patch + a rdfs:Class ; + rdfs:subClassOf patch:Request , + [ + a owl:Restriction ; + owl:minCardinality 1 ; + owl:onProperty patch:subject + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:add + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:remove + ] ; + rdfs:label "Patch" ; + rdfs:comment "A request to add and/or remove properties of the patch:subject." . + +patch:Put + a rdfs:Class ; + rdfs:subClassOf patch:Request ; + rdfs:label "Put" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:subject + ] ; + rdfs:comment "A request to put the patch:body as the patch:subject." . + +patch:Request + a rdfs:Class ; + rdfs:label "Request" ; + rdfs:subClassOf patch:Message ; + rdfs:comment "A patch request message." . + +patch:Response + a rdfs:Class ; + rdfs:subClassOf patch:Message ; + rdfs:label "Response" ; + rdfs:comment "A response to a patch:Request." . + +patch:Set + a rdfs:Class ; + rdfs:label "Set" ; + rdfs:subClassOf patch:Request , + [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:property + ] , [ + a owl:Restriction ; + owl:cardinality 1 ; + owl:onProperty patch:value + ] ; + rdfs:comment "A compact request to set a property to a value." . + +patch:accept + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "accept" ; + rdfs:domain patch:Request ; + rdfs:range rdfs:Class ; + rdfs:comment "An accepted type for a response." . + +patch:add + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Patch ; + rdfs:range rdfs:Resource ; + rdfs:label "add" ; + rdfs:comment "The properties to add to the subject." . + +patch:body + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Message ; + rdfs:label "body" ; + rdfs:comment "The body of a message." . + +patch:context + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain patch:Message ; + rdfs:label "context" ; + rdfs:comment "The context of properties in this message." . + +patch:destination + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Message ; + rdfs:label "destination" ; + rdfs:comment "The destination to move the patch:subject to." . + +patch:property + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "property" ; + rdfs:domain patch:Message ; + rdfs:range rdf:Property ; + rdfs:comment "The property for a patch:Set or patch:Get message." . + +patch:readable + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "readable" ; + rdfs:range rdf:Property ; + rdfs:comment "A property that can be read with a patch:Get message." . + +patch:remove + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:label "remove" ; + rdfs:domain patch:Patch ; + rdfs:range rdfs:Resource ; + rdfs:comment "The properties to remove from the subject." . + +patch:request + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:label "request" ; + rdfs:domain patch:Response ; + rdfs:range patch:Request ; + rdfs:comment "The request this is a response to." . + +patch:sequenceNumber + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:label "sequence number" ; + rdfs:domain patch:Message ; + rdfs:range xsd:int ; + rdfs:comment "The sequence number of a request or response." . + +patch:subject + a rdf:Property , + owl:ObjectProperty , + owl:FunctionalProperty ; + rdfs:domain patch:Message ; + rdfs:label "subject" ; + rdfs:comment "The subject this message applies to." . + +patch:value + a rdf:Property , + owl:DatatypeProperty ; + rdfs:label "value" ; + rdfs:domain patch:Set ; + rdfs:range rdf:Property ; + rdfs:comment "The value of a property in a patch:Set message." . + +patch:wildcard + a rdfs:Resource ; + rdfs:label "wildcard" ; + rdfs:comment "A wildcard that matches any resource." . + +patch:writable + a rdf:Property , + owl:ObjectProperty ; + rdfs:label "writable" ; + rdfs:range rdf:Property ; + rdfs:comment "A property that can be set with a patch:Set or patch:Patch message." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"parameters", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"parameters.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix param: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Parameters" ; + doap:release [ + doap:revision "1.4" ; + doap:created "2015-04-07" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add range to parameters so hosts know how to control them." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add param:sampleRate." + ] , [ + rdfs:label "Add parameters.h of URI defines for convenience." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + doap:created "2009-00-00" ; + doap:shortdesc "Common parameters for audio processing." ; + doap:maintainer ; + doap:developer ; + lv2:documentation """ + +This is a vocabulary for parameters that are common in audio processing +software. A parameter is purely a metadata concept, unrelated to any +particular code mechanism. Parameters are used to assign meaning to controls +(for example, using lv2:designation for ports) so they can be used more +intelligently or presented to the user more efficiently. + +"""^^lv2:Markdown . + +param:wetDryRatio + a lv2:Parameter ; + rdfs:label "wet/dry ratio" ; + lv2:documentation """ + +The ratio between processed and bypass components in output signal. The dry +and wet percentages can be calculated from the following equations: + + :::c + dry = (wetDryRatio.maximum - wetDryRatio.value) / wetDryRatio.maximum + wet = wetDryRatio.value / wetDryRatio.maximum + +Typically, maximum value of 1 or 100 and minimum value of 0 should be used. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"parameters.ttl", +R"lv2ttl(@prefix atom: . +@prefix lv2: . +@prefix owl: . +@prefix param: . +@prefix pg: . +@prefix rdf: . +@prefix rdfs: . +@prefix units: . + + + a owl:Ontology ; + rdfs:label "LV2 Parameters" ; + rdfs:comment "Common parameters for audio processing." ; + rdfs:seeAlso . + +param:ControlGroup + a rdfs:Class ; + rdfs:subClassOf pg:Group ; + rdfs:label "Control Group" ; + rdfs:comment "A group representing a set of associated controls." . + +param:amplitude + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "amplitude" ; + rdfs:comment "An amplitude as a factor, where 0 is silent and 1 is unity." . + +param:attack + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "attack" ; + rdfs:comment "The duration of an envelope attack stage." . + +param:cutoffFrequency + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "cutoff frequency" ; + rdfs:comment "The cutoff frequency, typically in Hz, for a filter." . + +param:decay + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "decay" ; + rdfs:comment "The duration of an envelope decay stage." . + +param:delay + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "delay" ; + rdfs:comment "The duration of an envelope delay stage." . + +param:frequency + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "frequency" ; + rdfs:comment "A frequency, typically in Hz." . + +param:hold + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "hold" ; + rdfs:comment "The duration of an envelope hold stage." . + +param:pulseWidth + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "pulse width" ; + rdfs:comment "The width of a pulse of a rectangular waveform." . + +param:ratio + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "ratio" ; + rdfs:comment "Compression ratio." . + +param:release + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "release" ; + rdfs:comment "The duration of an envelope release stage." . + +param:resonance + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "resonance" ; + rdfs:comment "The resonance of a filter." . + +param:sustain + a lv2:Parameter ; + rdfs:label "sustain" ; + rdfs:range atom:Float ; + rdfs:comment "The level of an envelope sustain stage as a factor." . + +param:threshold + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "threshold" ; + rdfs:comment "Compression threshold." . + +param:waveform + a lv2:Parameter ; + rdfs:range atom:Float ; + rdfs:label "waveform" ; + rdfs:comment """The waveform "fader" for oscillators or modulators that have several.""" . + +param:gain + a lv2:Parameter ; + rdfs:range atom:Float ; + lv2:default 0.0 ; + lv2:minimum -20.0 ; + lv2:maximum 20.0 ; + units:unit units:db ; + rdfs:label "gain" ; + rdfs:comment "Gain in decibels." . + +param:wetDryRatio + a lv2:Parameter ; + rdfs:label "wet/dry ratio" ; + rdfs:comment "The ratio between processed and bypassed levels in the output." . + +param:wetLevel + a lv2:Parameter ; + rdfs:label "wet level" ; + rdfs:comment "The level of the processed component of a signal." . + +param:dryLevel + a lv2:Parameter ; + rdfs:label "dry level" ; + rdfs:comment "The level of the unprocessed component of a signal." . + +param:bypass + a lv2:Parameter ; + rdfs:label "bypass" ; + rdfs:comment "A boolean parameter that disables processing if true." . + +param:sampleRate + a lv2:Parameter ; + rdfs:label "sample rate" ; + rdfs:comment "A sample rate in Hz." . + +param:EnvelopeControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Envelope Controls" ; + rdfs:comment "Typical controls for a DAHDSR envelope." ; + pg:element [ + lv2:index 0 ; + lv2:designation param:delay + ] , [ + lv2:index 1 ; + lv2:designation param:attack + ] , [ + lv2:index 2 ; + lv2:designation param:hold + ] , [ + lv2:index 3 ; + lv2:designation param:decay + ] , [ + lv2:index 4 ; + lv2:designation param:sustain + ] , [ + lv2:index 5 ; + lv2:designation param:release + ] . + +param:OscillatorControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Oscillator Controls" ; + rdfs:comment "Typical controls for an oscillator." ; + pg:element [ + lv2:designation param:frequency + ] , [ + lv2:designation param:amplitude + ] , [ + lv2:designation param:waveform + ] , [ + lv2:designation param:pulseWidth + ] . + +param:FilterControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Filter Controls" ; + rdfs:comment "Typical controls for a filter." ; + pg:element [ + lv2:designation param:cutoffFrequency + ] , [ + lv2:designation param:resonance + ] . + +param:CompressorControls + a rdfs:Class ; + rdfs:subClassOf param:ControlGroup ; + rdfs:label "Compressor Controls" ; + rdfs:comment "Typical controls for a compressor." ; + pg:element [ + lv2:designation param:threshold + ] , [ + lv2:designation param:ratio + ] . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"urid", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"urid.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix urid: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 URID" ; + doap:shortdesc "Features for mapping URIs to and from integers." ; + doap:created "2011-07-22" ; + doap:developer ; + doap:maintainer ; + doap:release [ + doap:revision "1.4" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix typo in urid:unmap documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add feature struct names." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a simple mechanism for plugins to map URIs to and from +integers. This is usually used for performance reasons, for example for +processing events with URI types in real-time audio code). Typically, plugins +map URIs to integers for things they "understand" at instantiation time, and +store those values for use in the audio thread without doing any string +comparison. This allows for the extensibility of RDF but with the performance +of integers. + +This extension is intended as an improved and simplified replacement for the +[uri-map](uri-map.html) extension, since the `map` context parameter there has +proven problematic. This extension is functionally equivalent to the uri-map +extension with a NULL context. New implementations are encouraged to use this +extension for URI mapping. + +"""^^lv2:Markdown . + +urid:map + lv2:documentation """ + +To support this feature, the host must pass an LV2_Feature to +LV2_Descriptor::instantiate() with URI LV2_URID__map and data pointed to an +instance of LV2_URID_Map. + +"""^^lv2:Markdown . + +urid:unmap + lv2:documentation """ + +To support this feature, the host must pass an LV2_Feature to +LV2_Descriptor::instantiate() with URI LV2_URID__unmap and data pointed to an +instance of LV2_URID_Unmap. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"urid.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix rdfs: . +@prefix urid: . + + + a owl:Ontology ; + rdfs:label "LV2 URID" ; + rdfs:comment "Features for mapping URIs to and from integers." ; + rdfs:seeAlso , + . + +urid:map + a lv2:Feature ; + rdfs:label "map" ; + rdfs:comment "A feature to map URI strings to integer URIDs." . + +urid:unmap + a lv2:Feature ; + rdfs:label "unmap" ; + rdfs:comment "A feature to unmap URIDs back to strings." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"uri-map", +{ +juce::lv2::BundleResource +{ +"uri-map.meta.ttl", +R"lv2ttl(@prefix lv2: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix rdfs: . + + + a doap:Project ; + doap:maintainer ; + doap:created "2008-00-00" ; + doap:developer , + ; + doap:license ; + doap:name "LV2 URI Map" ; + doap:shortdesc "A feature for mapping URIs to integers." ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Deprecate uri-map in favour of urid." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Mark up documentation in HTML using lv2:documentation." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-18" ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension is deprecated. New implementations +should use [LV2 URID](urid.html) instead. + +This extension defines a simple mechanism for plugins to map URIs to integers, +usually for performance reasons (e.g. processing events typed by URIs in real +time). The expected use case is for plugins to map URIs to integers for things +they 'understand' at instantiation time, and store those values for use in the +audio thread without doing any string comparison. This allows the +extensibility of RDF with the performance of integers (or centrally defined +enumerations). + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"uri-map.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix umap: . + + + a lv2:Feature ; + owl:deprecated true ; + rdfs:label "LV2 URI Map" ; + rdfs:comment "A feature for mapping URIs to integers." ; + rdfs:seeAlso , + . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"log", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 4 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"log.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix log: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:name "LV2 Log" ; + doap:shortdesc "A feature for writing log messages." ; + doap:created "2012-01-12" ; + doap:developer ; + doap:release [ + doap:revision "2.4" ; + doap:created "2016-07-30" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add lv2_log_logger_set_map() for changing the URI map of an existing logger." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2014-01-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add missing include string.h to logger.h for memset." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2013-01-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add logger convenience API." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature, log:log, which allows plugins to print log +messages with an API similar to the standard C `printf` function. This allows, +for example, plugin logs to be nicely presented to the user in a graphical user +interface. + +Different log levels are defined by URI and passed as an LV2_URID. This +extensions defines standard levels which are expected to be understood by all +implementations and should be sufficient in most cases, but advanced +implementations may define and use additional levels to suit their needs. + +"""^^lv2:Markdown . + +log:Entry + a rdfs:Class ; + rdfs:label "Log Entry" ; + lv2:documentation """ + +Subclasses of this are passed as the `type` parameter to LV2_Log_Log methods to +describe the nature of the log entry. + +"""^^lv2:Markdown . + +log:Error + lv2:documentation """ + +An error should only be posted when a serious unexpected error occurs, and +should be actively shown to the user by the host. + +"""^^lv2:Markdown . + +log:Note + lv2:documentation """ + +A note records some useful piece of information, but may be ignored. The host +should provide passive access to note entries to the user. + +"""^^lv2:Markdown . + +log:Warning + lv2:documentation """ + +A warning should be posted when an unexpected, but non-critical, error occurs. +The host should provide passive access to warnings entries to the user, but may +also choose to actively show them. + +"""^^lv2:Markdown . + +log:Trace + lv2:documentation """ + +A trace should not be displayed during normal operation, but the host may +implement an option to display them for debugging purposes. + +This entry type is special in that one may be posted in a real-time thread. It +is assumed that if debug tracing is enabled, real-time performance is not a +concern. However, the host MUST guarantee that posting a trace _is_ real-time +safe if debug tracing is not enabled (for example, by simply ignoring the call +as early as possible). + +"""^^lv2:Markdown . + +log:log + lv2:documentation """ + +A feature which plugins may use to log messages. To support this feature, +the host must pass an LV2_Feature to LV2_Descriptor::instantiate() with URI +LV2_LOG__log and data pointed to an instance of LV2_Log_Log. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"log.ttl", +R"lv2ttl(@prefix log: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Log" ; + rdfs:comment "A feature for writing log messages." ; + rdfs:seeAlso , + . + +log:Entry + a rdfs:Class ; + rdfs:label "Entry" ; + rdfs:comment "A log entry." . + +log:Error + a rdfs:Class ; + rdfs:label "Error" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "An error message." . + +log:Note + a rdfs:Class ; + rdfs:label "Note" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "An informative message." . + +log:Warning + a rdfs:Class ; + rdfs:label "Warning" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "A warning message." . + +log:Trace + a rdfs:Class ; + rdfs:label "Trace" ; + rdfs:subClassOf log:Entry ; + rdfs:comment "A debugging trace message." . + +log:log + a lv2:Feature ; + rdfs:label "log" ; + rdfs:comment "Logging feature." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"dynmanifest", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"dynmanifest.ttl", +R"lv2ttl(@prefix dman: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Dyn Manifest" ; + rdfs:comment "Support for dynamic manifest data generation." ; + rdfs:seeAlso , + . + +dman:DynManifest + a rdfs:Class ; + rdfs:label "Dynamic Manifest" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty lv2:binary ; + owl:minCardinality 1 ; + rdfs:comment "A DynManifest MUST have at least one lv2:binary." + ] ; + rdfs:comment "Dynamic manifest for an LV2 binary." . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"dynmanifest.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix dman: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Dynamic Manifest" ; + doap:homepage ; + doap:created "2009-06-13" ; + doap:shortdesc "Support for dynamic manifest data generation." ; + doap:programming-language "C" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-04-10" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +The LV2 API, on its own, cannot be used to write plugin libraries where data is +dynamically generated at runtime, since LV2 requires needed information to be +provided in one or more static data (RDF) files. This API addresses this +limitation by extending the LV2 API. + +To detect that a plugin library implements a dynamic manifest generator, the +host checks its static manifest for a description like: + + :::turtle + + a dman:DynManifest ; + lv2:binary . + +To load the data, the host loads the library (`mydynmanifest.so` in this +example) as usual and fetches the dynamic Turtle data from it using this API. + +The host is allowed to request regeneration of the dynamic manifest multiple +times, and the plugin library is expected to provide updated data if/when +possible. All data and references provided via this API before the last +regeneration of the dynamic manifest is to be considered invalid by the host, +including plugin descriptors whose URIs were discovered using this API. + +### Accessing Data + +To access data using this API, the host must: + + 1. Call lv2_dyn_manifest_open(). + + 2. Create a `FILE` for functions to write data to (for example with `tmpfile()`). + + 3. Get a list of exposed subject URIs using lv2_dyn_manifest_get_subjects(). + + 4. Call lv2_dyn_manifest_get_data() for each URI of interest to write the + related data to the file. + + 5. Call lv2_dyn_manifest_close(). + + 6. Parse the content of the file(s). + + 7. Remove the file(s). + +Each call to the above mentioned dynamic manifest functions MUST write a +complete, valid Turtle document (including all needed prefix definitions) to +the output FILE. + +Each call to lv2_dyn_manifest_open() causes the (re)generation of the dynamic +manifest data, and invalidates all data fetched before the call. + +In case the plugin library uses this same API to access other dynamic +manifests, it MUST implement some mechanism to avoid potentially endless loops +(such as A loads B, B loads A, etc.) and, in case such a loop is detected, the +operation MUST fail. For this purpose, use of a static boolean flag is +suggested. + +### Threading Rules + +All of the functions defined by this specification belong to the Discovery +class. + + +"""^^lv2:Markdown . + +dman:DynManifest + lv2:documentation """ + +There MUST NOT be any instances of dman:DynManifest in the generated manifest. + +All relative URIs in the generated data MUST be relative to the base path that +would be used to parse a normal LV2 manifest (the bundle path). + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"worker", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 2 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"worker.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . +@prefix work: . + + + a doap:Project ; + doap:name "LV2 Worker" ; + doap:shortdesc "Support for doing non-realtime work in plugins." ; + doap:created "2012-03-22" ; + doap:developer ; + doap:release [ + doap:revision "1.2" ; + doap:created "2020-04-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension allows plugins to schedule work that must be performed in +another thread. Plugins can use this interface to safely perform work that is +not real-time safe, and receive the result in the run context. The details of +threading are managed by the host, allowing plugins to be simple and portable +while using resources more efficiently. + +This interface is designed to gracefully support single-threaded synchronous +execution, which allows the same code to work with sample accuracy for offline +rendering. For example, a sampler plugin may schedule a sample to be loaded +from disk in another thread. During live execution, the host will call the +plugin's work method from another thread, and deliver the result to the audio +thread when it is finished. However, during offline export, the +scheduled load would be executed immediately in the same thread. This +enables reproducible offline rendering, where any changes affect the output +immediately regardless of how long the work takes to execute. + +"""^^lv2:Markdown . + +work:interface + lv2:documentation """ + +The work interface provided by a plugin, LV2_Worker_Interface. + + :::turtle + + @prefix work: . + + + a lv2:Plugin ; + lv2:extensionData work:interface . + +"""^^lv2:Markdown . + +work:schedule + lv2:documentation """ + +The work scheduling feature provided by a host, LV2_Worker_Schedule. + +If the host passes this feature to LV2_Descriptor::instantiate, the plugin MAY +use it to schedule work in the audio thread, and MUST NOT call it in any other +context. Hosts MAY pass this feature to other functions as well, in which case +the plugin MAY use it to schedule work in the calling context. The plugin MUST +NOT assume any relationship between different schedule features. + +"""^^lv2:Markdown . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"worker.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix work: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Worker" ; + rdfs:comment "Support for doing non-realtime work in plugins." ; + owl:imports ; + rdfs:seeAlso , + . + +work:interface + a lv2:ExtensionData ; + rdfs:label "work interface" ; + rdfs:comment "The work interface provided by a plugin." . + +work:schedule + a lv2:Feature ; + rdfs:label "work schedule" ; + rdfs:comment "The work scheduling feature provided by a host." . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"presets", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 2 ; + lv2:microVersion 8 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"presets.ttl", +R"lv2ttl(@prefix lv2: . +@prefix owl: . +@prefix pset: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "LV2 Presets" ; + rdfs:comment "Presets for LV2 plugins." ; + rdfs:seeAlso . + +pset:Bank + a rdfs:Class ; + rdfs:label "Bank" ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty rdfs:label ; + owl:someValuesFrom xsd:string ; + rdfs:comment "A Bank MUST have at least one string rdfs:label." + ] ; + rdfs:comment "A bank of presets." . + +pset:Preset + a rdfs:Class ; + rdfs:subClassOf lv2:PluginBase ; + rdfs:label "Preset" ; + rdfs:comment "A preset for an LV2 plugin." ; + rdfs:subClassOf [ + a owl:Restriction ; + owl:onProperty rdfs:label ; + owl:someValuesFrom xsd:string ; + rdfs:comment "A Preset MUST have at least one string rdfs:label." + ] . + +pset:bank + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain pset:Preset ; + rdfs:range pset:Bank ; + rdfs:label "bank" ; + rdfs:comment "The bank this preset belongs to." . + +pset:value + a rdf:Property , + owl:DatatypeProperty , + owl:FunctionalProperty ; + rdfs:domain lv2:PortBase ; + rdfs:label "value" ; + rdfs:comment "The value of a port in a preset." . + +pset:preset + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain lv2:PluginBase ; + rdfs:range pset:Preset ; + rdfs:label "preset" ; + rdfs:comment "The preset currently applied to a plugin instance." . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"presets.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix pset: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Presets" ; + doap:shortdesc "Presets for LV2 plugins." ; + doap:created "2009-00-00" ; + doap:developer ; + doap:release [ + doap:revision "2.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Use consistent label style." + ] , [ + rdfs:label "Add preset banks." + ] + ] + ] , [ + doap:revision "2.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add pset:preset property for describing the preset currently applied to a plugin instance." + ] , [ + rdfs:label "Remove pset:appliesTo property, use lv2:appliesTo instead." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "2.2" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "2.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This is a vocabulary for LV2 plugin presets, that is, named sets of control +values and possibly other state. The structure of a pset:Preset is +deliberately identical to that of an lv2:Plugin, and can be thought of as a +plugin template or overlay. + +Presets may be defined in any bundle, including the plugin's bundle, separate +third party preset bundles, or user preset bundles saved by hosts. Since +preset data tends to be large, it is recommended that plugins describe presets +in a separate file(s) to avoid slowing down hosts. The `manifest.ttl` of a +bundle containing presets should list them like so: + + :::turtle + eg:mypreset + a pset:Preset ; + lv2:appliesTo eg:myplugin ; + rdfs:seeAlso . + +"""^^lv2:Markdown . + +pset:Preset + lv2:documentation """ + +The structure of a Preset deliberately mirrors that of a plugin, so existing +predicates can be used to describe any data associated with the preset. For +example: + + :::turtle + @prefix eg: . + + eg:mypreset + a pset:Preset ; + rdfs:label "One louder" ; + lv2:appliesTo eg:myplugin ; + lv2:port [ + lv2:symbol "volume1" ; + pset:value 11.0 + ] , [ + lv2:symbol "volume2" ; + pset:value 11.0 + ] . + +A Preset SHOULD have at least one lv2:appliesTo property. Each Port on a +Preset MUST have at least a lv2:symbol property and a pset:value property. + +Hosts SHOULD save user presets to a bundle in the user-local LV2 directory (for +example `~/.lv2`) with a name like `_.preset.lv2` +(for example `LV2_Amp_At_Eleven.preset.lv2`), where names are transformed to be +valid LV2 symbols for maximum compatibility. + +"""^^lv2:Markdown . + +pset:value + lv2:documentation """ + +This property is used in a similar way to lv2:default. + +"""^^lv2:Markdown . + +pset:preset + lv2:documentation """ + +Specifies the preset currently applied to a plugin instance. This property may +be useful for saving state, or notifying a plugin instance at run-time about a +preset change. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"event", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 12 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"event.ttl", +R"lv2ttl(@prefix ev: . +@prefix lv2: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . + + + a owl:Ontology ; + owl:deprecated true ; + rdfs:label "LV2 Event" ; + rdfs:comment "A port-based real-time generic event interface." ; + rdfs:seeAlso , + , + . + +ev:EventPort + a rdfs:Class ; + rdfs:label "Event Port" ; + rdfs:subClassOf lv2:Port ; + rdfs:comment "An LV2 event port." . + +ev:Event + a rdfs:Class ; + rdfs:label "Event" ; + rdfs:comment "A single generic time-stamped event." . + +ev:TimeStamp + a rdfs:Class ; + rdfs:label "Event Time Stamp" ; + rdfs:comment "The time stamp of an Event." . + +ev:FrameStamp + a rdfs:Class ; + rdfs:subClassOf ev:TimeStamp ; + rdfs:label "Audio Frame Time Stamp" ; + rdfs:comment "The default time stamp unit for an event." . + +ev:generic + a lv2:PortProperty ; + rdfs:label "generic event port" ; + rdfs:comment "Port works with generic events." . + +ev:supportsEvent + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort ; + rdfs:range rdfs:Class ; + rdfs:label "supports event type" ; + rdfs:comment "An event type supported by this port." . + +ev:inheritsEvent + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:OutputPort ; + rdfs:range lv2:Port ; + rdfs:label "inherits event type" ; + rdfs:comment "Output port inherits event types from an input port." . + +ev:supportsTimeStamp + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:InputPort ; + rdfs:range rdfs:Class ; + rdfs:label "supports time stamp type" ; + rdfs:comment "A time stamp type suported by this input port." . + +ev:generatesTimeStamp + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:OutputPort ; + rdfs:range rdfs:Class ; + rdfs:label "generates time stamp type" ; + rdfs:comment "A time stamp type generated by this input port." . + +ev:inheritsTimeStamp + a rdf:Property , + owl:ObjectProperty ; + rdfs:domain ev:EventPort , + lv2:OutputPort ; + rdfs:range lv2:Port ; + rdfs:label "inherits time stamp type" ; + rdfs:comment "Output port inherits time stamp types from an input port." . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"event.meta.ttl", +R"lv2ttl(@prefix dcs: . +@prefix doap: . +@prefix ev: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + doap:license ; + doap:name "LV2 Event" ; + doap:shortdesc "A port-based real-time generic event interface." ; + doap:created "2008-00-00" ; + doap:developer , + ; + doap:release [ + doap:revision "1.12" ; + doap:created "2014-08-08" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Minor documentation improvements." + ] + ] + ] , [ + doap:revision "1.10" ; + doap:created "2013-01-13" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix incorrect return type in lv2_event_get()." + ] + ] + ] , [ + doap:revision "1.8" ; + doap:created "2012-10-14" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Make event iterator gracefully handle optional ports." + ] , [ + rdfs:label "Remove asserts from event-helper.h." + ] , [ + rdfs:label "Use more precise domain and range for EventPort properties." + ] , [ + rdfs:label "Use consistent label style." + ] + ] + ] , [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Fix bug in lv2_event_reserve()." + ] , [ + rdfs:label "Fix incorrect ranges of some properties." + ] , [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system (for installation)." + ] , [ + rdfs:label "Convert documentation to HTML and use lv2:documentation." + ] , [ + rdfs:label "Use lv2:Specification to be discovered as an extension." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-11-24" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension is deprecated. New implementations +should use LV2 Atom instead. + +This extension defines a generic time-stamped event port type, which can be +used to create plugins that read and write real-time events, such as MIDI, +OSC, or any other type of event payload. The type(s) of event supported by +a port is defined in the data file for a plugin, for example: + + :::turtle + + lv2:port [ + a ev:EventPort, lv2:InputPort ; + lv2:index 0 ; + ev:supportsEvent ; + lv2:symbol "midi_input" ; + lv2:name "MIDI input" ; + ] . + +"""^^lv2:Markdown . + +ev:EventPort + lv2:documentation """ + +Ports of this type will be connected to a struct of type LV2_Event_Buffer, +defined in event.h. These ports contain a sequence of generic events (possibly +several types mixed in a single stream), the specific types of which are +defined by some URI in another LV2 extension. + +"""^^lv2:Markdown . + +ev:Event + a rdfs:Class ; + rdfs:label "Event" ; + lv2:documentation """ + +An ev:EventPort contains an LV2_Event_Buffer which contains a sequence of these +events. The binary format of LV2 events is defined by the LV2_Event struct in +event.h. + +Specific event types (such as MIDI or OSC) are defined by extensions, and +should be rdfs:subClassOf this class. + +"""^^lv2:Markdown . + +ev:TimeStamp + lv2:documentation """ + +This defines the meaning of the 'frames' and 'subframes' fields of an LV2_Event +(both unsigned 32-bit integers). + +"""^^lv2:Markdown . + +ev:FrameStamp + lv2:documentation """ + +The default time stamp unit for an LV2 event: the frames field represents audio +frames (in the sample rate passed to intantiate), and the subframes field is +1/UINT32_MAX of a frame. + +"""^^lv2:Markdown . + +ev:generic + lv2:documentation """ + +Indicates that this port does something meaningful for any event type. This is +useful for things like event mixers, delays, serialisers, and so on. + +If this property is set, hosts should consider the port suitable for any type +of event. Otherwise, hosts should consider the port 'appropriate' only for the +specific event types listed with :supportsEvent. Note that plugins must +gracefully handle unknown event types whether or not this property is present. + +"""^^lv2:Markdown . + +ev:supportsEvent + lv2:documentation """ + +Indicates that this port supports or "understands" a certain event type. + +For input ports, this means the plugin understands and does something useful +with events of this type. For output ports, this means the plugin may generate +events of this type. If the plugin never actually generates events of this +type, but might pass them through from an input, this property should not be +set (use ev:inheritsEvent for that). + +Plugins with event input ports must always gracefully handle any type of event, +even if it does not 'support' it. This property should always be set for event +types the plugin understands/generates so hosts can discover plugins +appropriate for a given scenario (for example, plugins with a MIDI input). +Hosts are not expected to consider event ports suitable for some type of event +if the relevant :supportsEvent property is not set, unless the ev:generic +property for that port is also set. + + +"""^^lv2:Markdown . + +ev:inheritsEvent + lv2:documentation """ + +Indicates that this output port might pass through events that arrived at some +other input port (or generate an event of the same type as events arriving at +that input). The host must always check the stamp type of all outputs when +connecting an input, but this property should be set whenever it applies. + + +"""^^lv2:Markdown . + +ev:supportsTimeStamp + lv2:documentation """ + +Indicates that this port supports or "understands" a certain time stamp type. +Meaningful only for input ports, the host must never connect a port to an event +buffer with a time stamp type that isn't supported by the port. + +"""^^lv2:Markdown . + +ev:generatesTimeStamp + lv2:documentation """ + +Indicates that this port may output a certain time stamp type, regardless of +the time stamp type of any input ports. + +If the port outputs stamps based on what type inputs are connected to, this +property should not be set (use the ev:inheritsTimeStamp property for that). +Hosts MUST check the time_stamp value of any output port buffers after a call +to connect_port on ANY event input port on the plugin. + +If the plugin changes the stamp_type field of an output event buffer during a +call to run(), the plugin must call the stamp_type_changed function provided by +the host in the LV2_Event_Feature struct, if it is non-NULL. + +"""^^lv2:Markdown . + +ev:inheritsTimeStamp + lv2:documentation """ + +Indicates that this port follows the time stamp type of an input port. + +This property is not necessary, but it should be set for outputs that base +their output type on an input port so the host can make more sense of the +pl)lv2ttl" R"lv2ttl(ugin and provide a more sensible interface. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} +, juce::lv2::Bundle +{ +"data-access", +{ +juce::lv2::BundleResource +{ +"manifest.ttl", +R"lv2ttl(@prefix lv2: . +@prefix rdfs: . + + + a lv2:Specification ; + lv2:minorVersion 1 ; + lv2:microVersion 6 ; + rdfs:seeAlso . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"data-access.ttl", +R"lv2ttl(@prefix da: . +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Feature ; + rdfs:label "data access" ; + rdfs:comment "A feature that provides access to plugin extension data." ; + rdfs:seeAlso , + . + +)lv2ttl" +} +, juce::lv2::BundleResource +{ +"data-access.meta.ttl", +R"lv2ttl(@prefix da: . +@prefix dcs: . +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix rdfs: . + + + a doap:Project ; + rdfs:seeAlso ; + doap:license ; + doap:name "LV2 Data Access" ; + doap:shortdesc "Provides access to plugin extension data." ; + doap:created "2008-00-00" ; + doap:developer ; + doap:release [ + doap:revision "1.6" ; + doap:created "2012-04-17" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Merge with unified LV2 package." + ] + ] + ] , [ + doap:revision "1.4" ; + doap:created "2011-11-21" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Update packaging." + ] , [ + rdfs:label "Improve documentation." + ] + ] + ] , [ + doap:revision "1.2" ; + doap:created "2011-05-26" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Add build system for installation." + ] , [ + rdfs:label "Switch to ISC license." + ] + ] + ] , [ + doap:revision "1.0" ; + doap:created "2010-10-04" ; + doap:file-release ; + dcs:blame ; + dcs:changeset [ + dcs:item [ + rdfs:label "Initial release." + ] + ] + ] ; + lv2:documentation """ + +This extension defines a feature, LV2_Extension_Data_Feature, which provides +access to LV2_Descriptor::extension_data() for plugin UIs or other potentially +remote users of a plugin. + +Note that the use of this extension by UIs violates the important principle of +UI/plugin separation, and is potentially a source of many problems. +Accordingly, **use of this extension is highly discouraged**, and plugins +should not expect hosts to support it, since it is often impossible to do so. + +To support this feature the host must pass an LV2_Feature struct to +LV2_Descriptor::extension_data() with URI LV2_DATA_ACCESS_URI and data pointed +to an instance of LV2_Extension_Data_Feature. + +"""^^lv2:Markdown . + +)lv2ttl" +} + +} +} + +}; +} + +#endif diff --git a/modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp b/modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp new file mode 100644 index 00000000..a4c269af --- /dev/null +++ b/modules/juce_audio_processors/format_types/juce_LV2SupportLibs.cpp @@ -0,0 +1,100 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "juce_lv2_config.h" + +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wc99-extensions", + "-Wcast-align", + "-Wconversion", + "-Wdeprecated-declarations", + "-Wextra-semi", + "-Wfloat-conversion", + "-Wimplicit-float-conversion", + "-Wimplicit-int-conversion", + "-Wmicrosoft-include", + "-Wmissing-field-initializers", + "-Wnullability-extension", + "-Wnullable-to-nonnull-conversion", + "-Wparentheses", + "-Wpedantic", + "-Wredundant-decls", + "-Wshorten-64-to-32", + "-Wsign-conversion", + "-Wswitch-enum", + "-Wunused-parameter", + "-Wzero-as-null-pointer-constant") +JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4100 4200 4244 4267 4389 4702 4706 4800 4996 6308 28182 28183 6385 6386 6387 6011 6282 6323 6330 6001 6031) + +extern "C" +{ + +#define is_windows_path serd_is_windows_path + +#include "serd/src/base64.c" +#include "serd/src/byte_source.c" +#include "serd/src/env.c" +#include "serd/src/n3.c" +#undef TRY +#include "serd/src/node.c" +#include "serd/src/reader.c" +#include "serd/src/string.c" +#include "serd/src/system.c" +#include "serd/src/uri.c" +#include "serd/src/writer.c" + +#undef is_windows_path + +#include "sord/src/sord.c" +#include "sord/src/syntax.c" + +#include "lilv/src/collections.c" +#include "lilv/src/filesystem.c" +#include "lilv/src/instance.c" +#include "lilv/src/lib.c" +#include "lilv/src/node.c" +#include "lilv/src/plugin.c" +#include "lilv/src/pluginclass.c" +#include "lilv/src/port.c" +#include "lilv/src/query.c" +#include "lilv/src/scalepoint.c" +#include "lilv/src/state.c" +#include "lilv/src/ui.c" +#include "lilv/src/util.c" +#include "lilv/src/world.c" +#include "lilv/src/zix/tree.c" + +#undef NS_RDF +#undef NS_XSD +#undef USTR + +#define read_object sratom_read_object +#define read_literal sratom_read_literal + +#pragma push_macro ("nil") +#undef nil +#include "LV2_SDK/sratom/src/sratom.c" +#pragma pop_macro ("nil") + +} // extern "C" diff --git a/modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp b/modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp index 183dc9cd..90efcc58 100644 --- a/modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp +++ b/modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/format_types/juce_VST3Common.h b/modules/juce_audio_processors/format_types/juce_VST3Common.h index 5c6f213b..a997fa8e 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3Common.h +++ b/modules/juce_audio_processors/format_types/juce_VST3Common.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,6 +23,8 @@ ============================================================================== */ +#pragma once + #ifndef DOXYGEN namespace juce @@ -43,7 +45,7 @@ JUCE_BEGIN_NO_SANITIZE ("vptr") return Steinberg::kNotImplemented; \ } -static bool doUIDsMatch (const Steinberg::TUID a, const Steinberg::TUID b) noexcept +inline bool doUIDsMatch (const Steinberg::TUID a, const Steinberg::TUID b) noexcept { return std::memcmp (a, b, sizeof (Steinberg::TUID)) == 0; } @@ -211,7 +213,7 @@ static Steinberg::Vst::Speaker getSpeakerType (const AudioChannelSet& set, Audio case AudioChannelSet::centreSurround: return Steinberg::Vst::kSpeakerCs; case AudioChannelSet::leftSurroundSide: return Steinberg::Vst::kSpeakerSl; case AudioChannelSet::rightSurroundSide: return Steinberg::Vst::kSpeakerSr; - case AudioChannelSet::topMiddle: return (1ull << 11); /* kSpeakerTm */ + case AudioChannelSet::topMiddle: return Steinberg::Vst::kSpeakerTc; /* kSpeakerTm */ case AudioChannelSet::topFrontLeft: return Steinberg::Vst::kSpeakerTfl; case AudioChannelSet::topFrontCentre: return Steinberg::Vst::kSpeakerTfc; case AudioChannelSet::topFrontRight: return Steinberg::Vst::kSpeakerTfr; @@ -221,8 +223,8 @@ static Steinberg::Vst::Speaker getSpeakerType (const AudioChannelSet& set, Audio case AudioChannelSet::LFE2: return Steinberg::Vst::kSpeakerLfe2; case AudioChannelSet::leftSurroundRear: return Steinberg::Vst::kSpeakerLcs; case AudioChannelSet::rightSurroundRear: return Steinberg::Vst::kSpeakerRcs; - case AudioChannelSet::wideLeft: return Steinberg::Vst::kSpeakerPl; - case AudioChannelSet::wideRight: return Steinberg::Vst::kSpeakerPr; + case AudioChannelSet::proximityLeft: return Steinberg::Vst::kSpeakerPl; + case AudioChannelSet::proximityRight: return Steinberg::Vst::kSpeakerPr; case AudioChannelSet::ambisonicACN0: return Steinberg::Vst::kSpeakerACN0; case AudioChannelSet::ambisonicACN1: return Steinberg::Vst::kSpeakerACN1; case AudioChannelSet::ambisonicACN2: return Steinberg::Vst::kSpeakerACN2; @@ -272,10 +274,9 @@ static Steinberg::Vst::Speaker getSpeakerType (const AudioChannelSet& set, Audio case AudioChannelSet::ambisonicACN33: case AudioChannelSet::ambisonicACN34: case AudioChannelSet::ambisonicACN35: - case AudioChannelSet::proximityLeft: - case AudioChannelSet::proximityRight: + case AudioChannelSet::wideLeft: + case AudioChannelSet::wideRight: case AudioChannelSet::unknown: - default: break; } @@ -330,14 +331,13 @@ static AudioChannelSet::ChannelType getChannelType (Steinberg::Vst::SpeakerArran case Steinberg::Vst::kSpeakerBfl: return AudioChannelSet::bottomFrontLeft; case Steinberg::Vst::kSpeakerBfc: return AudioChannelSet::bottomFrontCentre; case Steinberg::Vst::kSpeakerBfr: return AudioChannelSet::bottomFrontRight; - case Steinberg::Vst::kSpeakerPl: return AudioChannelSet::wideLeft; - case Steinberg::Vst::kSpeakerPr: return AudioChannelSet::wideRight; + case Steinberg::Vst::kSpeakerPl: return AudioChannelSet::proximityLeft; + case Steinberg::Vst::kSpeakerPr: return AudioChannelSet::proximityRight; case Steinberg::Vst::kSpeakerBsl: return AudioChannelSet::bottomSideLeft; case Steinberg::Vst::kSpeakerBsr: return AudioChannelSet::bottomSideRight; case Steinberg::Vst::kSpeakerBrl: return AudioChannelSet::bottomRearLeft; case Steinberg::Vst::kSpeakerBrc: return AudioChannelSet::bottomRearCentre; case Steinberg::Vst::kSpeakerBrr: return AudioChannelSet::bottomRearRight; - default: break; } auto channelType = BigInteger (static_cast (type)).findNextSetBit (0); @@ -348,42 +348,125 @@ static AudioChannelSet::ChannelType getChannelType (Steinberg::Vst::SpeakerArran return static_cast (static_cast (AudioChannelSet::discreteChannel0) + 6 + (channelType - 33)); } +namespace detail +{ + struct LayoutPair + { + Steinberg::Vst::SpeakerArrangement arrangement; + std::initializer_list channelOrder; + }; + + using namespace Steinberg::Vst::SpeakerArr; + using X = AudioChannelSet; + + /* Maps VST3 layouts to the equivalent JUCE channels, in VST3 order. + + The channel types are taken from the equivalent JUCE AudioChannelSet, and then reordered to + match the VST3 speaker positions. + */ + const LayoutPair layoutTable[] + { + { kEmpty, {} }, + { kMono, { X::centre } }, + { kStereo, { X::left, X::right } }, + { k30Cine, { X::left, X::right, X::centre } }, + { k30Music, { X::left, X::right, X::surround } }, + { k40Cine, { X::left, X::right, X::centre, X::surround } }, + { k50, { X::left, X::right, X::centre, X::leftSurround, X::rightSurround } }, + { k51, { X::left, X::right, X::centre, X::LFE, X::leftSurround, X::rightSurround } }, + { k60Cine, { X::left, X::right, X::centre, X::leftSurround, X::rightSurround, X::centreSurround } }, + { k61Cine, { X::left, X::right, X::centre, X::LFE, X::leftSurround, X::rightSurround, X::centreSurround } }, + { k60Music, { X::left, X::right, X::leftSurround, X::rightSurround, X::leftSurroundSide, X::rightSurroundSide } }, + { k61Music, { X::left, X::right, X::LFE, X::leftSurround, X::rightSurround, X::leftSurroundSide, X::rightSurroundSide } }, + { k70Music, { X::left, X::right, X::centre, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide } }, + { k70Cine, { X::left, X::right, X::centre, X::leftSurround, X::rightSurround, X::leftCentre, X::rightCentre } }, + { k71Music, { X::left, X::right, X::centre, X::LFE, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide } }, + { k71Cine, { X::left, X::right, X::centre, X::LFE, X::leftSurround, X::rightSurround, X::leftCentre, X::rightCentre } }, + { k40Music, { X::left, X::right, X::leftSurround, X::rightSurround } }, + + { k51_4, { X::left, X::right, X::centre, X::LFE, X::leftSurround, X::rightSurround, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight } }, + { k50_4, { X::left, X::right, X::centre, X::leftSurround, X::rightSurround, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight } }, + { k71_2, { X::left, X::right, X::centre, X::LFE, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide, X::topSideLeft, X::topSideRight } }, + { k70_2, { X::left, X::right, X::centre, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide, X::topSideLeft, X::topSideRight } }, + { k71_4, { X::left, X::right, X::centre, X::LFE, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight } }, + { k70_4, { X::left, X::right, X::centre, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight } }, + { k71_6, { X::left, X::right, X::centre, X::LFE, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight, X::topSideLeft, X::topSideRight } }, + { k70_6, { X::left, X::right, X::centre, X::leftSurroundRear, X::rightSurroundRear, X::leftSurroundSide, X::rightSurroundSide, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight, X::topSideLeft, X::topSideRight } }, + + // The VST3 layout uses 'left/right' and 'left-of-center/right-of-center', but the JUCE layout uses 'left/right' and 'wide-left/wide-right'. + { k91_6, { X::wideLeft, X::wideRight, X::centre, X::LFE, X::leftSurroundRear, X::rightSurroundRear, X::left, X::right, X::leftSurroundSide, X::rightSurroundSide, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight, X::topSideLeft, X::topSideRight } }, + { k90_6, { X::wideLeft, X::wideRight, X::centre, X::leftSurroundRear, X::rightSurroundRear, X::left, X::right, X::leftSurroundSide, X::rightSurroundSide, X::topFrontLeft, X::topFrontRight, X::topRearLeft, X::topRearRight, X::topSideLeft, X::topSideRight } }, + }; + + #if JUCE_DEBUG + static std::once_flag layoutTableCheckedFlag; + #endif +} + +inline bool isLayoutTableValid() +{ + for (const auto& item : detail::layoutTable) + if ((size_t) countNumberOfBits (item.arrangement) != item.channelOrder.size()) + return false; + + std::set arrangements; + + for (const auto& item : detail::layoutTable) + arrangements.insert (item.arrangement); + + if (arrangements.size() != (size_t) numElementsInArray (detail::layoutTable)) + return false; // There's a duplicate speaker arrangement + + return std::all_of (std::begin (detail::layoutTable), std::end (detail::layoutTable), [] (const auto& item) + { + return std::set (item.channelOrder).size() == item.channelOrder.size(); + }); +} + +static Array getSpeakerOrder (Steinberg::Vst::SpeakerArrangement arr) +{ + using namespace Steinberg::Vst; + using namespace Steinberg::Vst::SpeakerArr; + + #if JUCE_DEBUG + std::call_once (detail::layoutTableCheckedFlag, [] { jassert (isLayoutTableValid()); }); + #endif + + // Check if this is a layout with a hard-coded conversion + const auto arrangementMatches = [arr] (const auto& layoutPair) { return layoutPair.arrangement == arr; }; + const auto iter = std::find_if (std::begin (detail::layoutTable), std::end (detail::layoutTable), arrangementMatches); + + if (iter != std::end (detail::layoutTable)) + return iter->channelOrder; + + // There's no hard-coded conversion, so assume that the channels are in the same orders in both layouts. + const auto channels = getChannelCount (arr); + Array result; + result.ensureStorageAllocated (channels); + + for (auto i = 0; i < channels; ++i) + result.add (getChannelType (arr, getSpeaker (arr, i))); + + return result; +} + static Steinberg::Vst::SpeakerArrangement getVst3SpeakerArrangement (const AudioChannelSet& channels) noexcept { using namespace Steinberg::Vst::SpeakerArr; - if (channels == AudioChannelSet::disabled()) return kEmpty; - if (channels == AudioChannelSet::mono()) return kMono; - if (channels == AudioChannelSet::stereo()) return kStereo; - if (channels == AudioChannelSet::createLCR()) return k30Cine; - if (channels == AudioChannelSet::createLRS()) return k30Music; - if (channels == AudioChannelSet::createLCRS()) return k40Cine; - if (channels == AudioChannelSet::create5point0()) return k50; - if (channels == AudioChannelSet::create5point1()) return k51; - if (channels == AudioChannelSet::create6point0()) return k60Cine; - if (channels == AudioChannelSet::create6point1()) return k61Cine; - if (channels == AudioChannelSet::create6point0Music()) return k60Music; - if (channels == AudioChannelSet::create6point1Music()) return k61Music; - if (channels == AudioChannelSet::create7point0()) return k70Music; - if (channels == AudioChannelSet::create7point0SDDS()) return k70Cine; - if (channels == AudioChannelSet::create7point1()) return k71CineSideFill; - if (channels == AudioChannelSet::create7point1SDDS()) return k71Cine; - if (channels == AudioChannelSet::ambisonic()) return kAmbi1stOrderACN; - if (channels == AudioChannelSet::quadraphonic()) return k40Music; - if (channels == AudioChannelSet::create5point1point4()) return k51_4; - if (channels == AudioChannelSet::create7point0point2()) return k71_2 & ~(Steinberg::Vst::kSpeakerLfe); - if (channels == AudioChannelSet::create7point1point2()) return k71_2; - if (channels == AudioChannelSet::create7point0point4()) return k71_4 & ~(Steinberg::Vst::kSpeakerLfe); - if (channels == AudioChannelSet::create7point1point4()) return k71_4; - if (channels == AudioChannelSet::create7point1point6()) return k71_6; - if (channels == AudioChannelSet::create9point1point6()) return k91_6; - if (channels == AudioChannelSet::ambisonic (0)) return (1ull << 20); - if (channels == AudioChannelSet::ambisonic (1)) return (1ull << 20) | (1ull << 21) | (1ull << 22) | (1ull << 23); - #if VST_VERSION >= 0x030608 - if (channels == AudioChannelSet::ambisonic (2)) return kAmbi2cdOrderACN; - if (channels == AudioChannelSet::ambisonic (3)) return kAmbi3rdOrderACN; + #if JUCE_DEBUG + std::call_once (detail::layoutTableCheckedFlag, [] { jassert (isLayoutTableValid()); }); #endif + const auto channelSetMatches = [&channels] (const auto& layoutPair) + { + return AudioChannelSet::channelSetWithChannels (layoutPair.channelOrder) == channels; + }; + const auto iter = std::find_if (std::begin (detail::layoutTable), std::end (detail::layoutTable), channelSetMatches); + + if (iter != std::end (detail::layoutTable)) + return iter->arrangement; + Steinberg::Vst::SpeakerArrangement result = 0; for (const auto& type : channels.getChannelTypes()) @@ -392,58 +475,589 @@ static Steinberg::Vst::SpeakerArrangement getVst3SpeakerArrangement (const Audio return result; } -static AudioChannelSet getChannelSetForSpeakerArrangement (Steinberg::Vst::SpeakerArrangement arr) noexcept +inline AudioChannelSet getChannelSetForSpeakerArrangement (Steinberg::Vst::SpeakerArrangement arr) noexcept { using namespace Steinberg::Vst::SpeakerArr; - switch (arr) - { - case kEmpty: return AudioChannelSet::disabled(); - case kMono: return AudioChannelSet::mono(); - case kStereo: return AudioChannelSet::stereo(); - case k30Cine: return AudioChannelSet::createLCR(); - case k30Music: return AudioChannelSet::createLRS(); - case k40Cine: return AudioChannelSet::createLCRS(); - case k50: return AudioChannelSet::create5point0(); - case k51: return AudioChannelSet::create5point1(); - case k60Cine: return AudioChannelSet::create6point0(); - case k61Cine: return AudioChannelSet::create6point1(); - case k60Music: return AudioChannelSet::create6point0Music(); - case k61Music: return AudioChannelSet::create6point1Music(); - case k70Music: return AudioChannelSet::create7point0(); - case k70Cine: return AudioChannelSet::create7point0SDDS(); - case k71CineSideFill: return AudioChannelSet::create7point1(); - case k71Cine: return AudioChannelSet::create7point1SDDS(); - case k40Music: return AudioChannelSet::quadraphonic(); - case k71_2: return AudioChannelSet::create7point1point2(); - case k71_2 & ~(Steinberg::Vst::kSpeakerLfe): return AudioChannelSet::create7point0point2(); - case k71_4: return AudioChannelSet::create7point1point4(); - case k71_4 & ~(Steinberg::Vst::kSpeakerLfe): return AudioChannelSet::create7point0point4(); - case k71_6: return AudioChannelSet::create7point1point6(); - case (1 << 20): return AudioChannelSet::ambisonic (0); - case kAmbi1stOrderACN: return AudioChannelSet::ambisonic (1); - #if VST_VERSION >= 0x030608 - case kAmbi2cdOrderACN: return AudioChannelSet::ambisonic (2); - case kAmbi3rdOrderACN: return AudioChannelSet::ambisonic (3); - #endif + const auto result = AudioChannelSet::channelSetWithChannels (getSpeakerOrder (arr)); + + // VST3 <-> JUCE layout conversion error: report this bug to the JUCE forum + jassert (result.size() == getChannelCount (arr)); + + return result; +} + +//============================================================================== +/* + Provides fast remapping of the channels on a single bus, from VST3 order to JUCE order. + + For multi-bus plugins, you'll need several instances of this, one per bus. +*/ +struct ChannelMapping +{ + ChannelMapping (const AudioChannelSet& layout, bool activeIn) + : indices (makeChannelIndices (layout)), active (activeIn) {} + + explicit ChannelMapping (const AudioChannelSet& layout) + : ChannelMapping (layout, true) {} + + explicit ChannelMapping (const AudioProcessor::Bus& bus) + : ChannelMapping (bus.getLastEnabledLayout(), bus.isEnabled()) {} + + int getJuceChannelForVst3Channel (int vst3Channel) const { return indices[(size_t) vst3Channel]; } + + size_t size() const { return indices.size(); } + + void setActive (bool x) { active = x; } + bool isActive() const { return active; } + +private: + /* Builds a table that provides the index of the corresponding JUCE channel, given a VST3 channel. + + Depending on the mapping, the VST3 arrangement and JUCE arrangement may not contain channels + that map 1:1 via getChannelType. For example, the VST3 7.1 layout contains + 'kSpeakerLs' which maps to the 'leftSurround' channel type, but the JUCE 7.1 layout does not + contain this channel type. As a result, we need to try to map the channels sensibly, even + if there's not a 'direct' mapping. + */ + static std::vector makeChannelIndices (const AudioChannelSet& juceArrangement) + { + const auto order = getSpeakerOrder (getVst3SpeakerArrangement (juceArrangement)); + + std::vector result; + + for (const auto& type : order) + result.push_back (juceArrangement.getChannelIndexForType (type)); + + return result; } - AudioChannelSet result; + std::vector indices; + bool active = true; +}; + +class DynamicChannelMapping +{ +public: + DynamicChannelMapping (const AudioChannelSet& channelSet, bool active) + : set (channelSet), map (channelSet, active) {} + + explicit DynamicChannelMapping (const AudioChannelSet& channelSet) + : DynamicChannelMapping (channelSet, true) {} - BigInteger vstChannels (static_cast (arr)); - for (auto bit = vstChannels.findNextSetBit (0); bit != -1; bit = vstChannels.findNextSetBit (bit + 1)) + explicit DynamicChannelMapping (const AudioProcessor::Bus& bus) + : DynamicChannelMapping (bus.getLastEnabledLayout(), bus.isEnabled()) {} + + AudioChannelSet getAudioChannelSet() const { return set; } + int getJuceChannelForVst3Channel (int vst3Channel) const { return map.getJuceChannelForVst3Channel (vst3Channel); } + size_t size() const { return map.size(); } + + /* Returns true if the host has activated this bus. */ + bool isHostActive() const { return hostActive; } + /* Returns true if the AudioProcessor expects this bus to be active. */ + bool isClientActive() const { return map.isActive(); } + + void setHostActive (bool active) { hostActive = active; } + void setClientActive (bool active) { map.setActive (active); } + +private: + AudioChannelSet set; + ChannelMapping map; + bool hostActive = false; +}; + +//============================================================================== +inline auto& getAudioBusPointer (detail::Tag, Steinberg::Vst::AudioBusBuffers& data) { return data.channelBuffers32; } +inline auto& getAudioBusPointer (detail::Tag, Steinberg::Vst::AudioBusBuffers& data) { return data.channelBuffers64; } + +static inline int countUsedClientChannels (const std::vector& inputMap, + const std::vector& outputMap) +{ + const auto countUsedChannelsInVector = [] (const std::vector& map) { - AudioChannelSet::ChannelType channelType = getChannelType (arr, 1ull << static_cast (bit)); - if (channelType != AudioChannelSet::unknown) - result.addChannel (channelType); + return std::accumulate (map.begin(), map.end(), 0, [] (auto acc, const auto& item) + { + return acc + (item.isClientActive() ? (int) item.size() : 0); + }); + }; + + return jmax (countUsedChannelsInVector (inputMap), countUsedChannelsInVector (outputMap)); +} + +template +class ScratchBuffer +{ +public: + void setSize (int numChannels, int blockSize) + { + buffer.setSize (numChannels, blockSize); } - // VST3 <-> JUCE layout conversion error: report this bug to the JUCE forum - jassert (result.size() == vstChannels.countNumberOfSetBits()); + void clear() { channelCounter = 0; } - return result; + auto* getNextChannelBuffer() { return buffer.getWritePointer (channelCounter++); } + +private: + AudioBuffer buffer; + int channelCounter = 0; +}; + +template +static int countValidBuses (Steinberg::Vst::AudioBusBuffers* buffers, int32 num) +{ + return (int) std::distance (buffers, std::find_if (buffers, buffers + num, [] (auto& buf) + { + return getAudioBusPointer (detail::Tag{}, buf) == nullptr && buf.numChannels > 0; + })); } +template +static bool validateLayouts (Iterator first, Iterator last, const std::vector& map) +{ + if ((size_t) std::distance (first, last) > map.size()) + return false; + + auto mapIterator = map.begin(); + + for (auto it = first; it != last; ++it, ++mapIterator) + { + auto** busPtr = getAudioBusPointer (detail::Tag{}, *it); + const auto anyChannelIsNull = std::any_of (busPtr, busPtr + it->numChannels, [] (auto* ptr) { return ptr == nullptr; }); + + // Null channels are allowed if the bus is inactive + if ((mapIterator->isHostActive() && anyChannelIsNull) || ((int) mapIterator->size() != it->numChannels)) + return false; + } + + // If the host didn't provide the full complement of buses, it must be because the other + // buses are all deactivated. + return std::none_of (mapIterator, map.end(), [] (const auto& item) { return item.isHostActive(); }); +} + +/* + The main purpose of this class is to remap a set of buffers provided by the VST3 host into an + equivalent JUCE AudioBuffer using the JUCE channel layout/order. + + An instance of this class handles input and output remapping for a single data type (float or + double), matching the FloatType template parameter. + + This is in VST3Common.h, rather than in the VST3_Wrapper.cpp, so that we can test it. + + @see ClientBufferMapper +*/ +template +class ClientBufferMapperData +{ +public: + void prepare (int numChannels, int blockSize) + { + scratchBuffer.setSize (numChannels, blockSize); + channels.reserve ((size_t) jmin (128, numChannels)); + } + + AudioBuffer getMappedBuffer (Steinberg::Vst::ProcessData& data, + const std::vector& inputMap, + const std::vector& outputMap) + { + scratchBuffer.clear(); + channels.clear(); + + const auto usedChannels = countUsedClientChannels (inputMap, outputMap); + + // WaveLab workaround: This host may report the wrong number of inputs/outputs so re-count here + const auto vstInputs = countValidBuses (data.inputs, data.numInputs); + + if (! validateLayouts (data.inputs, data.inputs + vstInputs, inputMap)) + return getBlankBuffer (usedChannels, (int) data.numSamples); + + setUpInputChannels (data, (size_t) vstInputs, scratchBuffer, inputMap, channels); + setUpOutputChannels (scratchBuffer, outputMap, channels); + + return { channels.data(), (int) channels.size(), (int) data.numSamples }; + } + +private: + static void setUpInputChannels (Steinberg::Vst::ProcessData& data, + size_t vstInputs, + ScratchBuffer& scratchBuffer, + const std::vector& map, + std::vector& channels) + { + for (size_t busIndex = 0; busIndex < map.size(); ++busIndex) + { + const auto mapping = map[busIndex]; + + if (! mapping.isClientActive()) + continue; + + const auto originalSize = channels.size(); + + for (size_t channelIndex = 0; channelIndex < mapping.size(); ++channelIndex) + channels.push_back (scratchBuffer.getNextChannelBuffer()); + + if (mapping.isHostActive() && busIndex < vstInputs) + { + auto** busPtr = getAudioBusPointer (detail::Tag{}, data.inputs[busIndex]); + + for (size_t channelIndex = 0; channelIndex < mapping.size(); ++channelIndex) + { + FloatVectorOperations::copy (channels[(size_t) mapping.getJuceChannelForVst3Channel ((int) channelIndex) + originalSize], + busPtr[channelIndex], + (size_t) data.numSamples); + } + } + else + { + for (size_t channelIndex = 0; channelIndex < mapping.size(); ++channelIndex) + FloatVectorOperations::clear (channels[originalSize + channelIndex], (size_t) data.numSamples); + } + } + } + + static void setUpOutputChannels (ScratchBuffer& scratchBuffer, + const std::vector& map, + std::vector& channels) + { + for (size_t i = 0, initialBusIndex = 0; i < (size_t) map.size(); ++i) + { + const auto& mapping = map[i]; + + if (mapping.isClientActive()) + { + for (size_t j = 0; j < mapping.size(); ++j) + { + if (channels.size() <= initialBusIndex + j) + channels.push_back (scratchBuffer.getNextChannelBuffer()); + } + + initialBusIndex += mapping.size(); + } + } + } + + AudioBuffer getBlankBuffer (int usedChannels, int usedSamples) + { + // The host is ignoring the bus layout we requested, so we can't process sensibly! + jassertfalse; + + // Return a silent buffer for the AudioProcessor to process + for (auto i = 0; i < usedChannels; ++i) + { + channels.push_back (scratchBuffer.getNextChannelBuffer()); + FloatVectorOperations::clear (channels.back(), usedSamples); + } + + return { channels.data(), (int) channels.size(), usedSamples }; + } + + std::vector channels; + ScratchBuffer scratchBuffer; +}; + +//============================================================================== +/* + Remaps a set of buffers provided by the VST3 host into an equivalent JUCE AudioBuffer using the + JUCE channel layout/order. + + An instance of this class can remap to either a float or double JUCE buffer, as necessary. + + Although the VST3 spec requires that the bus layout does not change while the plugin is + activated and processing, some hosts get this wrong and try to enable/disable buses during + playback. This class attempts to be resilient, and should cope with buses being switched on and + off during processing. + + This is in VST3Common.h, rather than in the VST3_Wrapper.cpp, so that we can test it. + + @see ClientBufferMapper +*/ +class ClientBufferMapper +{ +public: + void updateFromProcessor (const AudioProcessor& processor) + { + struct Pair + { + std::vector& map; + bool isInput; + }; + + for (const auto& pair : { Pair { inputMap, true }, Pair { outputMap, false } }) + { + if (pair.map.empty()) + { + for (auto i = 0; i < processor.getBusCount (pair.isInput); ++i) + pair.map.emplace_back (*processor.getBus (pair.isInput, i)); + } + else + { + // The number of buses cannot change after creating a VST3 plugin! + jassert ((size_t) processor.getBusCount (pair.isInput) == pair.map.size()); + + for (size_t i = 0; i < (size_t) processor.getBusCount (pair.isInput); ++i) + { + pair.map[i] = [&] + { + DynamicChannelMapping replacement { *processor.getBus (pair.isInput, (int) i) }; + replacement.setHostActive (pair.map[i].isHostActive()); + return replacement; + }(); + } + } + } + } + + void prepare (int blockSize) + { + const auto findNumChannelsWhenAllBusesEnabled = [] (const auto& map) + { + return std::accumulate (map.cbegin(), map.cend(), 0, [] (auto acc, const auto& item) + { + return acc + (int) item.size(); + }); + }; + + const auto numChannels = jmax (findNumChannelsWhenAllBusesEnabled (inputMap), + findNumChannelsWhenAllBusesEnabled (outputMap)); + + floatData .prepare (numChannels, blockSize); + doubleData.prepare (numChannels, blockSize); + } + + void updateActiveClientBuses (const AudioProcessor::BusesLayout& clientBuses) + { + if ( (size_t) clientBuses.inputBuses .size() != inputMap .size() + || (size_t) clientBuses.outputBuses.size() != outputMap.size()) + { + jassertfalse; + return; + } + + const auto sync = [] (auto& map, auto& client) + { + for (size_t i = 0; i < map.size(); ++i) + { + jassert (client[(int) i] == AudioChannelSet::disabled() || client[(int) i] == map[i].getAudioChannelSet()); + map[i].setClientActive (client[(int) i] != AudioChannelSet::disabled()); + } + }; + + sync (inputMap, clientBuses.inputBuses); + sync (outputMap, clientBuses.outputBuses); + } + + void setInputBusHostActive (size_t bus, bool state) { setHostActive (inputMap, bus, state); } + void setOutputBusHostActive (size_t bus, bool state) { setHostActive (outputMap, bus, state); } + + auto& getData (detail::Tag) { return floatData; } + auto& getData (detail::Tag) { return doubleData; } + + AudioChannelSet getRequestedLayoutForInputBus (size_t bus) const + { + return getRequestedLayoutForBus (inputMap, bus); + } + + AudioChannelSet getRequestedLayoutForOutputBus (size_t bus) const + { + return getRequestedLayoutForBus (outputMap, bus); + } + + const std::vector& getInputMap() const { return inputMap; } + const std::vector& getOutputMap() const { return outputMap; } + +private: + static void setHostActive (std::vector& map, size_t bus, bool state) + { + if (bus < map.size()) + map[bus].setHostActive (state); + } + + static AudioChannelSet getRequestedLayoutForBus (const std::vector& map, size_t bus) + { + if (bus < map.size() && map[bus].isHostActive()) + return map[bus].getAudioChannelSet(); + + return AudioChannelSet::disabled(); + } + + ClientBufferMapperData floatData; + ClientBufferMapperData doubleData; + + std::vector inputMap; + std::vector outputMap; +}; + +//============================================================================== +/* Holds a buffer in the JUCE channel layout, and a reference to a Vst ProcessData struct, and + copies each JUCE channel to the appropriate host output channel when this object goes + out of scope. +*/ +template +class ClientRemappedBuffer +{ +public: + ClientRemappedBuffer (ClientBufferMapperData& mapperData, + const std::vector* inputMapIn, + const std::vector* outputMapIn, + Steinberg::Vst::ProcessData& hostData) + : buffer (mapperData.getMappedBuffer (hostData, *inputMapIn, *outputMapIn)), + outputMap (outputMapIn), + data (hostData) + {} + + ClientRemappedBuffer (ClientBufferMapper& mapperIn, Steinberg::Vst::ProcessData& hostData) + : ClientRemappedBuffer (mapperIn.getData (detail::Tag{}), + &mapperIn.getInputMap(), + &mapperIn.getOutputMap(), + hostData) + {} + + ~ClientRemappedBuffer() + { + // WaveLab workaround: This host may report the wrong number of inputs/outputs so re-count here + const auto vstOutputs = (size_t) countValidBuses (data.outputs, data.numOutputs); + + if (validateLayouts (data.outputs, data.outputs + vstOutputs, *outputMap)) + copyToHostOutputBuses (vstOutputs); + else + clearHostOutputBuses (vstOutputs); + } + + AudioBuffer buffer; + +private: + void copyToHostOutputBuses (size_t vstOutputs) const + { + for (size_t i = 0, juceBusOffset = 0; i < outputMap->size(); ++i) + { + const auto& mapping = (*outputMap)[i]; + + if (mapping.isHostActive() && i < vstOutputs) + { + auto& bus = data.outputs[i]; + + if (mapping.isClientActive()) + { + for (size_t j = 0; j < mapping.size(); ++j) + { + auto* hostChannel = getAudioBusPointer (detail::Tag{}, bus)[j]; + const auto juceChannel = juceBusOffset + (size_t) mapping.getJuceChannelForVst3Channel ((int) j); + FloatVectorOperations::copy (hostChannel, buffer.getReadPointer ((int) juceChannel), (size_t) data.numSamples); + } + } + else + { + for (size_t j = 0; j < mapping.size(); ++j) + { + auto* hostChannel = getAudioBusPointer (detail::Tag{}, bus)[j]; + FloatVectorOperations::clear (hostChannel, (size_t) data.numSamples); + } + } + } + + if (mapping.isClientActive()) + juceBusOffset += mapping.size(); + } + } + + void clearHostOutputBuses (size_t vstOutputs) const + { + // The host provided us with an unexpected bus layout. + jassertfalse; + + std::for_each (data.outputs, data.outputs + vstOutputs, [this] (auto& bus) + { + auto** busPtr = getAudioBusPointer (detail::Tag{}, bus); + std::for_each (busPtr, busPtr + bus.numChannels, [this] (auto* ptr) + { + if (ptr != nullptr) + FloatVectorOperations::clear (ptr, (int) data.numSamples); + }); + }); + } + + const std::vector* outputMap = nullptr; + Steinberg::Vst::ProcessData& data; + + JUCE_DECLARE_NON_COPYABLE (ClientRemappedBuffer) + JUCE_DECLARE_NON_MOVEABLE (ClientRemappedBuffer) +}; + +//============================================================================== +/* + Remaps a JUCE buffer to an equivalent VST3 layout. + + An instance of this class handles mappings for both float and double buffers, but in a single + direction (input or output). +*/ +class HostBufferMapper +{ +public: + /* Builds a cached map of juce <-> vst3 channel mappings. */ + void prepare (std::vector arrangements) + { + mappings = std::move (arrangements); + + floatBusMap .resize (mappings.size()); + doubleBusMap.resize (mappings.size()); + busBuffers .resize (mappings.size()); + } + + /* Applies the mapping to an AudioBuffer using JUCE channel layout. */ + template + Steinberg::Vst::AudioBusBuffers* getVst3LayoutForJuceBuffer (AudioBuffer& source) + { + int channelIndexOffset = 0; + + for (size_t i = 0; i < mappings.size(); ++i) + { + const auto& mapping = mappings[i]; + associateBufferTo (busBuffers[i], get (detail::Tag{})[i], source, mapping, channelIndexOffset); + channelIndexOffset += mapping.isActive() ? (int) mapping.size() : 0; + } + + return busBuffers.data(); + } + +private: + template + using Bus = std::vector; + + template + using BusMap = std::vector>; + + static void assignRawPointer (Steinberg::Vst::AudioBusBuffers& vstBuffers, float** raw) { vstBuffers.channelBuffers32 = raw; } + static void assignRawPointer (Steinberg::Vst::AudioBusBuffers& vstBuffers, double** raw) { vstBuffers.channelBuffers64 = raw; } + + template + void associateBufferTo (Steinberg::Vst::AudioBusBuffers& vstBuffers, + Bus& bus, + AudioBuffer& buffer, + const ChannelMapping& busMap, + int channelStartOffset) const + { + bus.clear(); + + for (size_t i = 0; i < busMap.size(); ++i) + { + bus.push_back (busMap.isActive() ? buffer.getWritePointer (channelStartOffset + busMap.getJuceChannelForVst3Channel ((int) i)) + : nullptr); + } + + assignRawPointer (vstBuffers, bus.data()); + vstBuffers.numChannels = (Steinberg::int32) busMap.size(); + vstBuffers.silenceFlags = busMap.isActive() ? 0 : std::numeric_limits::max(); + } + + auto& get (detail::Tag) { return floatBusMap; } + auto& get (detail::Tag) { return doubleBusMap; } + + BusMap floatBusMap; + BusMap doubleBusMap; + + std::vector busBuffers; + std::vector mappings; +}; + //============================================================================== template class VSTComSmartPtr @@ -600,31 +1214,23 @@ public: if (eventList.getEvent (i, e) != Steinberg::kResultOk) continue; - const auto message = toMidiMessage (e); - - if (message.isValid) - result.addEvent (message.item, e.sampleOffset); + if (const auto message = toMidiMessage (e)) + result.addEvent (*message, e.sampleOffset); } } - static void hostToPluginEventList (Steinberg::Vst::IEventList& result, MidiBuffer& midiBuffer, - Steinberg::Vst::IParameterChanges* parameterChanges, - const StoredMidiMapping& midiMapping) + template + static void hostToPluginEventList (Steinberg::Vst::IEventList& result, + MidiBuffer& midiBuffer, + StoredMidiMapping& mapping, + Callback&& callback) { - toEventList (result, - midiBuffer, - parameterChanges, - &midiMapping, - EventConversionKind::hostToPlugin); + toEventList (result, midiBuffer, &mapping, callback); } static void pluginToHostEventList (Steinberg::Vst::IEventList& result, MidiBuffer& midiBuffer) { - toEventList (result, - midiBuffer, - nullptr, - nullptr, - EventConversionKind::pluginToHost); + toEventList (result, midiBuffer, nullptr, [] (auto&&...) {}); } private: @@ -640,51 +1246,70 @@ private: pluginToHost }; - static void toEventList (Steinberg::Vst::IEventList& result, MidiBuffer& midiBuffer, - Steinberg::Vst::IParameterChanges* parameterChanges, - const StoredMidiMapping* midiMapping, - EventConversionKind kind) + template + static bool sendMappedParameter (const MidiMessage& msg, + StoredMidiMapping* midiMapping, + Callback&& callback) { - enum { maxNumEvents = 2048 }; // Steinberg's Host Checker states that no more than 2048 events are allowed at once - int numEvents = 0; + if (midiMapping == nullptr) + return false; - for (const auto metadata : midiBuffer) - { - if (++numEvents > maxNumEvents) - break; + const auto controlEvent = toVst3ControlEvent (msg); - auto msg = metadata.getMessage(); + if (! controlEvent.hasValue()) + return false; - if (midiMapping != nullptr && parameterChanges != nullptr) - { - Vst3MidiControlEvent controlEvent; + const auto controlParamID = midiMapping->getMapping (createSafeChannel (msg.getChannel()), + controlEvent->controllerNumber); - if (toVst3ControlEvent (msg, controlEvent)) - { - const auto controlParamID = midiMapping->getMapping (createSafeChannel (msg.getChannel()), - controlEvent.controllerNumber); + if (controlParamID != Steinberg::Vst::kNoParamId) + callback (controlParamID, controlEvent->paramValue); - if (controlParamID != Steinberg::Vst::kNoParamId) - { - Steinberg::int32 ignore; + return true; + } - if (auto* queue = parameterChanges->addParameterData (controlParamID, ignore)) - queue->addPoint (metadata.samplePosition, controlEvent.paramValue, ignore); - } + template + static void processMidiMessage (Steinberg::Vst::IEventList& result, + const MidiMessageMetadata metadata, + StoredMidiMapping* midiMapping, + Callback&& callback) + { + const auto msg = metadata.getMessage(); - continue; - } - } + if (sendMappedParameter (msg, midiMapping, std::forward (callback))) + return; - auto maybeEvent = createVstEvent (msg, metadata.data, kind); + const auto kind = midiMapping != nullptr ? EventConversionKind::hostToPlugin + : EventConversionKind::pluginToHost; - if (! maybeEvent.isValid) - continue; + auto maybeEvent = createVstEvent (msg, metadata.data, kind); + + if (! maybeEvent.hasValue()) + return; + + maybeEvent->busIndex = 0; + maybeEvent->sampleOffset = metadata.samplePosition; + result.addEvent (*maybeEvent); + } + + /* If mapping is non-null, the conversion is assumed to be host-to-plugin, or otherwise + plugin-to-host. + */ + template + static void toEventList (Steinberg::Vst::IEventList& result, + MidiBuffer& midiBuffer, + StoredMidiMapping* midiMapping, + Callback&& callback) + { + enum { maxNumEvents = 2048 }; // Steinberg's Host Checker states that no more than 2048 events are allowed at once + int numEvents = 0; + + for (const auto metadata : midiBuffer) + { + if (++numEvents > maxNumEvents) + break; - auto& e = maybeEvent.item; - e.busIndex = 0; - e.sampleOffset = metadata.samplePosition; - result.addEvent (e); + processMidiMessage (result, metadata, midiMapping, std::forward (callback)); } } @@ -801,19 +1426,9 @@ private: msg.getQuarterFrameValue()); } - template - struct BasicOptional final - { - BasicOptional() noexcept = default; - BasicOptional (const Item& i) noexcept : item { i }, isValid { true } {} - - Item item; - bool isValid{}; - }; - - static BasicOptional createVstEvent (const MidiMessage& msg, - const uint8* midiEventData, - EventConversionKind kind) noexcept + static Optional createVstEvent (const MidiMessage& msg, + const uint8* midiEventData, + EventConversionKind kind) noexcept { if (msg.isNoteOn()) return createNoteOnEvent (msg); @@ -857,7 +1472,7 @@ private: return {}; } - static BasicOptional toMidiMessage (const Steinberg::Vst::LegacyMIDICCOutEvent& e) + static Optional toMidiMessage (const Steinberg::Vst::LegacyMIDICCOutEvent& e) { if (e.controlNumber <= 127) return MidiMessage::controllerEvent (createSafeChannel (int16 (e.channel)), @@ -894,7 +1509,7 @@ private: } } - static BasicOptional toMidiMessage (const Steinberg::Vst::Event& e) + static Optional toMidiMessage (const Steinberg::Vst::Event& e) { switch (e.type) { @@ -941,205 +1556,24 @@ private: Steinberg::Vst::ParamValue paramValue; }; - static bool toVst3ControlEvent (const MidiMessage& msg, Vst3MidiControlEvent& result) + static Optional toVst3ControlEvent (const MidiMessage& msg) { if (msg.isController()) - { - result = { (Steinberg::Vst::CtrlNumber) msg.getControllerNumber(), msg.getControllerValue() / 127.0}; - return true; - } + return Vst3MidiControlEvent { (Steinberg::Vst::CtrlNumber) msg.getControllerNumber(), msg.getControllerValue() / 127.0 }; if (msg.isPitchWheel()) - { - result = { Steinberg::Vst::kPitchBend, msg.getPitchWheelValue() / 16383.0}; - return true; - } + return Vst3MidiControlEvent { Steinberg::Vst::kPitchBend, msg.getPitchWheelValue() / 16383.0}; if (msg.isChannelPressure()) - { - result = { Steinberg::Vst::kAfterTouch, msg.getChannelPressureValue() / 127.0}; - return true; - } + return Vst3MidiControlEvent { Steinberg::Vst::kAfterTouch, msg.getChannelPressureValue() / 127.0}; - result.controllerNumber = -1; - return false; + return {}; } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiEventList) }; //============================================================================== -template -struct VST3BufferExchange -{ - using Bus = Array; - using BusMap = Array; - - static void assignRawPointer (Steinberg::Vst::AudioBusBuffers& vstBuffers, float** raw) { vstBuffers.channelBuffers32 = raw; } - static void assignRawPointer (Steinberg::Vst::AudioBusBuffers& vstBuffers, double** raw) { vstBuffers.channelBuffers64 = raw; } - - /** Assigns a series of AudioBuffer's channels to an AudioBusBuffers' - @warning For speed, does not check the channel count and offsets according to the AudioBuffer - */ - static void associateBufferTo (Steinberg::Vst::AudioBusBuffers& vstBuffers, - Bus& bus, - AudioBuffer& buffer, - int numChannels, int channelStartOffset, - int sampleOffset = 0) - { - const int channelEnd = numChannels + channelStartOffset; - jassert (channelEnd >= 0 && channelEnd <= buffer.getNumChannels()); - - bus.clearQuick(); - - for (int i = channelStartOffset; i < channelEnd; ++i) - bus.add (buffer.getWritePointer (i, sampleOffset)); - - assignRawPointer (vstBuffers, (numChannels > 0 ? bus.getRawDataPointer() : nullptr)); - vstBuffers.numChannels = numChannels; - vstBuffers.silenceFlags = 0; - } - - static void mapArrangementToBuses (int& channelIndexOffset, int index, - Array& result, - BusMap& busMapToUse, const AudioChannelSet& arrangement, - AudioBuffer& source) - { - const int numChansForBus = arrangement.size(); - - if (index >= result.size()) - result.add (Steinberg::Vst::AudioBusBuffers()); - - if (index >= busMapToUse.size()) - busMapToUse.add (Bus()); - - associateBufferTo (result.getReference (index), - busMapToUse.getReference (index), - source, numChansForBus, channelIndexOffset); - - channelIndexOffset += numChansForBus; - } - - static void mapBufferToBuses (Array& result, BusMap& busMapToUse, - const Array& arrangements, - AudioBuffer& source) - { - int channelIndexOffset = 0; - - for (int i = 0; i < arrangements.size(); ++i) - mapArrangementToBuses (channelIndexOffset, i, result, busMapToUse, - arrangements.getUnchecked (i), source); - } - - static void mapBufferToBuses (Array& result, - Steinberg::Vst::IAudioProcessor& processor, - BusMap& busMapToUse, bool isInput, int numBuses, - AudioBuffer& source) - { - int channelIndexOffset = 0; - - for (int i = 0; i < numBuses; ++i) - mapArrangementToBuses (channelIndexOffset, i, - result, busMapToUse, - getArrangementForBus (&processor, isInput, i), - source); - } -}; - -template -struct VST3FloatAndDoubleBusMapCompositeHelper {}; - -struct VST3FloatAndDoubleBusMapComposite -{ - VST3BufferExchange::BusMap floatVersion; - VST3BufferExchange::BusMap doubleVersion; - - template - inline typename VST3BufferExchange::BusMap& get() { return VST3FloatAndDoubleBusMapCompositeHelper::get (*this); } -}; - - -template <> struct VST3FloatAndDoubleBusMapCompositeHelper -{ - static VST3BufferExchange::BusMap& get (VST3FloatAndDoubleBusMapComposite& impl) { return impl.floatVersion; } -}; - -template <> struct VST3FloatAndDoubleBusMapCompositeHelper -{ - static VST3BufferExchange::BusMap& get (VST3FloatAndDoubleBusMapComposite& impl) { return impl.doubleVersion; } -}; - -//============================================================================== -class FloatCache -{ - using FlagType = uint32_t; - -public: - FloatCache() = default; - - explicit FloatCache (size_t sizeIn) - : values (sizeIn), - flags (divCeil (sizeIn, numFlagBits)) - { - std::fill (values.begin(), values.end(), 0.0f); - std::fill (flags.begin(), flags.end(), 0); - } - - size_t size() const noexcept { return values.size(); } - - void setWithoutNotifying (size_t index, float value) - { - jassert (index < size()); - values[index].store (value, std::memory_order_relaxed); - } - - void set (size_t index, float value) - { - jassert (index < size()); - const auto previous = values[index].exchange (value, std::memory_order_relaxed); - const auto bit = previous == value ? ((FlagType) 0) : ((FlagType) 1 << (index % numFlagBits)); - flags[index / numFlagBits].fetch_or (bit, std::memory_order_acq_rel); - } - - float get (size_t index) const noexcept - { - jassert (index < size()); - return values[index].load (std::memory_order_relaxed); - } - - /* Calls the supplied callback for any entries which have been modified - since the last call to this function. - */ - template - void ifSet (Callback&& callback) - { - for (size_t flagIndex = 0; flagIndex < flags.size(); ++flagIndex) - { - const auto prevFlags = flags[flagIndex].exchange (0, std::memory_order_acq_rel); - - for (size_t bit = 0; bit < numFlagBits; ++bit) - { - if (prevFlags & ((FlagType) 1 << bit)) - { - const auto itemIndex = (flagIndex * numFlagBits) + bit; - callback (itemIndex, values[itemIndex].load (std::memory_order_relaxed)); - } - } - } - } - -private: - static constexpr size_t numFlagBits = 8 * sizeof (FlagType); - - static constexpr size_t divCeil (size_t a, size_t b) - { - return (a / b) + ((a % b) != 0); - } - - std::vector> values; - std::vector> flags; -}; - /* Provides very quick polling of all parameter states. We must iterate all parameters on each processBlock call to check whether any @@ -1163,15 +1597,15 @@ public: Steinberg::Vst::ParamID getParamID (Steinberg::int32 index) const noexcept { return paramIds[(size_t) index]; } - void set (Steinberg::int32 index, float value) { floatCache.set ((size_t) index, value); } - void setWithoutNotifying (Steinberg::int32 index, float value) { floatCache.setWithoutNotifying ((size_t) index, value); } + void set (Steinberg::int32 index, float value) { floatCache.setValueAndBits ((size_t) index, value, 1); } + void setWithoutNotifying (Steinberg::int32 index, float value) { floatCache.setValue ((size_t) index, value); } float get (Steinberg::int32 index) const noexcept { return floatCache.get ((size_t) index); } template void ifSet (Callback&& callback) { - floatCache.ifSet ([&] (size_t index, float value) + floatCache.ifSet ([&] (size_t index, float value, uint32_t) { callback ((Steinberg::int32) index, value); }); @@ -1179,9 +1613,10 @@ public: private: std::vector paramIds; - FloatCache floatCache; + FlaggedFloatCache<1> floatCache; }; +//============================================================================== /* Ensures that a 'restart' call only ever happens on the main thread. */ class ComponentRestarter : private AsyncUpdater { diff --git a/modules/juce_audio_processors/format_types/juce_VST3Headers.h b/modules/juce_audio_processors/format_types/juce_VST3Headers.h index 6bf806f9..297776b3 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3Headers.h +++ b/modules/juce_audio_processors/format_types/juce_VST3Headers.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,6 +23,8 @@ ============================================================================== */ +#pragma once + #if JUCE_BSD && ! JUCE_CUSTOM_VST3_SDK #error To build JUCE VST3 plug-ins on BSD you must use an external BSD-compatible VST3 SDK with JUCE_CUSTOM_VST3_SDK=1 #endif @@ -30,7 +32,8 @@ // Wow, those Steinberg guys really don't worry too much about compiler warnings. JUCE_BEGIN_IGNORE_WARNINGS_LEVEL_MSVC (0, 4505 4702 6011 6031 6221 6386 6387 6330 6001 28199) -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnon-virtual-dtor", +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-copy-dtor", + "-Wnon-virtual-dtor", "-Wreorder", "-Wunsequenced", "-Wint-to-pointer-cast", @@ -63,7 +66,8 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnon-virtual-dtor", "-Wmissing-prototypes", "-Wtype-limits", "-Wcpp", - "-W#warnings") + "-W#warnings", + "-Wmaybe-uninitialized") #undef DEVELOPMENT #define DEVELOPMENT 0 // This avoids a Clang warning in Steinberg code about unused values @@ -103,6 +107,8 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnon-virtual-dtor", #include #include #include + + #include "pslextensions/ipslviewembedding.h" #else // needed for VST_VERSION #include @@ -153,6 +159,8 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnon-virtual-dtor", #include #endif + #include "pslextensions/ipslviewembedding.h" + //============================================================================== namespace Steinberg { @@ -175,6 +183,12 @@ namespace Steinberg DEF_CLASS_IID (Linux::IEventHandler) #endif } + +namespace Presonus +{ + DEF_CLASS_IID (IPlugInViewEmbedding) +} + #endif // JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY JUCE_END_IGNORE_WARNINGS_MSVC diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp index 90121aa0..69392dea 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,6 +27,18 @@ #include "juce_VST3Headers.h" #include "juce_VST3Common.h" +#include "juce_ARACommon.h" + +#if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) +#include + +namespace ARA +{ +DEF_CLASS_IID (IMainFactory) +DEF_CLASS_IID (IPlugInEntryPoint) +DEF_CLASS_IID (IPlugInEntryPoint2) +} +#endif namespace juce { @@ -144,7 +156,7 @@ private: }; //============================================================================== -std::array getNormalisedTUID (const TUID& tuid) noexcept +static std::array getNormalisedTUID (const TUID& tuid) noexcept { const FUID fuid { tuid }; return { { fuid.getLong1(), fuid.getLong2(), fuid.getLong3(), fuid.getLong4() } }; @@ -247,7 +259,9 @@ static void setStateForAllBusesOfType (Vst::IComponent* component, } //============================================================================== -static void toProcessContext (Vst::ProcessContext& context, AudioPlayHead* playHead, double sampleRate) +static void toProcessContext (Vst::ProcessContext& context, + AudioPlayHead* playHead, + double sampleRate) { jassert (sampleRate > 0.0); //Must always be valid, as stated by the VST3 SDK @@ -255,53 +269,72 @@ static void toProcessContext (Vst::ProcessContext& context, AudioPlayHead* playH zerostruct (context); context.sampleRate = sampleRate; - auto& fr = context.frameRate; - if (playHead != nullptr) + const auto position = playHead != nullptr ? playHead->getPosition() + : nullopt; + + if (position.hasValue()) { - AudioPlayHead::CurrentPositionInfo position; - playHead->getCurrentPosition (position); + if (const auto timeInSamples = position->getTimeInSamples()) + context.projectTimeSamples = *timeInSamples; + else + jassertfalse; // The time in samples *must* be valid. - context.projectTimeSamples = position.timeInSamples; // Must always be valid, as stated by the VST3 SDK - context.projectTimeMusic = position.ppqPosition; // Does not always need to be valid... - context.tempo = position.bpm; - context.timeSigNumerator = position.timeSigNumerator; - context.timeSigDenominator = position.timeSigDenominator; - context.barPositionMusic = position.ppqPositionOfLastBarStart; - context.cycleStartMusic = position.ppqLoopStart; - context.cycleEndMusic = position.ppqLoopEnd; + if (const auto tempo = position->getBpm()) + { + context.state |= ProcessContext::kTempoValid; + context.tempo = *tempo; + } - context.frameRate.framesPerSecond = (Steinberg::uint32) position.frameRate.getBaseRate(); - context.frameRate.flags = (Steinberg::uint32) ((position.frameRate.isDrop() ? FrameRate::kDropRate : 0) - | (position.frameRate.isPullDown() ? FrameRate::kPullDownRate : 0)); + if (const auto loop = position->getLoopPoints()) + { + context.state |= ProcessContext::kCycleValid; + context.cycleStartMusic = loop->ppqStart; + context.cycleEndMusic = loop->ppqEnd; + } - if (position.isPlaying) context.state |= ProcessContext::kPlaying; - if (position.isRecording) context.state |= ProcessContext::kRecording; - if (position.isLooping) context.state |= ProcessContext::kCycleActive; - } - else - { - context.tempo = 120.0; - context.timeSigNumerator = 4; - context.timeSigDenominator = 4; - fr.framesPerSecond = 30; - fr.flags = 0; - } + if (const auto sig = position->getTimeSignature()) + { + context.state |= ProcessContext::kTimeSigValid; + context.timeSigNumerator = sig->numerator; + context.timeSigDenominator = sig->denominator; + } - if (context.projectTimeMusic >= 0.0) context.state |= ProcessContext::kProjectTimeMusicValid; - if (context.barPositionMusic >= 0.0) context.state |= ProcessContext::kBarPositionValid; - if (context.tempo > 0.0) context.state |= ProcessContext::kTempoValid; - if (context.frameRate.framesPerSecond > 0) context.state |= ProcessContext::kSmpteValid; + if (const auto pos = position->getPpqPosition()) + { + context.state |= ProcessContext::kProjectTimeMusicValid; + context.projectTimeMusic = *pos; + } - if (context.cycleStartMusic >= 0.0 - && context.cycleEndMusic > 0.0 - && context.cycleEndMusic > context.cycleStartMusic) - { - context.state |= ProcessContext::kCycleValid; - } + if (const auto barStart = position->getPpqPositionOfLastBarStart()) + { + context.state |= ProcessContext::kBarPositionValid; + context.barPositionMusic = *barStart; + } - if (context.timeSigNumerator > 0 && context.timeSigDenominator > 0) - context.state |= ProcessContext::kTimeSigValid; + if (const auto frameRate = position->getFrameRate()) + { + if (const auto offset = position->getEditOriginTime()) + { + context.state |= ProcessContext::kSmpteValid; + context.smpteOffsetSubframes = (Steinberg::int32) (80.0 * *offset * frameRate->getEffectiveRate()); + context.frameRate.framesPerSecond = (Steinberg::uint32) frameRate->getBaseRate(); + context.frameRate.flags = (Steinberg::uint32) ((frameRate->isDrop() ? FrameRate::kDropRate : 0) + | (frameRate->isPullDown() ? FrameRate::kPullDownRate : 0)); + } + } + + if (const auto hostTime = position->getHostTimeNs()) + { + context.state |= ProcessContext::kSystemTimeValid; + context.systemTime = (int64_t) *hostTime; + jassert (context.systemTime >= 0); + } + + if (position->getIsPlaying()) context.state |= ProcessContext::kPlaying; + if (position->getIsRecording()) context.state |= ProcessContext::kRecording; + if (position->getIsLooping()) context.state |= ProcessContext::kCycleActive; + } } //============================================================================== @@ -801,6 +834,20 @@ struct DescriptionFactory auto numClasses = factory->countClasses(); + // Every ARA::IMainFactory must have a matching Steinberg::IComponent. + // The match is determined by the two classes having the same name. + std::unordered_set araMainFactoryClassNames; + + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + for (Steinberg::int32 i = 0; i < numClasses; ++i) + { + PClassInfo info; + factory->getClassInfo (i, &info); + if (std::strcmp (info.category, kARAMainFactoryClass) == 0) + araMainFactoryClassNames.insert (info.name); + } + #endif + for (Steinberg::int32 i = 0; i < numClasses; ++i) { PClassInfo info; @@ -864,6 +911,9 @@ struct DescriptionFactory } } + if (araMainFactoryClassNames.find (name) != araMainFactoryClassNames.end()) + desc.hasARAExtension = true; + if (desc.uniqueId != 0) result = performOnDescription (desc); @@ -1327,10 +1377,75 @@ private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3ModuleHandle) }; +template +static int compareWithString (Type (&charArray)[N], const String& str) +{ + return std::strncmp (str.toRawUTF8(), + charArray, + std::min (str.getNumBytesAsUTF8(), (size_t) numElementsInArray (charArray))); +} + +template +static void forEachARAFactory (IPluginFactory* pluginFactory, Callback&& cb) +{ + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + const auto numClasses = pluginFactory->countClasses(); + for (Steinberg::int32 i = 0; i < numClasses; ++i) + { + PClassInfo info; + pluginFactory->getClassInfo (i, &info); + + if (std::strcmp (info.category, kARAMainFactoryClass) == 0) + { + const bool keepGoing = cb (info); + if (! keepGoing) + break; + } + } + #else + ignoreUnused (pluginFactory, cb); + #endif +} + +static std::shared_ptr getARAFactory (Steinberg::IPluginFactory* pluginFactory, const String& pluginName) +{ + std::shared_ptr factory; + + #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS) + forEachARAFactory (pluginFactory, + [&pluginFactory, &pluginName, &factory] (const auto& pcClassInfo) + { + if (compareWithString (pcClassInfo.name, pluginName) == 0) + { + ARA::IMainFactory* source; + if (pluginFactory->createInstance (pcClassInfo.cid, ARA::IMainFactory::iid, (void**) &source) + == Steinberg::kResultOk) + { + factory = getOrCreateARAFactory (source->getFactory(), + [source] (const ARA::ARAFactory*) { source->release(); }); + return false; + } + jassert (source == nullptr); + } + + return true; + }); + #else + ignoreUnused (pluginFactory, pluginName); + #endif + + return factory; +} + +static std::shared_ptr getARAFactory (VST3ModuleHandle& module) +{ + auto* pluginFactory = module.getPluginFactory(); + return getARAFactory (pluginFactory, module.getName()); +} + //============================================================================== struct VST3PluginWindow : public AudioProcessorEditor, private ComponentMovementWatcher, - private ComponentPeer::ScaleFactorListener, private IPlugFrame { VST3PluginWindow (AudioPluginInstance* owner, IPlugView* pluginView) @@ -1357,8 +1472,6 @@ struct VST3PluginWindow : public AudioProcessorEditor, if (scaleInterface != nullptr) scaleInterface->release(); - removeScaleFactorListener(); - #if JUCE_LINUX || JUCE_BSD embeddedComponent.removeClient(); #endif @@ -1418,16 +1531,19 @@ struct VST3PluginWindow : public AudioProcessorEditor, private: //============================================================================== - void componentPeerChanged() override + void componentPeerChanged() override {} + + /* Convert from the component's coordinate system to the hosted VST3's coordinate system. */ + ViewRect componentToVST3Rect (Rectangle r) const { - removeScaleFactorListener(); - currentPeer = getTopLevelComponent()->getPeer(); + const auto physical = localAreaToGlobal (r) * nativeScaleFactor * getDesktopScaleFactor(); + return { 0, 0, physical.getWidth(), physical.getHeight() }; + } - if (currentPeer != nullptr) - { - currentPeer->addScaleFactorListener (this); - nativeScaleFactor = (float) currentPeer->getPlatformScaleFactor(); - } + /* Convert from the hosted VST3's coordinate system to the component's coordinate system. */ + Rectangle vst3ToComponentRect (const ViewRect& vr) const + { + return getLocalArea (nullptr, Rectangle { vr.right, vr.bottom } / (nativeScaleFactor * getDesktopScaleFactor())); } void componentMovedOrResized (bool, bool wasResized) override @@ -1435,44 +1551,34 @@ private: if (recursiveResize || ! wasResized || getTopLevelComponent()->getPeer() == nullptr) return; - ViewRect rect; - if (view->canResize() == kResultTrue) { - rect.right = (Steinberg::int32) roundToInt ((float) getWidth() * nativeScaleFactor); - rect.bottom = (Steinberg::int32) roundToInt ((float) getHeight() * nativeScaleFactor); - + auto rect = componentToVST3Rect (getLocalBounds()); view->checkSizeConstraint (&rect); { const ScopedValueSetter recursiveResizeSetter (recursiveResize, true); - setSize (roundToInt ((float) rect.getWidth() / nativeScaleFactor), - roundToInt ((float) rect.getHeight() / nativeScaleFactor)); + const auto logicalSize = vst3ToComponentRect (rect); + setSize (logicalSize.getWidth(), logicalSize.getHeight()); } - #if JUCE_WINDOWS - setPluginWindowPos (rect); - #else embeddedComponent.setBounds (getLocalBounds()); - #endif view->onSize (&rect); } else { + ViewRect rect; warnOnFailure (view->getSize (&rect)); - #if JUCE_WINDOWS - setPluginWindowPos (rect); - #else - resizeWithRect (embeddedComponent, rect, nativeScaleFactor); - #endif + resizeWithRect (embeddedComponent, rect); } // Some plugins don't update their cursor correctly when mousing out the window Desktop::getInstance().getMainMouseSource().forceMouseCursorUpdate(); } + using ComponentMovementWatcher::componentMovedOrResized; void componentVisibilityChanged() override @@ -1481,20 +1587,14 @@ private: resizeToFit(); componentMovedOrResized (true, true); } - using ComponentMovementWatcher::componentVisibilityChanged; - void nativeScaleFactorChanged (double newScaleFactor) override - { - nativeScaleFactor = (float) newScaleFactor; - updatePluginScale(); - componentMovedOrResized (false, true); - } + using ComponentMovementWatcher::componentVisibilityChanged; void resizeToFit() { ViewRect rect; warnOnFailure (view->getSize (&rect)); - resizeWithRect (*this, rect, nativeScaleFactor); + resizeWithRect (*this, rect); } tresult PLUGIN_API resizeView (IPlugView* incomingView, ViewRect* newSize) override @@ -1503,34 +1603,28 @@ private: if (incomingView != nullptr && newSize != nullptr && incomingView == view) { - auto scaleToViewRect = [this] (int dimension) - { - return (Steinberg::int32) roundToInt ((float) dimension * nativeScaleFactor); - }; - - auto oldWidth = scaleToViewRect (getWidth()); - auto oldHeight = scaleToViewRect (getHeight()); - - resizeWithRect (embeddedComponent, *newSize, nativeScaleFactor); + const auto oldPhysicalSize = componentToVST3Rect (getLocalBounds()); + const auto logicalSize = vst3ToComponentRect (*newSize); + setSize (logicalSize.getWidth(), logicalSize.getHeight()); + embeddedComponent.setSize (logicalSize.getWidth(), logicalSize.getHeight()); #if JUCE_WINDOWS - setPluginWindowPos (*newSize); + embeddedComponent.updateHWNDBounds(); + #elif JUCE_LINUX || JUCE_BSD + embeddedComponent.updateEmbeddedBounds(); #endif - setSize (embeddedComponent.getWidth(), embeddedComponent.getHeight()); - // According to the VST3 Workflow Diagrams, a resizeView from the plugin should // always trigger a response from the host which confirms the new size. - ViewRect rect { 0, 0, - scaleToViewRect (getWidth()), - scaleToViewRect (getHeight()) }; + auto currentPhysicalSize = componentToVST3Rect (getLocalBounds()); - if (rect.right != oldWidth || rect.bottom != oldHeight + if (currentPhysicalSize.getWidth() != oldPhysicalSize.getWidth() + || currentPhysicalSize.getHeight() != oldPhysicalSize.getHeight() || ! isInOnSize) { // Guard against plug-ins immediately calling resizeView() with the same size const ScopedValueSetter inOnSizeSetter (isInOnSize, true); - view->onSize (&rect); + view->onSize (¤tPhysicalSize); } return kResultTrue; @@ -1541,10 +1635,11 @@ private: } //============================================================================== - static void resizeWithRect (Component& comp, const ViewRect& rect, float scaleFactor) + void resizeWithRect (Component& comp, const ViewRect& rect) const { - comp.setSize (jmax (10, std::abs (roundToInt ((float) rect.getWidth() / scaleFactor))), - jmax (10, std::abs (roundToInt ((float) rect.getHeight() / scaleFactor)))); + const auto logicalSize = vst3ToComponentRect (rect); + comp.setSize (jmax (10, logicalSize.getWidth()), + jmax (10, logicalSize.getHeight())); } void attachPluginWindow() @@ -1552,19 +1647,16 @@ private: if (pluginHandle == HandleFormat{}) { #if JUCE_WINDOWS - if (auto* topComp = getTopLevelComponent()) - { - peer.reset (embeddedComponent.createNewPeer (0, topComp->getWindowHandle())); - pluginHandle = (HandleFormat) peer->getNativeHandle(); - } - #else + pluginHandle = static_cast (embeddedComponent.getHWND()); + #endif + embeddedComponent.setBounds (getLocalBounds()); addAndMakeVisible (embeddedComponent); - #if JUCE_MAC - pluginHandle = (HandleFormat) embeddedComponent.getView(); - #elif JUCE_LINUX || JUCE_BSD - pluginHandle = (HandleFormat) embeddedComponent.getHostWindowID(); - #endif + + #if JUCE_MAC + pluginHandle = (HandleFormat) embeddedComponent.getView(); + #elif JUCE_LINUX || JUCE_BSD + pluginHandle = (HandleFormat) embeddedComponent.getHostWindowID(); #endif if (pluginHandle == HandleFormat{}) @@ -1583,16 +1675,6 @@ private: } } - void removeScaleFactorListener() - { - if (currentPeer == nullptr) - return; - - for (int i = 0; i < ComponentPeer::getNumPeers(); ++i) - if (ComponentPeer::getPeer (i) == currentPeer) - currentPeer->removeScaleFactorListener (this); - } - void updatePluginScale() { if (scaleInterface != nullptr) @@ -1605,7 +1687,7 @@ private: { if (scaleInterface != nullptr) { - const auto result = scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) nativeScaleFactor); + const auto result = scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) getEffectiveScale()); ignoreUnused (result); #if ! JUCE_MAC @@ -1614,38 +1696,49 @@ private: } } + void setScaleFactor (float s) override + { + userScaleFactor = s; + setContentScaleFactor(); + resizeToFit(); + } + + float getEffectiveScale() const + { + return nativeScaleFactor * userScaleFactor; + } + //============================================================================== Atomic refCount { 1 }; VSTComSmartPtr view; #if JUCE_WINDOWS - struct ChildComponent : public Component - { - ChildComponent() { setOpaque (true); } - void paint (Graphics& g) override { g.fillAll (Colours::cornflowerblue); } - using Component::createNewPeer; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildComponent) - }; + using HandleFormat = HWND; - void setPluginWindowPos (ViewRect rect) + struct ViewComponent : public HWNDComponent { - if (auto* topComp = getTopLevelComponent()) + ViewComponent() { - auto pos = (topComp->getLocalPoint (this, Point()) * nativeScaleFactor).roundToInt(); + setOpaque (true); + inner.addToDesktop (0); - ScopedThreadDPIAwarenessSetter threadDpiAwarenessSetter { pluginHandle }; - - SetWindowPos (pluginHandle, nullptr, - pos.x, pos.y, - rect.getWidth(), rect.getHeight(), - isVisible() ? SWP_SHOWWINDOW : SWP_HIDEWINDOW); + if (auto* peer = inner.getPeer()) + setHWND (peer->getNativeHandle()); } - } - ChildComponent embeddedComponent; - std::unique_ptr peer; - using HandleFormat = HWND; + void paint (Graphics& g) override { g.fillAll (Colours::black); } + + private: + struct Inner : public Component + { + Inner() { setOpaque (true); } + void paint (Graphics& g) override { g.fillAll (Colours::black); } + }; + + Inner inner; + }; + + ViewComponent embeddedComponent; #elif JUCE_MAC NSViewComponentWithParent embeddedComponent; using HandleFormat = NSView*; @@ -1661,9 +1754,35 @@ private: HandleFormat pluginHandle = {}; bool recursiveResize = false, isInOnSize = false, attachedCalled = false; - ComponentPeer* currentPeer = nullptr; Steinberg::IPlugViewContentScaleSupport* scaleInterface = nullptr; float nativeScaleFactor = 1.0f; + float userScaleFactor = 1.0f; + + struct ScaleNotifierCallback + { + VST3PluginWindow& window; + + void operator() (float platformScale) const + { + MessageManager::callAsync ([ref = Component::SafePointer (&window), platformScale] + { + if (auto* r = ref.getComponent()) + { + r->nativeScaleFactor = platformScale; + r->setContentScaleFactor(); + r->resizeToFit(); + + #if JUCE_WINDOWS + r->embeddedComponent.updateHWNDBounds(); + #elif JUCE_LINUX || JUCE_BSD + r->embeddedComponent.updateEmbeddedBounds(); + #endif + } + }); + } + }; + + NativeScaleFactorNotifier scaleNotifier { this, ScaleNotifierCallback { *this } }; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3PluginWindow) @@ -1671,6 +1790,27 @@ private: JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996) // warning about overriding deprecated methods +//============================================================================== +static bool hasARAExtension (IPluginFactory* pluginFactory, const String& pluginClassName) +{ + bool result = false; + + forEachARAFactory (pluginFactory, + [&pluginClassName, &result] (const auto& pcClassInfo) + { + if (compareWithString (pcClassInfo.name, pluginClassName) == 0) + { + result = true; + + return false; + } + + return true; + }); + + return result; +} + //============================================================================== struct VST3ComponentHolder { @@ -1796,6 +1936,8 @@ struct VST3ComponentHolder totalNumInputChannels, totalNumOutputChannels); + description.hasARAExtension = hasARAExtension (factory, description.name); + return; } @@ -2076,18 +2218,6 @@ public: void setValue (float newValue) override { pluginInstance.cachedParamValues.set (vstParamIndex, newValue); - pluginInstance.parameterDispatcher.push (vstParamIndex, newValue); - } - - /* If the editor set the value, there's no need to notify it that the parameter - value changed. Instead, we set the cachedValue (which will be read by the - processor during the next processBlock) and notify listeners that the parameter - has changed. - */ - void setValueFromEditor (float newValue) - { - pluginInstance.cachedParamValues.set (vstParamIndex, newValue); - sendValueChangedMessageToListeners (newValue); } /* If we're syncing the editor to the processor, the processor won't need to @@ -2182,13 +2312,13 @@ public: const Steinberg::int32 vstParamIndex; const Steinberg::Vst::ParamID paramID; const bool automatable; - const bool discrete = getNumSteps() != AudioProcessor::getDefaultNumParameterSteps(); const int numSteps = [&] { auto stepCount = getParameterInfo().stepCount; return stepCount == 0 ? AudioProcessor::getDefaultNumParameterSteps() : stepCount + 1; }(); + const bool discrete = getNumSteps() != AudioProcessor::getDefaultNumParameterSteps(); }; //============================================================================== @@ -2203,32 +2333,7 @@ public: ~VST3PluginInstance() override { - struct VST3Deleter : public CallbackMessage - { - VST3Deleter (VST3PluginInstance& inInstance, WaitableEvent& inEvent) - : vst3Instance (inInstance), completionSignal (inEvent) - {} - - void messageCallback() override - { - vst3Instance.cleanup(); - completionSignal.signal(); - } - - VST3PluginInstance& vst3Instance; - WaitableEvent& completionSignal; - }; - - if (MessageManager::getInstance()->isThisTheMessageThread()) - { - cleanup(); - } - else - { - WaitableEvent completionEvent; - (new VST3Deleter (*this, completionEvent))->post(); - completionEvent.wait(); - } + callOnMessageThread ([this] { cleanup(); }); } void cleanup() @@ -2311,7 +2416,8 @@ public: void getExtensions (ExtensionsVisitor& visitor) const override { - struct Extensions : public ExtensionsVisitor::VST3Client + struct Extensions : public ExtensionsVisitor::VST3Client, + public ExtensionsVisitor::ARAClient { explicit Extensions (const VST3PluginInstance* instanceIn) : instance (instanceIn) {} @@ -2324,10 +2430,21 @@ public: return instance->setStateFromPresetFile (rawData); } + void createARAFactoryAsync (std::function cb) const noexcept override + { + cb (ARAFactoryWrapper { ::juce::getARAFactory (*(instance->holder->module)) }); + } + const VST3PluginInstance* instance = nullptr; }; - visitor.visitVST3Client (Extensions { this }); + Extensions extensions { this }; + visitor.visitVST3Client (extensions); + + if (::juce::getARAFactory (*(holder->module))) + { + visitor.visitARAClient (extensions); + } } void* getPlatformSpecificData() override { return holder->component; } @@ -2435,7 +2552,9 @@ public: warnOnFailure (holder->component->activateBus (Vst::kAudio, Vst::kOutput, i, getBus (false, i)->isEnabled() ? 1 : 0)); setLatencySamples (jmax (0, (int) processor->getLatencySamples())); - cachedBusLayouts = getBusesLayout(); + + inputBusMap .prepare (createChannelMappings (true)); + outputBusMap.prepare (createChannelMappings (false)); setStateForAllMidiBuses (true); @@ -2454,13 +2573,13 @@ public: isActive = false; - setStateForAllMidiBuses (false); - if (processor != nullptr) warnOnFailureIfImplemented (processor->setProcessing (false)); if (holder->component != nullptr) warnOnFailure (holder->component->setActive (false)); + + setStateForAllMidiBuses (false); } bool supportsDoublePrecisionProcessing() const override @@ -2576,6 +2695,11 @@ public: inputParameterChanges->set (cachedParamValues.getParamID (index), value); }); + inputParameterChanges->forEach ([&] (Steinberg::int32 index, float value) + { + parameterDispatcher.push (index, value); + }); + processor->process (data); outputParameterChanges->forEach ([&] (Steinberg::int32 index, float value) @@ -2668,12 +2792,9 @@ public: // call releaseResources first! jassert (! isActive); - bool result = syncBusLayouts (layouts); - - // didn't succeed? Make sure it's back in it's original state - if (! result) - syncBusLayouts (getBusesLayout()); - + const auto previousLayout = getBusesLayout(); + const auto result = syncBusLayouts (layouts); + syncBusLayouts (previousLayout); return result; } @@ -2983,7 +3104,6 @@ public: ignoreUnused (data, sizeInBytes); } - private: //============================================================================== #if JUCE_LINUX || JUCE_BSD @@ -3017,9 +3137,7 @@ private: even if there aren't enough channels to process, as very poorly specified by the Steinberg SDK */ - VST3FloatAndDoubleBusMapComposite inputBusMap, outputBusMap; - Array inputBuses, outputBuses; - AudioProcessor::BusesLayout cachedBusLayouts; + HostBufferMapper inputBusMap, outputBusMap; StringArray programNames; Vst::ParamID programParameterID = (Vst::ParamID) -1; @@ -3044,7 +3162,9 @@ private: { Steinberg::MemoryStream stream; - if (object->getState (&stream) == kResultTrue) + const auto result = object->getState (&stream); + + if (result == kResultTrue) { MemoryBlock info (stream.getData(), (size_t) stream.getSize()); head.createNewChildElement (identifier)->addTextElement (info.toBase64Encoding()); @@ -3132,7 +3252,7 @@ private: if ((paramInfo.flags & Vst::ParameterInfo::kIsBypass) != 0) bypassParam = param; - std::function findOrCreateGroup; + std::function findOrCreateGroup; findOrCreateGroup = [&groupMap, &infoMap, &findOrCreateGroup] (Vst::UnitID groupID) { auto existingGroup = groupMap.find (groupID); @@ -3214,6 +3334,17 @@ private: setStateForAllBusesOfType (holder->component, newState, false, false); // Activate/deactivate MIDI outputs } + std::vector createChannelMappings (bool isInput) const + { + std::vector result; + result.reserve ((size_t) getBusCount (isInput)); + + for (auto i = 0; i < getBusCount (isInput); ++i) + result.emplace_back (*getBus (isInput, i)); + + return result; + } + void setupIO() { setStateForAllMidiBuses (true); @@ -3226,7 +3357,8 @@ private: warnOnFailure (processor->setupProcessing (setup)); - cachedBusLayouts = getBusesLayout(); + inputBusMap .prepare (createChannelMappings (true)); + outputBusMap.prepare (createChannelMappings (false)); setRateAndBufferSizeDetails (setup.sampleRate, (int) setup.maxSamplesPerBlock); } @@ -3303,7 +3435,7 @@ private: /** @note An IPlugView, when first created, should start with a ref-count of 1! */ IPlugView* tryCreatingView() const { - JUCE_ASSERT_MESSAGE_THREAD + JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED IPlugView* v = editController->createView (Vst::ViewType::kEditor); @@ -3317,11 +3449,8 @@ private: template void associateWith (Vst::ProcessData& destination, AudioBuffer& buffer) { - VST3BufferExchange::mapBufferToBuses (inputBuses, inputBusMap.get(), cachedBusLayouts.inputBuses, buffer); - VST3BufferExchange::mapBufferToBuses (outputBuses, outputBusMap.get(), cachedBusLayouts.outputBuses, buffer); - - destination.inputs = inputBuses.getRawDataPointer(); - destination.outputs = outputBuses.getRawDataPointer(); + destination.inputs = inputBusMap .getVst3LayoutForJuceBuffer (buffer); + destination.outputs = outputBusMap.getVst3LayoutForJuceBuffer (buffer); } void associateWith (Vst::ProcessData& destination, MidiBuffer& midiBuffer) @@ -3333,8 +3462,12 @@ private: { MidiEventList::hostToPluginEventList (*midiInputs, midiBuffer, - destination.inputParameterChanges, - storedMidiMapping); + storedMidiMapping, + [this] (const auto controlID, const auto paramValue) + { + if (auto* param = this->getParameterForID (controlID)) + param->setValueNotifyingHost ((float) paramValue); + }); } destination.inputEvents = midiInputs; @@ -3479,7 +3612,7 @@ tresult VST3HostContext::performEdit (Vst::ParamID paramID, Vst::ParamValue valu if (auto* param = plugin->getParameterForID (paramID)) { - param->setValueFromEditor ((float) valueNormalised); + param->setValueNotifyingHost ((float) valueNormalised); // did the plug-in already update the parameter internally if (plugin->editController->getParamNormalized (paramID) != (float) valueNormalised) @@ -3681,6 +3814,22 @@ void VST3PluginFormat::findAllTypesForFile (OwnedArray& resul } } +void VST3PluginFormat::createARAFactoryAsync (const PluginDescription& description, ARAFactoryCreationCallback callback) +{ + if (! description.hasARAExtension) + { + jassertfalse; + callback ({ {}, "The provided plugin does not support ARA features" }); + } + + File file (description.fileOrIdentifier); + VSTComSmartPtr pluginFactory ( + DLLHandleCache::getInstance()->findOrCreateHandle (file.getFullPathName()).getPluginFactory()); + const auto* pluginName = description.name.toRawUTF8(); + + callback ({ ARAFactoryWrapper { ::juce::getARAFactory (pluginFactory, pluginName) }, {} }); +} + void VST3PluginFormat::createPluginInstance (const PluginDescription& description, double, int, PluginCreationCallback callback) { diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h index 9c2be594..d192029e 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h +++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -68,6 +68,7 @@ public: StringArray searchPathsForPlugins (const FileSearchPath&, bool recursive, bool) override; bool doesPluginStillExist (const PluginDescription&) override; FileSearchPath getDefaultLocationsToSearch() override; + void createARAFactoryAsync (const PluginDescription&, ARAFactoryCreationCallback callback) override; private: //============================================================================== diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp new file mode 100644 index 00000000..305a705c --- /dev/null +++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat_test.cpp @@ -0,0 +1,658 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "juce_VST3Headers.h" +#include "juce_VST3Common.h" + +namespace juce +{ + +class VST3PluginFormatTests : public UnitTest +{ +public: + VST3PluginFormatTests() + : UnitTest ("VST3 Hosting", UnitTestCategories::audioProcessors) + { + } + + void runTest() override + { + beginTest ("ChannelMapping for a stereo bus performs no remapping"); + { + ChannelMapping map (AudioChannelSet::stereo()); + expect (map.size() == 2); + + expect (map.getJuceChannelForVst3Channel (0) == 0); // L -> left + expect (map.getJuceChannelForVst3Channel (1) == 1); // R -> right + } + + beginTest ("ChannelMapping for a 9.1.6 bus remaps the channels appropriately"); + { + ChannelMapping map (AudioChannelSet::create9point1point6()); + expect (map.size() == 16); + + // VST3 order is: + // L + // R + // C + // Lfe + // Ls + // Rs + // Lc + // Rc + // Sl + // Sr + // Tfl + // Tfr + // Trl + // Trr + // Tsl + // Tsr + // JUCE order is: + // Left + // Right + // Centre + // LFE + // Left Surround Side + // Right Surround Side + // Top Front Left + // Top Front Right + // Top Rear Left + // Top Rear Right + // Left Surround Rear + // Right Surround Rear + // Wide Left + // Wide Right + // Top Side Left + // Top Side Right + + expect (map.getJuceChannelForVst3Channel (0) == 12); // L -> wideLeft + expect (map.getJuceChannelForVst3Channel (1) == 13); // R -> wideRight + expect (map.getJuceChannelForVst3Channel (2) == 2); // C -> centre + expect (map.getJuceChannelForVst3Channel (3) == 3); // Lfe -> LFE + expect (map.getJuceChannelForVst3Channel (4) == 10); // Ls -> leftSurroundRear + expect (map.getJuceChannelForVst3Channel (5) == 11); // Rs -> rightSurroundRear + expect (map.getJuceChannelForVst3Channel (6) == 0); // Lc -> left + expect (map.getJuceChannelForVst3Channel (7) == 1); // Rc -> right + expect (map.getJuceChannelForVst3Channel (8) == 4); // Sl -> leftSurroundSide + expect (map.getJuceChannelForVst3Channel (9) == 5); // Sl -> leftSurroundSide + expect (map.getJuceChannelForVst3Channel (10) == 6); // Tfl -> topFrontLeft + expect (map.getJuceChannelForVst3Channel (11) == 7); // Tfr -> topFrontRight + expect (map.getJuceChannelForVst3Channel (12) == 8); // Trl -> topRearLeft + expect (map.getJuceChannelForVst3Channel (13) == 9); // Trr -> topRearRight + expect (map.getJuceChannelForVst3Channel (14) == 14); // Tsl -> topSideLeft + expect (map.getJuceChannelForVst3Channel (15) == 15); // Tsr -> topSideRight + } + + const auto blockSize = 128; + + beginTest ("If the host provides more buses than the plugin knows about, the remapped buffer is silent and uses only internal channels"); + { + ClientBufferMapperData remapper; + remapper.prepare (2, blockSize * 2); + + const std::vector emptyBuses; + const std::vector stereoBus { DynamicChannelMapping { AudioChannelSet::stereo() } }; + + TestBuffers testBuffers { blockSize }; + + auto ins = MultiBusBuffers{}.withBus (testBuffers, 2).withBus (testBuffers, 1); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 2).withBus (testBuffers, 1); + auto data = makeProcessData (blockSize, ins, outs); + + for (const auto& config : { Config { stereoBus, stereoBus }, Config { emptyBuses, stereoBus }, Config { stereoBus, emptyBuses } }) + { + testBuffers.init(); + + { + const ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == config.getNumChannels()); + expect (remapped.getNumSamples() == blockSize); + + for (auto i = 0; i < remapped.getNumChannels(); ++i) + expect (allMatch (remapped, i, 0.0f)); + } + + expect (! testBuffers.isClear (0)); + expect (! testBuffers.isClear (1)); + expect (! testBuffers.isClear (2)); + expect (testBuffers.isClear (3)); + expect (testBuffers.isClear (4)); + expect (testBuffers.isClear (5)); + } + } + + beginTest ("If the host provides fewer buses than the plugin knows about, the remapped buffer is silent and uses only internal channels"); + { + ClientBufferMapperData remapper; + remapper.prepare (3, blockSize * 2); + + const std::vector noBus; + const std::vector oneBus { DynamicChannelMapping { AudioChannelSet::mono() } }; + const std::vector twoBuses { DynamicChannelMapping { AudioChannelSet::mono() }, + DynamicChannelMapping { AudioChannelSet::stereo() } }; + + TestBuffers testBuffers { blockSize }; + + auto ins = MultiBusBuffers{}.withBus (testBuffers, 1); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 1); + auto data = makeProcessData (blockSize, ins, outs); + + for (const auto& config : { Config { noBus, twoBuses }, + Config { twoBuses, noBus }, + Config { oneBus, twoBuses }, + Config { twoBuses, oneBus }, + Config { twoBuses, twoBuses } }) + { + testBuffers.init(); + + { + const ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == config.getNumChannels()); + expect (remapped.getNumSamples() == blockSize); + + // The remapped buffer will only be cleared if the host's input layout does not + // match the client's input layout. + if (config.ins.size() != 1) + for (auto i = 0; i < remapped.getNumChannels(); ++i) + expect (allMatch (remapped, i, 0.0f)); + } + + expect (! testBuffers.isClear (0)); + expect (testBuffers.isClear (1)); + } + } + + beginTest ("If the host channel count on any bus is incorrect, the remapped buffer is silent and uses only internal channels"); + { + ClientBufferMapperData remapper; + remapper.prepare (3, blockSize * 2); + + const std::vector monoBus { DynamicChannelMapping { AudioChannelSet::mono() } }; + const std::vector stereoBus { DynamicChannelMapping { AudioChannelSet::stereo() } }; + + TestBuffers testBuffers { blockSize }; + + auto ins = MultiBusBuffers{}.withBus (testBuffers, 1); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 2); + auto data = makeProcessData (blockSize, ins, outs); + + for (const auto& config : { Config { stereoBus, monoBus }, + Config { stereoBus, stereoBus }, + Config { monoBus, monoBus } }) + { + testBuffers.init(); + + { + const ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == config.getNumChannels()); + expect (remapped.getNumSamples() == blockSize); + + // The remapped buffer will only be cleared if the host's input layout does not + // match the client's input layout. + if (config.ins.front().size() != 1) + for (auto i = 0; i < remapped.getNumChannels(); ++i) + expect (allMatch (remapped, i, 0.0f)); + } + + expect (! testBuffers.isClear (0)); + expect (testBuffers.isClear (1)); + expect (testBuffers.isClear (2)); + } + } + + beginTest ("A layout with more output channels than input channels leaves unused inputs untouched"); + { + ClientBufferMapperData remapper; + remapper.prepare (20, blockSize * 2); + + const Config config { { DynamicChannelMapping { AudioChannelSet::mono() }, + DynamicChannelMapping { AudioChannelSet::create5point1() } }, + { DynamicChannelMapping { AudioChannelSet::stereo() }, + DynamicChannelMapping { AudioChannelSet::create7point1() } } }; + + TestBuffers testBuffers { blockSize }; + + auto ins = MultiBusBuffers{}.withBus (testBuffers, 1).withBus (testBuffers, 6); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 2).withBus (testBuffers, 8); + + auto data = makeProcessData (blockSize, ins, outs); + + testBuffers.init(); + + { + ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == 10); + + // Data from the input channels is copied to the correct channels of the remapped buffer + expect (allMatch (remapped, 0, 1.0f)); + expect (allMatch (remapped, 1, 2.0f)); + expect (allMatch (remapped, 2, 3.0f)); + expect (allMatch (remapped, 3, 4.0f)); + expect (allMatch (remapped, 4, 5.0f)); + expect (allMatch (remapped, 5, 6.0f)); + expect (allMatch (remapped, 6, 7.0f)); + // The remaining channels are output-only, so they may contain any data + + // Write some data to the buffer in JUCE layout + for (auto i = 0; i < remapped.getNumChannels(); ++i) + { + auto* ptr = remapped.getWritePointer (i); + std::fill (ptr, ptr + remapped.getNumSamples(), (float) i); + } + } + + // Channels are copied back to the correct output buffer + expect (channelStartsWithValue (data.outputs[0], 0, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 1, 1.0f)); + + expect (channelStartsWithValue (data.outputs[1], 0, 2.0f)); + expect (channelStartsWithValue (data.outputs[1], 1, 3.0f)); + expect (channelStartsWithValue (data.outputs[1], 2, 4.0f)); + expect (channelStartsWithValue (data.outputs[1], 3, 5.0f)); + expect (channelStartsWithValue (data.outputs[1], 4, 8.0f)); // JUCE surround side -> VST3 surround side + expect (channelStartsWithValue (data.outputs[1], 5, 9.0f)); + expect (channelStartsWithValue (data.outputs[1], 6, 6.0f)); // JUCE surround rear -> VST3 surround rear + expect (channelStartsWithValue (data.outputs[1], 7, 7.0f)); + } + + beginTest ("A layout with more input channels than output channels doesn't attempt to output any input channels"); + { + ClientBufferMapperData remapper; + remapper.prepare (15, blockSize * 2); + + const Config config { { DynamicChannelMapping { AudioChannelSet::create7point1point6() }, + DynamicChannelMapping { AudioChannelSet::mono() } }, + { DynamicChannelMapping { AudioChannelSet::createLCRS() }, + DynamicChannelMapping { AudioChannelSet::stereo() } } }; + + TestBuffers testBuffers { blockSize }; + + auto ins = MultiBusBuffers{}.withBus (testBuffers, 14).withBus (testBuffers, 1); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 4) .withBus (testBuffers, 2); + + auto data = makeProcessData (blockSize, ins, outs); + + testBuffers.init(); + + { + ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == 15); + + // Data from the input channels is copied to the correct channels of the remapped buffer + expect (allMatch (remapped, 0, 1.0f)); + expect (allMatch (remapped, 1, 2.0f)); + expect (allMatch (remapped, 2, 3.0f)); + expect (allMatch (remapped, 3, 4.0f)); + expect (allMatch (remapped, 4, 7.0f)); + expect (allMatch (remapped, 5, 8.0f)); + expect (allMatch (remapped, 6, 9.0f)); + expect (allMatch (remapped, 7, 10.0f)); + expect (allMatch (remapped, 8, 11.0f)); + expect (allMatch (remapped, 9, 12.0f)); + expect (allMatch (remapped, 10, 5.0f)); + expect (allMatch (remapped, 11, 6.0f)); + expect (allMatch (remapped, 12, 13.0f)); + expect (allMatch (remapped, 13, 14.0f)); + expect (allMatch (remapped, 14, 15.0f)); + + // Write some data to the buffer in JUCE layout + for (auto i = 0; i < remapped.getNumChannels(); ++i) + { + auto* ptr = remapped.getWritePointer (i); + std::fill (ptr, ptr + remapped.getNumSamples(), (float) i); + } + } + + // Channels are copied back to the correct output buffer + expect (channelStartsWithValue (data.outputs[0], 0, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 1, 1.0f)); + expect (channelStartsWithValue (data.outputs[0], 2, 2.0f)); + expect (channelStartsWithValue (data.outputs[0], 3, 3.0f)); + + expect (channelStartsWithValue (data.outputs[1], 0, 4.0f)); + expect (channelStartsWithValue (data.outputs[1], 1, 5.0f)); + } + + beginTest ("Inactive buses are ignored"); + { + ClientBufferMapperData remapper; + remapper.prepare (18, blockSize * 2); + + Config config { { DynamicChannelMapping { AudioChannelSet::create7point1point6() }, + DynamicChannelMapping { AudioChannelSet::mono(), false }, + DynamicChannelMapping { AudioChannelSet::quadraphonic() }, + DynamicChannelMapping { AudioChannelSet::mono(), false } }, + { DynamicChannelMapping { AudioChannelSet::create5point0(), false }, + DynamicChannelMapping { AudioChannelSet::createLCRS() }, + DynamicChannelMapping { AudioChannelSet::stereo() } } }; + + config.ins[1].setHostActive (false); + config.ins[3].setHostActive (false); + + TestBuffers testBuffers { blockSize }; + + // The host doesn't need to provide trailing buses that are inactive, as long as the + // client knows those buses are inactive. + auto ins = MultiBusBuffers{}.withBus (testBuffers, 14).withBus (testBuffers, 1).withBus (testBuffers, 4); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 5) .withBus (testBuffers, 4).withBus (testBuffers, 2); + + auto data = makeProcessData (blockSize, ins, outs); + + testBuffers.init(); + + { + ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == 18); + + // Data from the input channels is copied to the correct channels of the remapped buffer + expect (allMatch (remapped, 0, 1.0f)); + expect (allMatch (remapped, 1, 2.0f)); + expect (allMatch (remapped, 2, 3.0f)); + expect (allMatch (remapped, 3, 4.0f)); + expect (allMatch (remapped, 4, 7.0f)); + expect (allMatch (remapped, 5, 8.0f)); + expect (allMatch (remapped, 6, 9.0f)); + expect (allMatch (remapped, 7, 10.0f)); + expect (allMatch (remapped, 8, 11.0f)); + expect (allMatch (remapped, 9, 12.0f)); + expect (allMatch (remapped, 10, 5.0f)); + expect (allMatch (remapped, 11, 6.0f)); + expect (allMatch (remapped, 12, 13.0f)); + expect (allMatch (remapped, 13, 14.0f)); + + expect (allMatch (remapped, 14, 16.0f)); + expect (allMatch (remapped, 15, 17.0f)); + expect (allMatch (remapped, 16, 18.0f)); + expect (allMatch (remapped, 17, 19.0f)); + + // Write some data to the buffer in JUCE layout + for (auto i = 0; i < remapped.getNumChannels(); ++i) + { + auto* ptr = remapped.getWritePointer (i); + std::fill (ptr, ptr + remapped.getNumSamples(), (float) i); + } + } + + // All channels on the first output bus should be cleared, because the plugin + // thinks that this bus is inactive. + expect (channelStartsWithValue (data.outputs[0], 0, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 1, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 2, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 3, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 4, 0.0f)); + + // Remaining channels should be copied back as normal + expect (channelStartsWithValue (data.outputs[1], 0, 0.0f)); + expect (channelStartsWithValue (data.outputs[1], 1, 1.0f)); + expect (channelStartsWithValue (data.outputs[1], 2, 2.0f)); + expect (channelStartsWithValue (data.outputs[1], 3, 3.0f)); + + expect (channelStartsWithValue (data.outputs[2], 0, 4.0f)); + expect (channelStartsWithValue (data.outputs[2], 1, 5.0f)); + } + + beginTest ("Null pointers are allowed on inactive buses provided to clients"); + { + ClientBufferMapperData remapper; + remapper.prepare (8, blockSize * 2); + + const std::vector emptyBuses; + const std::vector stereoBus { ChannelMapping { AudioChannelSet::stereo() } }; + + Config config { { DynamicChannelMapping { AudioChannelSet::stereo() }, + DynamicChannelMapping { AudioChannelSet::quadraphonic(), false }, + DynamicChannelMapping { AudioChannelSet::stereo() } }, + { DynamicChannelMapping { AudioChannelSet::quadraphonic() }, + DynamicChannelMapping { AudioChannelSet::stereo(), false }, + DynamicChannelMapping { AudioChannelSet::quadraphonic() } } }; + + config.ins[1].setHostActive (false); + config.outs[1].setHostActive (false); + + TestBuffers testBuffers { blockSize }; + + auto ins = MultiBusBuffers{}.withBus (testBuffers, 2).withBus (testBuffers, 4).withBus (testBuffers, 2); + auto outs = MultiBusBuffers{}.withBus (testBuffers, 4).withBus (testBuffers, 2).withBus (testBuffers, 4); + + auto data = makeProcessData (blockSize, ins, outs); + + for (auto i = 0; i < 4; ++i) + data.inputs [1].channelBuffers32[i] = nullptr; + + for (auto i = 0; i < 2; ++i) + data.outputs[1].channelBuffers32[i] = nullptr; + + testBuffers.init(); + + { + ClientRemappedBuffer scopedBuffer { remapper, &config.ins, &config.outs, data }; + auto& remapped = scopedBuffer.buffer; + + expect (remapped.getNumChannels() == 8); + + expect (allMatch (remapped, 0, 1.0f)); + expect (allMatch (remapped, 1, 2.0f)); + // skip 4 inactive channels + expect (allMatch (remapped, 2, 7.0f)); + expect (allMatch (remapped, 3, 8.0f)); + + // Write some data to the buffer in JUCE layout + for (auto i = 0; i < remapped.getNumChannels(); ++i) + { + auto* ptr = remapped.getWritePointer (i); + std::fill (ptr, ptr + remapped.getNumSamples(), (float) i); + } + } + + expect (channelStartsWithValue (data.outputs[0], 0, 0.0f)); + expect (channelStartsWithValue (data.outputs[0], 1, 1.0f)); + expect (channelStartsWithValue (data.outputs[0], 2, 2.0f)); + expect (channelStartsWithValue (data.outputs[0], 3, 3.0f)); + + expect (channelStartsWithValue (data.outputs[2], 0, 4.0f)); + expect (channelStartsWithValue (data.outputs[2], 1, 5.0f)); + expect (channelStartsWithValue (data.outputs[2], 2, 6.0f)); + expect (channelStartsWithValue (data.outputs[2], 3, 7.0f)); + } + + beginTest ("HostBufferMapper reorders channels correctly"); + { + HostBufferMapper mapper; + + { + mapper.prepare ({ ChannelMapping { AudioChannelSet::stereo() }, + ChannelMapping { AudioChannelSet::create7point1point2() }, + ChannelMapping { AudioChannelSet::create9point1point6(), false }, + ChannelMapping { AudioChannelSet::createLCRS() } }); + AudioBuffer hostBuffer (16, blockSize); + const auto* clientBuffers = mapper.getVst3LayoutForJuceBuffer (hostBuffer); + + expect (clientBuffers[0].numChannels == 2); + expect (clientBuffers[1].numChannels == 10); + // Even though it's disabled, this bus should still have the correct channel count + expect (clientBuffers[2].numChannels == 16); + expect (clientBuffers[3].numChannels == 4); + + expect (clientBuffers[0].channelBuffers32[0] == hostBuffer.getReadPointer (0)); + expect (clientBuffers[0].channelBuffers32[1] == hostBuffer.getReadPointer (1)); + + expect (clientBuffers[1].channelBuffers32[0] == hostBuffer.getReadPointer (2)); + expect (clientBuffers[1].channelBuffers32[1] == hostBuffer.getReadPointer (3)); + expect (clientBuffers[1].channelBuffers32[2] == hostBuffer.getReadPointer (4)); + expect (clientBuffers[1].channelBuffers32[3] == hostBuffer.getReadPointer (5)); + expect (clientBuffers[1].channelBuffers32[4] == hostBuffer.getReadPointer (8)); + expect (clientBuffers[1].channelBuffers32[5] == hostBuffer.getReadPointer (9)); + expect (clientBuffers[1].channelBuffers32[6] == hostBuffer.getReadPointer (6)); + expect (clientBuffers[1].channelBuffers32[7] == hostBuffer.getReadPointer (7)); + expect (clientBuffers[1].channelBuffers32[8] == hostBuffer.getReadPointer (10)); + expect (clientBuffers[1].channelBuffers32[9] == hostBuffer.getReadPointer (11)); + + for (auto i = 0; i < clientBuffers[2].numChannels; ++i) + expect (clientBuffers[2].channelBuffers32[i] == nullptr); + + expect (clientBuffers[3].channelBuffers32[0] == hostBuffer.getReadPointer (12)); + expect (clientBuffers[3].channelBuffers32[1] == hostBuffer.getReadPointer (13)); + expect (clientBuffers[3].channelBuffers32[2] == hostBuffer.getReadPointer (14)); + expect (clientBuffers[3].channelBuffers32[3] == hostBuffer.getReadPointer (15)); + } + + { + mapper.prepare ({ ChannelMapping { AudioChannelSet::mono() }, + ChannelMapping { AudioChannelSet::mono(), false }, + ChannelMapping { AudioChannelSet::mono() }, + ChannelMapping { AudioChannelSet::mono(), false } }); + AudioBuffer hostBuffer (2, blockSize); + const auto* clientBuffers = mapper.getVst3LayoutForJuceBuffer (hostBuffer); + + expect (clientBuffers[0].numChannels == 1); + expect (clientBuffers[1].numChannels == 1); + expect (clientBuffers[2].numChannels == 1); + expect (clientBuffers[3].numChannels == 1); + + expect (clientBuffers[0].channelBuffers64[0] == hostBuffer.getReadPointer (0)); + expect (clientBuffers[1].channelBuffers64[0] == nullptr); + expect (clientBuffers[2].channelBuffers64[0] == hostBuffer.getReadPointer (1)); + expect (clientBuffers[3].channelBuffers64[0] == nullptr); + } + } + } + +private: + //============================================================================== + struct Config + { + Config (std::vector i, std::vector o) + : ins (std::move (i)), outs (std::move (o)) + { + for (auto container : { &ins, &outs }) + for (auto& x : *container) + x.setHostActive (true); + } + + std::vector ins, outs; + + int getNumChannels() const { return countUsedClientChannels (ins, outs); } + }; + + struct TestBuffers + { + explicit TestBuffers (int samples) : numSamples (samples) {} + + void init() + { + auto index = 1; + + for (auto& channel : buffers) + std::fill (channel.begin(), channel.end(), (float) index++); + } + + bool allMatch (int channel, float value) const + { + const auto& buf = buffers[(size_t) channel]; + return std::all_of (buf.begin(), buf.end(), [&] (auto x) { return x == value; }); + } + + bool isClear (int channel) const + { + return allMatch (channel, 0.0f); + } + + float* addChannel() + { + buffers.emplace_back (numSamples); + return buffers.back().data(); + } + + float* get (int channel) { return buffers[(size_t) channel].data(); } + const float* get (int channel) const { return buffers[(size_t) channel].data(); } + + std::vector> buffers; + int numSamples = 0; + }; + + static bool channelStartsWithValue (Steinberg::Vst::AudioBusBuffers& bus, size_t index, float value) + { + return bus.channelBuffers32[index][0] == value; + } + + static bool allMatch (const AudioBuffer& buf, int index, float value) + { + const auto* ptr = buf.getReadPointer (index); + return std::all_of (ptr, ptr + buf.getNumSamples(), [&] (auto x) { return x == value; }); + } + + struct MultiBusBuffers + { + std::vector buffers; + std::vector> pointerStorage; + + MultiBusBuffers withBus (TestBuffers& storage, int numChannels) && + { + MultiBusBuffers result { std::move (buffers), std::move (pointerStorage) }; + + std::vector pointers; + + for (auto i = 0; i < numChannels; ++i) + pointers.push_back (storage.addChannel()); + + Steinberg::Vst::AudioBusBuffers buffer; + buffer.numChannels = (Steinberg::int32) pointers.size(); + buffer.channelBuffers32 = pointers.data(); + + result.buffers.push_back (buffer); + result.pointerStorage.push_back (std::move (pointers)); + + return result; + } + }; + + static Steinberg::Vst::ProcessData makeProcessData (int blockSize, MultiBusBuffers& ins, MultiBusBuffers& outs) + { + Steinberg::Vst::ProcessData result; + result.numSamples = blockSize; + result.inputs = ins.buffers.data(); + result.numInputs = (Steinberg::int32) ins.buffers.size(); + result.outputs = outs.buffers.data(); + result.numOutputs = (Steinberg::int32) outs.buffers.size(); + return result; + } +}; + +static VST3PluginFormatTests vst3PluginFormatTests; + +} // namespace juce diff --git a/modules/juce_audio_processors/format_types/juce_VSTCommon.h b/modules/juce_audio_processors/format_types/juce_VSTCommon.h index e3bd4edc..851eef99 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTCommon.h +++ b/modules/juce_audio_processors/format_types/juce_VSTCommon.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -301,35 +301,6 @@ struct SpeakerMappings : private AudioChannelSet // (inheritance only to give e return speakerTypeMap.at (type); } - - static AudioChannelSet::ChannelType getChannelType (int32 type) noexcept - { - switch (type) - { - case Vst2::kSpeakerL: return AudioChannelSet::left; - case Vst2::kSpeakerR: return AudioChannelSet::right; - case Vst2::kSpeakerC: return AudioChannelSet::centre; - case Vst2::kSpeakerLfe: return AudioChannelSet::LFE; - case Vst2::kSpeakerLs: return AudioChannelSet::leftSurround; - case Vst2::kSpeakerRs: return AudioChannelSet::rightSurround; - case Vst2::kSpeakerLc: return AudioChannelSet::leftCentre; - case Vst2::kSpeakerRc: return AudioChannelSet::rightCentre; - case Vst2::kSpeakerS: return AudioChannelSet::surround; - case Vst2::kSpeakerSl: return AudioChannelSet::leftSurroundRear; - case Vst2::kSpeakerSr: return AudioChannelSet::rightSurroundRear; - case Vst2::kSpeakerTm: return AudioChannelSet::topMiddle; - case Vst2::kSpeakerTfl: return AudioChannelSet::topFrontLeft; - case Vst2::kSpeakerTfc: return AudioChannelSet::topFrontCentre; - case Vst2::kSpeakerTfr: return AudioChannelSet::topFrontRight; - case Vst2::kSpeakerTrl: return AudioChannelSet::topRearLeft; - case Vst2::kSpeakerTrc: return AudioChannelSet::topRearCentre; - case Vst2::kSpeakerTrr: return AudioChannelSet::topRearRight; - case Vst2::kSpeakerLfe2: return AudioChannelSet::LFE2; - default: break; - } - - return AudioChannelSet::unknown; - } }; } // namespace juce diff --git a/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h b/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h index 4bb20628..64cb52f0 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h +++ b/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp index f9ac8a16..499c39cc 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -1090,34 +1090,7 @@ struct VSTPluginInstance final : public AudioPluginInstance, ~VSTPluginInstance() override { if (vstEffect != nullptr && vstEffect->magic == 0x56737450 /* 'VstP' */) - { - struct VSTDeleter : public CallbackMessage - { - VSTDeleter (VSTPluginInstance& inInstance, WaitableEvent& inEvent) - : vstInstance (inInstance), completionSignal (inEvent) - {} - - void messageCallback() override - { - vstInstance.cleanup(); - completionSignal.signal(); - } - - VSTPluginInstance& vstInstance; - WaitableEvent& completionSignal; - }; - - if (MessageManager::getInstance()->isThisTheMessageThread()) - { - cleanup(); - } - else - { - WaitableEvent completionEvent; - (new VSTDeleter (*this, completionEvent))->post(); - completionEvent.wait(); - } - } + callOnMessageThread ([this] { cleanup(); }); } void cleanup() @@ -1254,10 +1227,6 @@ struct VSTPluginInstance final : public AudioPluginInstance, wantsMidiMessages = pluginCanDo ("receiveVstMidiEvent") > 0 || isSynthPlugin(); - #if JUCE_MAC && JUCE_SUPPORT_CARBON - usesCocoaNSView = ((unsigned int) pluginCanDo ("hasCockosViewAsConfig") & 0xffff0000ul) == 0xbeef0000ul; - #endif - setLatencySamples (vstEffect->initialDelay); } @@ -1401,7 +1370,7 @@ struct VSTPluginInstance final : public AudioPluginInstance, if (! isPowerOn) setPower (true); - // dodgy hack to force some plugins to initialise the sample rate.. + // dodgy hack to force some plugins to initialise the sample rate. if (! hasEditor()) { if (auto* firstParam = getParameters()[0]) @@ -1701,7 +1670,7 @@ struct VSTPluginInstance final : public AudioPluginInstance, return 0; } - // handles non plugin-specific callbacks.. + // handles non plugin-specific callbacks. static pointer_sized_int handleGeneralCallback (int32 opcode, int32 /*index*/, pointer_sized_int /*value*/, void* ptr, float /*opt*/) { switch (opcode) @@ -1989,26 +1958,12 @@ struct VSTPluginInstance final : public AudioPluginInstance, return false; } - bool updateSizeFromEditor (int w, int h) - { - editorSize = { w, h }; - - if (auto* editor = getActiveEditor()) - { - editor->setSize (w, h); - return true; - } - - return false; - } - - Rectangle getEditorSize() const { return editorSize; } + bool updateSizeFromEditor (int w, int h); Vst2::AEffect* vstEffect; ModuleHandle::Ptr vstModule; std::unique_ptr extraFunctions; - bool usesCocoaNSView = false; private: //============================================================================== @@ -2083,7 +2038,6 @@ private: AudioBuffer tmpBufferDouble; HeapBlock channelBufferDouble; std::unique_ptr bypassParam; - Rectangle editorSize; std::unique_ptr xmlInfo; @@ -2148,24 +2102,11 @@ private: void setWindowSize (int width, int height) { - if (auto* ed = getActiveEditor()) - { - #if JUCE_LINUX || JUCE_BSD - const MessageManagerLock mmLock; - #endif - - #if ! JUCE_MAC - if (auto* peer = ed->getTopLevelComponent()->getPeer()) - { - auto scale = peer->getPlatformScaleFactor(); - updateSizeFromEditor (roundToInt (width / scale), roundToInt (height / scale)); - - return; - } - #endif + #if JUCE_LINUX || JUCE_BSD + const MessageManagerLock mmLock; + #endif - updateSizeFromEditor (width, height); - } + updateSizeFromEditor (width, height); } //============================================================================== @@ -2345,6 +2286,20 @@ private: return { nullptr, nullptr }; } + template + void setFromOptional (Member& target, Optional opt, int32_t flag) + { + if (opt.hasValue()) + { + target = static_cast (*opt); + vstHostTime.flags |= flag; + } + else + { + vstHostTime.flags &= ~flag; + } + } + //============================================================================== template void processAudio (AudioBuffer& buffer, MidiBuffer& midiMessages, @@ -2370,25 +2325,32 @@ private: { if (auto* currentPlayHead = getPlayHead()) { - AudioPlayHead::CurrentPositionInfo position; - - if (currentPlayHead->getCurrentPosition (position)) + if (const auto position = currentPlayHead->getPosition()) { + if (const auto samplePos = position->getTimeInSamples()) + vstHostTime.samplePos = (double) *samplePos; + else + jassertfalse; // VST hosts *must* call setTimeInSamples on the audio playhead + + if (auto sig = position->getTimeSignature()) + { + vstHostTime.flags |= Vst2::kVstTimeSigValid; + vstHostTime.timeSigNumerator = sig->numerator; + vstHostTime.timeSigDenominator = sig->denominator; + } + else + { + vstHostTime.flags &= ~Vst2::kVstTimeSigValid; + } - vstHostTime.samplePos = (double) position.timeInSamples; - vstHostTime.tempo = position.bpm; - vstHostTime.timeSigNumerator = position.timeSigNumerator; - vstHostTime.timeSigDenominator = position.timeSigDenominator; - vstHostTime.ppqPos = position.ppqPosition; - vstHostTime.barStartPos = position.ppqPositionOfLastBarStart; - vstHostTime.flags |= Vst2::kVstTempoValid - | Vst2::kVstTimeSigValid - | Vst2::kVstPpqPosValid - | Vst2::kVstBarsValid; + setFromOptional (vstHostTime.ppqPos, position->getPpqPosition(), Vst2::kVstPpqPosValid); + setFromOptional (vstHostTime.barStartPos, position->getPpqPositionOfLastBarStart(), Vst2::kVstBarsValid); + setFromOptional (vstHostTime.nanoSeconds, position->getHostTimeNs(), Vst2::kVstNanosValid); + setFromOptional (vstHostTime.tempo, position->getBpm(), Vst2::kVstTempoValid); int32 newTransportFlags = 0; - if (position.isPlaying) newTransportFlags |= Vst2::kVstTransportPlaying; - if (position.isRecording) newTransportFlags |= Vst2::kVstTransportRecording; + if (position->getIsPlaying()) newTransportFlags |= Vst2::kVstTransportPlaying; + if (position->getIsRecording()) newTransportFlags |= Vst2::kVstTransportRecording; if (newTransportFlags != (vstHostTime.flags & (Vst2::kVstTransportPlaying | Vst2::kVstTransportRecording))) @@ -2396,40 +2358,43 @@ private: else vstHostTime.flags &= ~Vst2::kVstTransportChanged; - struct OptionalFrameRate + const auto optionalFrameRate = [fr = position->getFrameRate()]() -> Optional { - bool valid; - Vst2::VstInt32 rate; - }; + if (! fr.hasValue()) + return {}; - const auto optionalFrameRate = [&fr = position.frameRate]() -> OptionalFrameRate - { - switch (fr.getBaseRate()) + switch (fr->getBaseRate()) { - case 24: return { true, fr.isPullDown() ? Vst2::kVstSmpte239fps : Vst2::kVstSmpte24fps }; - case 25: return { true, fr.isPullDown() ? Vst2::kVstSmpte249fps : Vst2::kVstSmpte25fps }; - case 30: return { true, fr.isPullDown() ? (fr.isDrop() ? Vst2::kVstSmpte2997dfps : Vst2::kVstSmpte2997fps) - : (fr.isDrop() ? Vst2::kVstSmpte30dfps : Vst2::kVstSmpte30fps) }; - case 60: return { true, fr.isPullDown() ? Vst2::kVstSmpte599fps : Vst2::kVstSmpte60fps }; + case 24: return fr->isPullDown() ? Vst2::kVstSmpte239fps : Vst2::kVstSmpte24fps; + case 25: return fr->isPullDown() ? Vst2::kVstSmpte249fps : Vst2::kVstSmpte25fps; + case 30: return fr->isPullDown() ? (fr->isDrop() ? Vst2::kVstSmpte2997dfps : Vst2::kVstSmpte2997fps) + : (fr->isDrop() ? Vst2::kVstSmpte30dfps : Vst2::kVstSmpte30fps); + case 60: return fr->isPullDown() ? Vst2::kVstSmpte599fps : Vst2::kVstSmpte60fps; } - return { false, Vst2::VstSmpteFrameRate{} }; + return {}; }(); - vstHostTime.flags |= optionalFrameRate.valid ? Vst2::kVstSmpteValid : 0; - vstHostTime.smpteFrameRate = optionalFrameRate.rate; - vstHostTime.smpteOffset = (int32) (position.timeInSeconds * 80.0 * position.frameRate.getEffectiveRate() + 0.5); + vstHostTime.flags |= optionalFrameRate ? Vst2::kVstSmpteValid : 0; + vstHostTime.smpteFrameRate = optionalFrameRate.orFallback (Vst2::VstSmpteFrameRate{}); + const auto effectiveRate = position->getFrameRate().hasValue() ? position->getFrameRate()->getEffectiveRate() : 0.0; + vstHostTime.smpteOffset = (int32) (position->getTimeInSeconds().orFallback (0.0) * 80.0 * effectiveRate + 0.5); - if (position.isLooping) + if (const auto loop = position->getLoopPoints()) { - vstHostTime.cycleStartPos = position.ppqLoopStart; - vstHostTime.cycleEndPos = position.ppqLoopEnd; - vstHostTime.flags |= (Vst2::kVstCyclePosValid | Vst2::kVstTransportCycleActive); + vstHostTime.flags |= Vst2::kVstCyclePosValid; + vstHostTime.cycleStartPos = loop->ppqStart; + vstHostTime.cycleEndPos = loop->ppqEnd; } else { - vstHostTime.flags &= ~(Vst2::kVstCyclePosValid | Vst2::kVstTransportCycleActive); + vstHostTime.flags &= ~Vst2::kVstCyclePosValid; } + + if (position->getIsLooping()) + vstHostTime.flags |= Vst2::kVstTransportCycleActive; + else + vstHostTime.flags &= ~Vst2::kVstTransportCycleActive; } } @@ -2472,13 +2437,13 @@ private: } else { - // Not initialised, so just bypass.. + // Not initialised, so just bypass. for (int i = getTotalNumOutputChannels(); --i >= 0;) buffer.clear (i, 0, buffer.getNumSamples()); } { - // copy any incoming midi.. + // copy any incoming midi. const ScopedLock sl (midiInLock); midiMessages.swapWith (incomingMidi); @@ -2593,7 +2558,7 @@ private: { char nm[256] = { 0 }; - // only do this if the plugin can't use indexed names.. + // only do this if the plugin can't use indexed names. if (dispatch (Vst2::effGetProgramNameIndexed, 0, -1, nm, 0) == 0) { auto oldProgram = getCurrentProgram(); @@ -2773,7 +2738,6 @@ static Array activeVSTWindows; struct VSTPluginWindow : public AudioProcessorEditor, #if ! JUCE_MAC private ComponentMovementWatcher, - private ComponentPeer::ScaleFactorListener, #endif private Timer { @@ -2791,18 +2755,8 @@ public: #elif JUCE_MAC ignoreUnused (recursiveResize, pluginRefusesToResize, alreadyInside); - #if JUCE_SUPPORT_CARBON - if (! plug.usesCocoaNSView) - { - carbonWrapper.reset (new CarbonWrapperComponent (*this)); - addAndMakeVisible (carbonWrapper.get()); - } - else - #endif - { - cocoaWrapper.reset (new NSViewComponentWithParent (plugin)); - addAndMakeVisible (cocoaWrapper.get()); - } + cocoaWrapper.reset (new NSViewComponentWithParent (plugin)); + addAndMakeVisible (cocoaWrapper.get()); #endif activeVSTWindows.add (this); @@ -2817,6 +2771,10 @@ public: setOpaque (true); setVisible (true); + + #if JUCE_WINDOWS + addAndMakeVisible (embeddedComponent); + #endif } ~VSTPluginWindow() override @@ -2824,12 +2782,7 @@ public: closePluginWindow(); #if JUCE_MAC - #if JUCE_SUPPORT_CARBON - carbonWrapper.reset(); - #endif cocoaWrapper.reset(); - #else - removeScaleFactorListeners(); #endif activeVSTWindows.removeFirstMatchingValue (this); @@ -2837,10 +2790,31 @@ public: } //============================================================================== - void updateSizeFromEditor (int w, int h) + /* Convert from the hosted VST's coordinate system to the component's coordinate system. */ + Rectangle vstToComponentRect (Component& editor, const Rectangle& vr) const { - if (! plugin.updateSizeFromEditor (w, h)) - setSize (w, h); + return editor.getLocalArea (nullptr, vr / (nativeScaleFactor * getDesktopScaleFactor())); + } + + Rectangle componentToVstRect (Component& editor, const Rectangle& vr) const + { + if (auto* tl = editor.getTopLevelComponent()) + return tl->getLocalArea (&editor, vr) * nativeScaleFactor * tl->getDesktopScaleFactor(); + + return {}; + } + + bool updateSizeFromEditor (int w, int h) + { + const auto correctedBounds = vstToComponentRect (*this, { w, h }); + setSize (correctedBounds.getWidth(), correctedBounds.getHeight()); + + #if JUCE_MAC + if (cocoaWrapper != nullptr) + cocoaWrapper->setSize (correctedBounds.getWidth(), correctedBounds.getHeight()); + #endif + + return true; } #if JUCE_MAC @@ -2851,29 +2825,28 @@ public: void visibilityChanged() override { - if (cocoaWrapper != nullptr) - { - if (isShowing()) - openPluginWindow ((NSView*) cocoaWrapper->getView()); - else - closePluginWindow(); - } + if (isShowing()) + openPluginWindow ((NSView*) cocoaWrapper->getView()); + else + closePluginWindow(); } void childBoundsChanged (Component*) override { - if (cocoaWrapper != nullptr) - { - auto w = cocoaWrapper->getWidth(); - auto h = cocoaWrapper->getHeight(); + auto w = cocoaWrapper->getWidth(); + auto h = cocoaWrapper->getHeight(); - if (w != getWidth() || h != getHeight()) - setSize (w, h); - } + if (w != getWidth() || h != getHeight()) + setSize (w, h); } void parentHierarchyChanged() override { visibilityChanged(); } #else + float getEffectiveScale() const + { + return nativeScaleFactor * userScaleFactor; + } + void paint (Graphics& g) override { #if JUCE_LINUX || JUCE_BSD @@ -2881,7 +2854,7 @@ public: { if (pluginWindow != 0) { - auto clip = g.getClipBounds(); + auto clip = componentToVstRect (*this, g.getClipBounds().toNearestInt()); X11Symbols::getInstance()->xClearArea (display, pluginWindow, clip.getX(), clip.getY(), static_cast (clip.getWidth()), @@ -2900,36 +2873,15 @@ public: if (recursiveResize) return; - if (auto* peer = getTopLevelComponent()->getPeer()) + if (getPeer() != nullptr) { const ScopedValueSetter recursiveResizeSetter (recursiveResize, true); - const auto pos = (peer->getAreaCoveredBy (*this).toFloat() * nativeScaleFactor).toNearestInt(); - #if JUCE_WINDOWS - if (pluginHWND != 0) - { - ScopedThreadDPIAwarenessSetter threadDpiAwarenessSetter { pluginHWND }; - SetWindowPos (pluginHWND, - HWND_BOTTOM, - pos.getX(), - pos.getY(), - 0, - 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER); - - MessageManager::callAsync ([ref = SafePointer (this)] - { - // Clean up after the editor window, in case it tried to move itself - // into the wrong location over this component. - if (ref == nullptr) - return; - - if (auto* p = ref->getPeer()) - p->repaint (p->getBounds().withPosition ({})); - }); - } + embeddedComponent.setBounds (getLocalBounds()); #elif JUCE_LINUX || JUCE_BSD + const auto pos = componentToVstRect (*this, getLocalBounds()); + if (pluginWindow != 0) { auto* symbols = X11Symbols::getInstance(); @@ -2955,8 +2907,7 @@ public: else if (! shouldAvoidDeletingWindow()) closePluginWindow(); - if (auto* peer = getTopLevelComponent()->getPeer()) - setScaleFactorAndDispatchMessage (peer->getPlatformScaleFactor()); + setContentScaleFactor(); #if JUCE_LINUX || JUCE_BSD MessageManager::callAsync ([safeThis = SafePointer { this }] @@ -2974,39 +2925,37 @@ public: void componentPeerChanged() override { closePluginWindow(); - openPluginWindow(); - - removeScaleFactorListeners(); - - if (auto* peer = getTopLevelComponent()->getPeer()) - peer->addScaleFactorListener (this); - componentMovedOrResized (true, true); - } - - void nativeScaleFactorChanged (double newScaleFactor) override - { - setScaleFactorAndDispatchMessage (newScaleFactor); - #if JUCE_WINDOWS - resizeToFit(); - #endif + if (getPeer() != nullptr) + { + openPluginWindow(); + componentMovedOrResized (true, true); + } } - void setScaleFactorAndDispatchMessage (double newScaleFactor) + void setContentScaleFactor() { - if (approximatelyEqual ((float) newScaleFactor, nativeScaleFactor)) - return; - - nativeScaleFactor = (float) newScaleFactor; - if (pluginRespondsToDPIChanges) dispatch (Vst2::effVendorSpecific, (int) ByteOrder::bigEndianInt ("PreS"), (int) ByteOrder::bigEndianInt ("AeCs"), - nullptr, nativeScaleFactor); + nullptr, getEffectiveScale()); } #endif + void setScaleFactor (float scale) override + { + userScaleFactor = scale; + + #if ! JUCE_MAC + setContentScaleFactor(); + #endif + + #if JUCE_WINDOWS + resizeToFit(); + #endif + } + //============================================================================== bool keyStateChanged (bool) override { return pluginWantsKeys; } bool keyPressed (const juce::KeyPress&) override { return pluginWantsKeys; } @@ -3029,7 +2978,14 @@ public: if (! reentrantGuard) { reentrantGuard = true; + + #if JUCE_WINDOWS + // Some plugins may draw/resize inside their idle callback, so ensure that + // DPI awareness is set correctly inside this call. + ScopedThreadDPIAwarenessSetter scope (getPluginHWND()); + #endif plugin.dispatch (Vst2::effEditIdle, 0, 0, nullptr, 0); + reentrantGuard = false; } @@ -3076,7 +3032,7 @@ private: } // This is an old workaround for some plugins that need a repaint when their - // windows are first created, but it breaks some Izotope plugins.. + // windows are first created, but it breaks some Izotope plugins. bool shouldRepaintCarbonWindowWhenCreated() { return ! plugin.getName().containsIgnoreCase ("izotope"); @@ -3128,7 +3084,7 @@ private: #else void openPluginWindow() { - if (isOpen || getWindowHandle() == nullptr) + if (isOpen) return; JUCE_VST_LOG ("Opening VST UI: " + plugin.getName()); @@ -3136,13 +3092,18 @@ private: pluginRespondsToDPIChanges = plugin.pluginCanDo ("supportsViewDpiScaling") > 0; - if (auto* peer = getTopLevelComponent()->getPeer()) - setScaleFactorAndDispatchMessage (peer->getPlatformScaleFactor()); + setContentScaleFactor(); Vst2::ERect* rect = nullptr; dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0); - dispatch (Vst2::effEditOpen, 0, 0, getWindowHandle(), 0); + + #if JUCE_WINDOWS + auto* handle = embeddedComponent.getHWND(); + #else + auto* handle = getWindowHandle(); + #endif + dispatch (Vst2::effEditOpen, 0, 0, handle, 0); dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0); // do this before and after like in the steinberg example dispatch (Vst2::effGetProgram, 0, 0, nullptr, 0); // also in steinberg code @@ -3150,7 +3111,7 @@ private: #if JUCE_WINDOWS originalWndProc = 0; - pluginHWND = GetWindow ((HWND) getWindowHandle(), GW_CHILD); + auto* pluginHWND = getPluginHWND(); if (pluginHWND == 0) { @@ -3193,7 +3154,7 @@ private: ScopedThreadDPIAwarenessSetter threadDpiAwarenessSetter { pluginHWND }; SetWindowPos (pluginHWND, 0, - 0, 0, roundToInt (rw * nativeScaleFactor), roundToInt (rh * nativeScaleFactor), + 0, 0, rw, rh, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER); GetWindowRect (pluginHWND, &r); @@ -3229,9 +3190,6 @@ private: X11Symbols::getInstance()->xMapRaised (display, pluginWindow); #endif - w = roundToInt ((float) w / nativeScaleFactor); - h = roundToInt ((float) h / nativeScaleFactor); - // double-check it's not too tiny w = jmax (w, 32); h = jmax (h, 32); @@ -3245,13 +3203,6 @@ private: startTimer (18 + juce::Random::getSystemRandom().nextInt (5)); repaint(); } - - void removeScaleFactorListeners() - { - for (int i = 0; i < ComponentPeer::getNumPeers(); ++i) - if (auto* peer = ComponentPeer::getPeer (i)) - peer->removeScaleFactorListener (this); - } #endif //============================================================================== @@ -3260,7 +3211,7 @@ private: if (isOpen) { // You shouldn't end up hitting this assertion unless the host is trying to do GUI - // cleanup on a non-GUI thread.. If it does that, bad things could happen in here.. + // cleanup on a non-GUI thread. If it does that, bad things could happen in here. JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED JUCE_VST_LOG ("Closing VST UI: " + plugin.getName()); @@ -3270,12 +3221,13 @@ private: #if JUCE_WINDOWS JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4244) + auto* pluginHWND = getPluginHWND(); + if (originalWndProc != 0 && pluginHWND != 0 && IsWindow (pluginHWND)) SetWindowLongPtr (pluginHWND, GWLP_WNDPROC, (LONG_PTR) originalWndProc); JUCE_END_IGNORE_WARNINGS_MSVC originalWndProc = 0; - pluginHWND = 0; #elif JUCE_LINUX || JUCE_BSD pluginWindow = 0; #endif @@ -3295,7 +3247,8 @@ private: if (pluginRefusesToResize) return true; - return (isWithin (w, getWidth(), 5) && isWithin (h, getHeight(), 5)); + const auto converted = vstToComponentRect (*this, { w, h }); + return (isWithin (converted.getWidth(), getWidth(), 5) && isWithin (converted.getHeight(), getHeight(), 5)); } void resizeToFit() @@ -3303,14 +3256,16 @@ private: Vst2::ERect* rect = nullptr; dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0); - auto w = roundToInt ((rect->right - rect->left) / nativeScaleFactor); - auto h = roundToInt ((rect->bottom - rect->top) / nativeScaleFactor); + auto w = rect->right - rect->left; + auto h = rect->bottom - rect->top; if (! isWindowSizeCorrectForPlugin (w, h)) { updateSizeFromEditor (w, h); sizeCheckCount = 0; } + + embeddedComponent.updateHWNDBounds(); } void checkPluginWindowSize() @@ -3319,14 +3274,16 @@ private: resizeToFit(); } - // hooks to get keyboard events from VST windows.. + // hooks to get keyboard events from VST windows. static LRESULT CALLBACK vstHookWndProc (HWND hW, UINT message, WPARAM wParam, LPARAM lParam) { for (int i = activeVSTWindows.size(); --i >= 0;) { Component::SafePointer w (activeVSTWindows[i]); - if (w != nullptr && w->pluginHWND == hW) + auto* pluginHWND = w->getPluginHWND(); + + if (w != nullptr && pluginHWND == hW) { if (message == WM_CHAR || message == WM_KEYDOWN @@ -3341,7 +3298,7 @@ private: if (w != nullptr) // (may have been deleted in SendMessage callback) return CallWindowProc ((WNDPROC) w->originalWndProc, - (HWND) w->pluginHWND, + (HWND) pluginHWND, message, wParam, lParam); } } @@ -3359,116 +3316,86 @@ private: //============================================================================== #if JUCE_MAC - #if JUCE_SUPPORT_CARBON - struct CarbonWrapperComponent : public CarbonViewWrapperComponent - { - CarbonWrapperComponent (VSTPluginWindow& w) : owner (w) - { - keepPluginWindowWhenHidden = w.shouldAvoidDeletingWindow(); - setRepaintsChildHIViewWhenCreated (w.shouldRepaintCarbonWindowWhenCreated()); - } - - ~CarbonWrapperComponent() - { - deleteWindow(); - } - - HIViewRef attachView (WindowRef windowRef, HIViewRef /*rootView*/) override - { - owner.openPluginWindow (windowRef); - return {}; - } - - void removeView (HIViewRef) override - { - if (owner.isOpen) - { - owner.isOpen = false; - owner.dispatch (Vst2::effEditClose, 0, 0, 0, 0); - owner.dispatch (Vst2::effEditSleep, 0, 0, 0, 0); - } - } - - bool getEmbeddedViewSize (int& w, int& h) override - { - Vst2::ERect* rect = nullptr; - owner.dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0); - w = rect->right - rect->left; - h = rect->bottom - rect->top; - return true; - } - - void handleMouseDown (int x, int y) override - { - if (! alreadyInside) - { - alreadyInside = true; - getTopLevelComponent()->toFront (true); - owner.dispatch (Vst2::effEditMouse, x, y, 0, 0); - alreadyInside = false; - } - else - { - PostEvent (::mouseDown, 0); - } - } - - void handlePaint() override - { - if (auto* peer = getPeer()) - { - auto pos = peer->globalToLocal (getScreenPosition()); - Vst2::ERect r; - r.left = (int16) pos.getX(); - r.top = (int16) pos.getY(); - r.right = (int16) (r.left + getWidth()); - r.bottom = (int16) (r.top + getHeight()); - - owner.dispatch (Vst2::effEditDraw, 0, 0, &r, 0); - } - } - - private: - VSTPluginWindow& owner; - bool alreadyInside = false; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CarbonWrapperComponent) - }; - - friend struct CarbonWrapperComponent; - std::unique_ptr carbonWrapper; - #endif - std::unique_ptr cocoaWrapper; void resized() override { - #if JUCE_SUPPORT_CARBON - if (carbonWrapper != nullptr) - carbonWrapper->setSize (getWidth(), getHeight()); - #endif - - if (cocoaWrapper != nullptr) - cocoaWrapper->setSize (getWidth(), getHeight()); } #endif //============================================================================== VSTPluginInstance& plugin; + float userScaleFactor = 1.0f; bool isOpen = false, recursiveResize = false; bool pluginWantsKeys = false, pluginRefusesToResize = false, alreadyInside = false; #if ! JUCE_MAC bool pluginRespondsToDPIChanges = false; + float nativeScaleFactor = 1.0f; + + struct ScaleNotifierCallback + { + VSTPluginWindow& window; + + void operator() (float platformScale) const + { + MessageManager::callAsync ([ref = Component::SafePointer (&window), platformScale] + { + if (auto* r = ref.getComponent()) + { + r->nativeScaleFactor = platformScale; + r->setContentScaleFactor(); + + #if JUCE_WINDOWS + r->resizeToFit(); + #endif + r->componentMovedOrResized (true, true); + } + }); + } + }; + + NativeScaleFactorNotifier scaleNotifier { this, ScaleNotifierCallback { *this } }; + #if JUCE_WINDOWS - HWND pluginHWND = {}; + struct ViewComponent : public HWNDComponent + { + ViewComponent() + { + setOpaque (true); + inner.addToDesktop (0); + + if (auto* peer = inner.getPeer()) + setHWND (peer->getNativeHandle()); + } + + void paint (Graphics& g) override { g.fillAll (Colours::black); } + + private: + struct Inner : public Component + { + Inner() { setOpaque (true); } + void paint (Graphics& g) override { g.fillAll (Colours::black); } + }; + + Inner inner; + }; + + HWND getPluginHWND() const + { + return GetWindow ((HWND) embeddedComponent.getHWND(), GW_CHILD); + } + + ViewComponent embeddedComponent; void* originalWndProc = {}; int sizeCheckCount = 0; #elif JUCE_LINUX || JUCE_BSD ::Display* display = XWindowSystem::getInstance()->getDisplay(); Window pluginWindow = 0; #endif + #else + static constexpr auto nativeScaleFactor = 1.0f; #endif //============================================================================== @@ -3489,6 +3416,14 @@ AudioProcessorEditor* VSTPluginInstance::createEditor() #endif } +bool VSTPluginInstance::updateSizeFromEditor (int w, int h) +{ + if (auto* editor = dynamic_cast (getActiveEditor())) + return editor->updateSizeFromEditor (w, h); + + return false; +} + //============================================================================== // entry point for all callbacks from the plugin static pointer_sized_int VSTCALLBACK audioMaster (Vst2::AEffect* effect, int32 opcode, int32 index, pointer_sized_int value, void* ptr, float opt) diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h index 6e32d9af..ac62e212 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h b/modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h new file mode 100644 index 00000000..6410e934 --- /dev/null +++ b/modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h @@ -0,0 +1,190 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : ipslcontextinfo.h +// Created by : PreSonus Software Ltd., 08/2013, last updated 11/2016 +// Description : Context Information Interface +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _ipslcontextinfo_h +#define _ipslcontextinfo_h + +#include "pluginterfaces/vst/vsttypes.h" +#include "pluginterfaces/base/falignpush.h" + +namespace Presonus { + +//************************************************************************************************ +// IContextInfoProvider +/** Callback interface to access context information from the host. Implemented by the host + as extension of Steinberg::Vst::IComponentHandler. + + The host might not be able to report all available attributes at all times. Please check the + return value of getContextInfoValue() and getContextInfoString(). It's not required to implement + IContextInfoHandler on the plug-in side, but we recommend to do so. The host will then call + notifyContextInfoChange() during initialization to inform the plug-in about the initial state of + the available attributes. + + Usage Example: + + IComponentHandler* handler; + FUnknownPtr contextInfoProvider (handler); + + void PLUGIN_API MyEditController::notifyContextInfoChange () + { + int32 channelIndex = 0; + contextInfoProvider->getContextInfoValue (channelIndex, ContextInfo::kIndex); + + TChar channelName[128] = {0}; + contextInfoProvider->getContextInfoString (channelName, 128, ContextInfo::kName); + } +*/ +//************************************************************************************************ + +struct IContextInfoProvider: Steinberg::FUnknown +{ + /** Get context information by identifier. */ + virtual Steinberg::tresult PLUGIN_API getContextInfoValue (Steinberg::int32& value, Steinberg::FIDString id) = 0; + + /** Get context information by identifier. */ + virtual Steinberg::tresult PLUGIN_API getContextInfoString (Steinberg::Vst::TChar* string, Steinberg::int32 maxCharCount, Steinberg::FIDString id) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IContextInfoProvider, 0x483e61ea, 0x17994494, 0x8199a35a, 0xebb35e3c) + +//************************************************************************************************ +// IContextInfoProvider2 +/** Extension to IContextInfoProvider enabling the plug-in to modify host context information. + Values like volume or pan support both, numeric and string representation for get and set.*/ +//************************************************************************************************ + +struct IContextInfoProvider2: IContextInfoProvider +{ + using IContextInfoProvider::getContextInfoValue; + + /** Get context information by identifier (floating-point). */ + virtual Steinberg::tresult PLUGIN_API getContextInfoValue (double& value, Steinberg::FIDString id) = 0; + + /** Set context information by identifier (floating-point). */ + virtual Steinberg::tresult PLUGIN_API setContextInfoValue (Steinberg::FIDString id, double value) = 0; + + /** Set context information by identifier (integer). */ + virtual Steinberg::tresult PLUGIN_API setContextInfoValue (Steinberg::FIDString id, Steinberg::int32 value) = 0; + + /** Set context information by identifier (string). */ + virtual Steinberg::tresult PLUGIN_API setContextInfoString (Steinberg::FIDString id, Steinberg::Vst::TChar* string) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IContextInfoProvider2, 0x61e45968, 0x3d364f39, 0xb15e1733, 0x4944172b) + +//************************************************************************************************ +// IContextInfoHandler +/** Notification interface for context information changes. Implemented by the plug-in as extension of + Steinberg::Vst::IEditController. */ +//************************************************************************************************ + +struct IContextInfoHandler: Steinberg::FUnknown +{ + /** Called by the host if context information has changed. */ + virtual void PLUGIN_API notifyContextInfoChange () = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IContextInfoHandler, 0xc3b17bc0, 0x2c174494, 0x80293402, 0xfbc4bbf8) + +//************************************************************************************************ +// IContextInfoHandler2 +/** Replacement of IContextInfoHandler passing additional information about what changed on the host-side. + This interface will be preferred if implemented by the plug-in. It is required to + receive certain notifications like volume, pan, etc. */ +//************************************************************************************************ + +struct IContextInfoHandler2: Steinberg::FUnknown +{ + /** Called by the host if context information has changed. + The identifier (id) is empty for the inital update. */ + virtual void PLUGIN_API notifyContextInfoChange (Steinberg::FIDString id) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IContextInfoHandler2, 0x31e29a7a, 0xe55043ad, 0x8b95b9b8, 0xda1fbe1e) + +//************************************************************************************************ +// Context Information Attributes +//************************************************************************************************ + +namespace ContextInfo +{ + /** Channel types. */ + enum ChannelType + { + kTrack = 0, ///< audio track + kBus, ///< audio bus + kFX, ///< FX channel + kSynth, ///< output of virtual instrument + kIn, ///< input from audio driver + kOut ///< output to audio driver (main or sub-out) + }; + + /** Channel index mode. */ + enum ChannelIndexMode + { + kFlatIndex = 0, ///< channel indices are contiguous (example: track 1, track 2, bus 3, bus 4) + kPerTypeIndex ///< channel indices restarts at zero for each type (example: track 1, track 2, bus 1, bus 2) + }; + + // per instance + const Steinberg::FIDString kID = "id"; ///< (R) channel identifier, use to compare identity (string) + const Steinberg::FIDString kName = "name"; ///< (R/W) channel name, can be displayed to the user (string) + const Steinberg::FIDString kType = "type"; ///< (R) channel type (int32, see ChannelType enumeration) + const Steinberg::FIDString kMain = "main"; ///< (R) channel is main output (int32, 0: false, 1: true) + const Steinberg::FIDString kIndex = "index"; ///< (R) channel index (int32, starts at zero) + const Steinberg::FIDString kColor = "color"; ///< (R/W) channel color (int32: RGBA) + const Steinberg::FIDString kVisibility = "visibility"; ///< (R) channel visibility (int32, 0: false, 1: true) + const Steinberg::FIDString kSelected = "selected"; ///< (R/W) selection state, channel is selected exlusively and scrolled into view on write (int32, 0: false, 1: true) + const Steinberg::FIDString kMultiSelect = "multiselect"; ///< (W) select channel without unselecting others (int32, 0: false, 1: true) + const Steinberg::FIDString kFocused = "focused"; ///< (R) focus for user input when multiple channels are selected (int32, 0: false, 1: true) + + const Steinberg::FIDString kRegionName = "regionName"; ///< (R) name of region/event for region/event-based effects (string) + const Steinberg::FIDString kRegionSelected = "regionSelected"; ///< (R) selection state of region/event for region/event-based effects (int32, 0: false, 1: true) + + // per instance (requires IContextInfoHandler2 on plug-in side) + const Steinberg::FIDString kVolume = "volume"; ///< (R/W) volume factor [float, 0. = -oo dB, 1. = 0dB, etc.], also available as string + const Steinberg::FIDString kMaxVolume = "maxVolume"; ///< (R) maximum volume factor [float, 1. = 0dB], also available as string + const Steinberg::FIDString kPan = "pan"; ///< (R/W) stereo panning [float, < 0.5 = (L), 0.5 = (C), > 0.5 = (R)], also available as string + const Steinberg::FIDString kMute = "mute"; ///< (R/W) mute (int32, 0: false, 1: true) + const Steinberg::FIDString kSolo = "solo"; ///< (R/W) solo (int32, 0: false, 1: true) + const Steinberg::FIDString kSendCount = "sendcount"; ///< (R) send count [int] + const Steinberg::FIDString kSendLevel = "sendlevel"; ///< (R/W) send level factor, index is appended to id (e.g. "sendlevel0" for first), also available as string + const Steinberg::FIDString kMaxSendLevel = "maxSendlevel"; ///< (R) maximum send level factor, also available as string + + // global + const Steinberg::FIDString kActiveDocumentID = "activeDocumentID"; ///< (R) active document identifier, use to get identity of the active document (string) + const Steinberg::FIDString kDocumentID = "documentID"; ///< (R) document identifier, use to compare identity (string) + const Steinberg::FIDString kDocumentName = "documentName"; ///< (R) document name, can be displayed to user (string) + const Steinberg::FIDString kDocumentFolder = "documentFolder"; ///< (R) document folder (string) + const Steinberg::FIDString kAudioFolder = "audioFolder"; ///< (R) folder for audio files (string) + const Steinberg::FIDString kIndexMode = "indexMode"; ///< (R) channel index mode (default is flat, see ChannelIndexMode enumeration) +} + +} // namespace Presonus + +#include "pluginterfaces/base/falignpop.h" + +#endif // _ipslcontextinfo_h \ No newline at end of file diff --git a/modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h b/modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h new file mode 100644 index 00000000..0350bc82 --- /dev/null +++ b/modules/juce_audio_processors/format_types/pslextensions/ipsleditcontroller.h @@ -0,0 +1,108 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : ipsleditcontroller.h +// Created by : PreSonus Software Ltd., 02/2017, last updated 10/2017 +// Description : Plug-in Edit Controller Extension Interface +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _ipsleditcontroller_h +#define _ipsleditcontroller_h + +#include "pluginterfaces/vst/vsttypes.h" +#include "pluginterfaces/base/funknown.h" +#include "pluginterfaces/base/falignpush.h" + +namespace Steinberg { +namespace Vst { +class IEditController; }} + +namespace Presonus { + +/** Parameter extra flags. Used with IEditControllerExtra. */ +enum ParamExtraFlags +{ + kParamFlagMicroEdit = 1<<0 ///< parameter should be displayed in host micro view +}; + +/** Automation mode. Used with IEditControllerExtra. */ +enum AutomationMode +{ + kAutomationNone = 0, ///< no automation data available + kAutomationOff, ///< data available, but mode is set to off + kAutomationRead, ///< data + read mode + kAutomationTouch, ///< data + touch mode + kAutomationLatch, ///< data + latch mode + kAutomationWrite ///< data + write mode +}; + +/** Slave mode. Used with ISlaveControllerHandler. */ +enum SlaveMode +{ + kSlaveModeNormal, ///< plug-in used in different location following given master + kSlaveModeLowLatencyClone ///< plug-in used as hidden slave for low latency processing following given master +}; + +//************************************************************************************************ +// IEditControllerExtra +/** Extension to Steinberg::Vst::IEditController with additonal flags and notifications + not available in the standard edit controller interface. */ +//************************************************************************************************ + +struct IEditControllerExtra: Steinberg::FUnknown +{ + /** Get extra flags for given parameter (see ParamExtraFlags). */ + virtual Steinberg::int32 PLUGIN_API getParamExtraFlags (Steinberg::Vst::ParamID id) = 0; + + /** Set automation mode for given parameter (see AutomationMode). */ + virtual Steinberg::tresult PLUGIN_API setParamAutomationMode (Steinberg::Vst::ParamID id, Steinberg::int32 automationMode) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IEditControllerExtra, 0x50553fd9, 0x1d2c4c24, 0xb410f484, 0xc5fb9f3f) + +//************************************************************************************************ +// ISlaveControllerHandler +/** Extension to Steinberg::Vst::IEditController used to notify the plug-in about slave instances. + + The host might decide to use "cloned" (slave) instances in various scenarios, e.g. to process + audio paths with different latencies simultaneously or to synchronize grouped plug-in instances + between multiple mixer channels - see SlaveMode. In this case multiple plug-in instances are active + at the same time even though it looks like one to the user, i.e. only the editor of the master + instance is visible and can be used to change parameters. The edit controller implementation has + to synchronize parameter changes between instances that aren't visible to the host internally. +*/ +//************************************************************************************************ + +struct ISlaveControllerHandler: Steinberg::FUnknown +{ + /** Add slave edit controller. Implementation must sync non-automatable parameters between + this instance (master) and given slave instance internally, i.e. when the master (this) + changes update all connected slaves. + */ + virtual Steinberg::tresult PLUGIN_API addSlave (Steinberg::Vst::IEditController* slave, Steinberg::int32 slaveMode) = 0; + + /** Remove slave edit controller. */ + virtual Steinberg::tresult PLUGIN_API removeSlave (Steinberg::Vst::IEditController* slave) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (ISlaveControllerHandler, 0xd93894bd, 0x67454c29, 0x977ae2f5, 0xdb380434) + +} // namespace Presonus + +#include "pluginterfaces/base/falignpop.h" + +#endif // _ipsleditcontroller_h diff --git a/modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h b/modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h new file mode 100644 index 00000000..1fe2b921 --- /dev/null +++ b/modules/juce_audio_processors/format_types/pslextensions/ipslgainreduction.h @@ -0,0 +1,53 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : ipslgainreduction.h +// Created by : PreSonus Software Ltd., 03/2015 +// Description : Plug-in Gain Reduction Interface +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _ipslgainreduction_h +#define _ipslgainreduction_h + +#include "pluginterfaces/base/funknown.h" +#include "pluginterfaces/base/falignpush.h" + +namespace Presonus { + +//************************************************************************************************ +// IGainReductionInfo +/** Interface to report gain reduction imposed to the audio signal by the plug-in to the + host for display in the UI. Implemented by the VST3 edit controller class. +*/ +//************************************************************************************************ + +struct IGainReductionInfo: Steinberg::FUnknown +{ + /** Get current gain reduction for display. The returned value in dB is either 0.0 (no reduction) + or negative. The host calls this function periodically while the plug-in is active. + The value is used AS IS for UI display purposes, without imposing additional ballistics or + presentation latency compensation. Be sure to return zero if processing is bypassed internally. + For multiple reduction stages, please report the sum in dB here. + */ + virtual double PLUGIN_API getGainReductionValueInDb () = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IGainReductionInfo, 0x8e3c292c, 0x95924f9d, 0xb2590b1e, 0x100e4198) + +} // namespace Presonus + +#include "pluginterfaces/base/falignpop.h" + +#endif // _ipslgainreduction_h \ No newline at end of file diff --git a/modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h b/modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h new file mode 100644 index 00000000..c6884dd0 --- /dev/null +++ b/modules/juce_audio_processors/format_types/pslextensions/ipslhostcommands.h @@ -0,0 +1,121 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : ipslhostcommands.h +// Created by : PreSonus Software Ltd., 11/2009 +// Description : Host Command Interface +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _ipslhostcommands_h +#define _ipslhostcommands_h + +#include "pluginterfaces/vst/vsttypes.h" +#include "pluginterfaces/base/funknown.h" +#include "pluginterfaces/base/falignpush.h" + +namespace Steinberg { +class IPlugView; } + +namespace Presonus { + +struct ICommandList; + +//************************************************************************************************ +// IHostCommandHandler +/** Callback interface to access host-specific parameter commands to be integrated + into a context menu inside the plug-in editor. Implemented as extension of + Steinberg::Vst::IComponentHandler. + + Please note that the intention of this set of interfaces is not to allow a generic menu + implementation. This is the responsibility of a GUI toolkit. It basically provides + a way to enumerate and execute commands anonymously, i.e. the plug-in does not have to + know the exact sematics of the commands and the host does not break the consistency of + the plug-in GUI. + + Usage Example: + + IComponentHandler* handler; + FUnknownPtr commandHandler (handler); + if(commandHandler) + if(ICommandList* commandList = commandHandler->createParamCommands (kMyParamId)) + { + FReleaser commandListReleaser (commandList); + commandHandler->popupCommandMenu (commandList, xPos, yPos); + } +*/ +//************************************************************************************************ + +struct IHostCommandHandler: Steinberg::FUnknown +{ + /** Create list of currently available host commands for given parameter. + The command list has a short lifecycle, it is recreated whenever + a context menu should appear. The returned pointer can be null, otherwise + it has to be released. */ + virtual ICommandList* PLUGIN_API createParamCommands (Steinberg::Vst::ParamID tag) = 0; + + /** Helper to popup a command menu at given position. + Coordinates are relative to view or in screen coordintes if view is null. + Can be used for testing purpose, if the plug-in does not have its own context menu implementation + or if it wants to use the look & feel of the host menu. This method is not supposed + to support command lists implemented by the plug-in. */ + virtual Steinberg::tresult PLUGIN_API popupCommandMenu (ICommandList* commandList, Steinberg::int32 xPos, Steinberg::int32 yPos, Steinberg::IPlugView* view = 0) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IHostCommandHandler, 0xF92032CD, 0x7A84407C, 0xABE6F863, 0x058EA6C2) + +//************************************************************************************************ +// CommandInfo +/** Describes a single command. */ +//************************************************************************************************ + +struct CommandInfo +{ + Steinberg::Vst::String128 title; ///< command title (possibly localized into active host language) + Steinberg::int32 flags; ///< command flags + + enum CommandFlags + { + kCanExecute = 1<<0, ///< used to display command enabled/disabled + kIsSeparator = 1<<1, ///< not a command, it's a separator + kIsChecked = 1<<2 ///< used to display command with a check mark + }; +}; + +//************************************************************************************************ +// ICommandList +/** Describes a list of commands. */ +//************************************************************************************************ + +struct ICommandList: Steinberg::FUnknown +{ + /** Returns the number of commands. */ + virtual Steinberg::int32 PLUGIN_API getCommandCount () = 0; + + /** Get command information for a given index. */ + virtual Steinberg::tresult PLUGIN_API getCommandInfo (Steinberg::int32 index, CommandInfo& info) = 0; + + /** Execute command at given index. */ + virtual Steinberg::tresult PLUGIN_API executeCommand (Steinberg::int32 index) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (ICommandList, 0xC5A687DB, 0x82F344E9, 0xB378254A, 0x47C4D712) + +} // namespace Presonus + +#include "pluginterfaces/base/falignpop.h" + +#endif // _ipslhostcommands_h \ No newline at end of file diff --git a/modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h b/modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h new file mode 100644 index 00000000..8af91579 --- /dev/null +++ b/modules/juce_audio_processors/format_types/pslextensions/ipslviewembedding.h @@ -0,0 +1,53 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : ipslviewembedding.h +// Created by : PreSonus Software Ltd., 05/2012 +// Description : Plug-in View Embedding Interface +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _ipslviewembedding_h +#define _ipslviewembedding_h + +#include "pluginterfaces/base/funknown.h" +#include "pluginterfaces/base/falignpush.h" + +namespace Steinberg { +class IPlugView; } + +namespace Presonus { + +//************************************************************************************************ +// IPlugInViewEmbedding +/** Support for plug-in view embedding, to be implemented by the VST3 controller class. */ +//************************************************************************************************ + +class IPlugInViewEmbedding: public Steinberg::FUnknown +{ +public: + /** Check if view embedding is supported. */ + virtual Steinberg::TBool PLUGIN_API isViewEmbeddingSupported () = 0; + + /** Inform plug-in that its view will be embedded. */ + virtual Steinberg::tresult PLUGIN_API setViewIsEmbedded (Steinberg::IPlugView* view, Steinberg::TBool embedded) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IPlugInViewEmbedding, 0xda57e6d1, 0x1f3242d1, 0xad9c1a82, 0xfdb95695) + +} // namespace Presonus + +#include "pluginterfaces/base/falignpop.h" + +#endif // _ipslviewembedding_h \ No newline at end of file diff --git a/modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h b/modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h new file mode 100644 index 00000000..a7c2b119 --- /dev/null +++ b/modules/juce_audio_processors/format_types/pslextensions/ipslviewscaling.h @@ -0,0 +1,67 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : ipslviewscaling.h +// Created by : PreSonus Software Ltd., 03/2015 +// Description : Plug-in View DPI Scaling Interface +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _ipslviewscaling_h +#define _ipslviewscaling_h + +#include "pluginterfaces/base/funknown.h" +#include "pluginterfaces/base/falignpush.h" + +namespace Presonus { + +//************************************************************************************************ +// IPlugInViewScaling +/** Support for plug-in view content scaling, to be implemented by the VST3 IPlugView class. + + On Windows, if a process is "DPI-aware" and the system DPI setting is different from the default + value of 96 DPI, the application is responsible to scale the contents of its windows accordingly, + including child windows provided by 3rd party plug-ins. + + This interface is used by the host to inform the plug-in about the current scaling factor. + The scaling factor is used to convert user space coordinates aka DIPs (device-independent pixels) + to physical pixels on screen. + + The plug-in has to be prepared to deal with the following scaling factors: + + 96 DPI = 100% scaling (factor = 1.0) + 120 DPI = 125% scaling (factor = 1.25) + 144 DPI = 150% scaling (factor = 1.5) + 192 DPI = 200% scaling (factor = 2.0) + + On Windows 8.1 or later DPI settings are per monitor. The scaling factor for a window can change + when it is moved between screens. +*/ +//************************************************************************************************ + +struct IPlugInViewScaling: Steinberg::FUnknown +{ + /** Inform the view about the current content scaling factor. The scaling factor can change + if the window is moved between screens. + */ + virtual Steinberg::tresult PLUGIN_API setContentScaleFactor (float factor) = 0; + + static const Steinberg::FUID iid; +}; + +DECLARE_CLASS_IID (IPlugInViewScaling, 0x65ed9690, 0x8ac44525, 0x8aadef7a, 0x72ea703f) + +} // namespace Presonus + +#include "pluginterfaces/base/falignpop.h" + +#endif // _ipslviewscaling_h \ No newline at end of file diff --git a/modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h b/modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h new file mode 100644 index 00000000..1b0b0b9b --- /dev/null +++ b/modules/juce_audio_processors/format_types/pslextensions/pslauextensions.h @@ -0,0 +1,57 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : pslauextensions.h +// Created by : PreSonus Software Ltd., 08/2017, last updated 10/2017 +// Description : PreSonus-specific AU API Extensions +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. + */ +//************************************************************************************************ + +#ifndef _pslauextensions_h +#define _pslauextensions_h + +#ifdef __cplusplus +namespace Presonus { +#endif + +////////////////////////////////////////////////////////////////////////////////////////////////// +// Property IDs +////////////////////////////////////////////////////////////////////////////////////////////////// + +/** This AU property in the global scope is of type CFArrayRef and is writable by the host. + The elements of the array are of type CFDataRef which encapsulate SlaveMode structures. + For more details, please check the documentation of Presonus::ISlaveControllerHandler. */ +static const AudioUnitPropertyID kSlaveEffectsPropID = 0x50534C01; + +////////////////////////////////////////////////////////////////////////////////////////////////// +// Data types +////////////////////////////////////////////////////////////////////////////////////////////////// + +enum SlaveMode +{ + kSlaveModeNormal, ///< plug-in used in different location following given master + kSlaveModeLowLatencyClone ///< plug-in used as hidden slave for low latency processing following given master +}; + +////////////////////////////////////////////////////////////////////////////////////////////////// + +struct SlaveEffect +{ + AudioUnit unit; ///< Audio Unit reference + SInt32 mode; ///< SlaveMode +}; + +#ifdef __cplusplus +} +#endif + +#endif // _pslauextensions_h diff --git a/modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h b/modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h new file mode 100644 index 00000000..bab2e61c --- /dev/null +++ b/modules/juce_audio_processors/format_types/pslextensions/pslvst2extensions.h @@ -0,0 +1,111 @@ +//************************************************************************************************ +// +// PreSonus Plug-In Extensions +// Written and placed in the PUBLIC DOMAIN by PreSonus Software Ltd. +// +// Filename : pslvst2extensions.h +// Created by : PreSonus Software Ltd., 05/2012, last updated 08/2017 +// Description : PreSonus-specific VST2 API Extensions +// +//************************************************************************************************ +/* + DISCLAIMER: + The PreSonus Plug-In Extensions are host-specific extensions of existing proprietary technologies, + provided to the community on an AS IS basis. They are not part of any official 3rd party SDK and + PreSonus is not affiliated with the owner of the underlying technology in any way. +*/ +//************************************************************************************************ + +#ifndef _pslvst2extensions_h +#define _pslvst2extensions_h + +namespace Presonus { + +////////////////////////////////////////////////////////////////////////////////////////////////// +// CanDo Strings +////////////////////////////////////////////////////////////////////////////////////////////////// + +/** Identifiers to be passed to VST2's canDo() method. */ +namespace PlugCanDos +{ + /** Check if view can be resized by the host. */ + static const char* canDoViewResize = "supportsViewResize"; + + /** Check if view can be embedded by the host. */ + static const char* canDoViewEmbedding = "supportsViewEmbedding"; + + /** Check if view scaling for high-DPI is supported by the plug-in. */ + static const char* canDoViewDpiScaling = "supportsViewDpiScaling"; + + /** Check if gain reduction reporting is supported by the plug-in. */ + static const char* canDoGainReductionInfo = "supportsGainReductionInfo"; + + /** Check if slave effects are supported by plug-in. */ + static const char* canDoSlaveEffects = "supportsSlaveEffects"; +} + +////////////////////////////////////////////////////////////////////////////////////////////////// +// Opcodes +////////////////////////////////////////////////////////////////////////////////////////////////// + +/** Vendor-specific opcodes a VST2 plug-in can implement to add non-standard features like + embedding its views as subview into the host, resizing from the host, high-DPI scaling, etc. + + Embedding corresponds to the Presonus::IPlugInViewEmbedding VST3 extended interface. + + Resizing works like VST3's checkSizeConstraint() and onSize() methods, VST3's canResize() + is defined via canDoViewResize. + + For "DPI-aware" host applications on the Windows platform a similar mimic to the + Presonus::IPlugInViewScaling VST3 extended interface is defined here. + + Gain reduction reporting corresponds to the Presonus::IGainReductionInfo VST3 interface. + + Slave effect handling corresponds to the Presonus::ISlaveControllerHandler VST3 interface. +*/ +enum Opcodes +{ + /** PreSonus vendor ID - distinguishes our calls from other VST2 extensions. + Pass this vendor ID as "index" (aka "lArg1") parameter for vendor specific calls. */ + kVendorID = 'PreS', + + /** The host can suggest a new editor size, and the plug-in can modify the suggested + size to a suitable value if it cannot resize to the given values. + The ptrArg is a ERect* to the input/output rect. This differs from the ERect** + used by effEditGetRect, because here the rect is owned by the host, not the plug-in. + The result is 0 on failure, 1 on success. */ + kEffEditCheckSizeConstraints = 'AeCc', + + /** The host can set a new size after negotiating the size via the above + kEffEditCheckSizeConstraints, triggering the actual resizing. + The ptrArg is a ERect* to the input/output rect. This differs from the ERect** + used by effEditGetRect, because here the rect is owned by the host, not the plug-in. + The result is 0 on failure, 1 on success. */ + kEffEditSetRect = 'AeSr', + + /** When the view is embedded, it may need to adjust its UI, e.g. by suppressing + its built-in resizing facility because this is then controlled by the host. + The ptrArg is a VstInt32*, pointing to 0 to disable or to 1 to enable embedding. + Per default, embedding is disabled until the host calls this to indicate otherwise. */ + kEffEditSetEmbedded = 'AeEm', + + /** Inform the view about the current content scaling factor. The factor is passed in the opt argument. + For more details, please check the documentation of Presonus::IPlugInViewScaling. */ + kEffEditSetContentScaleFactor = 'AeCs', + + /** Get current gain reduction for display. The ptrArg is a float* to be set to the dB value. + For more details, please check the documentation of Presonus::IGainReductionInfo. */ + kEffGetGainReductionValueInDb = 'GRdB', + + /** Add slave effect. The ptrArg is a pointer to the slave AEffect, the 'opt' float transmits the mode (see enum SlaveMode). + For more details, please check the documentation of Presonus::ISlaveControllerHandler. */ + kEffAddSlave = 'AdSl', + + /** Remove slave effect. The ptrArg is a pointer to the slave AEffect. + For more details, please check the documentation of Presonus::ISlaveControllerHandler. */ + kEffRemoveSlave = 'RmSl' +}; + +} // namespace Presonus + +#endif // _pslvst2extensions_h diff --git a/modules/juce_audio_processors/juce_audio_processors.cpp b/modules/juce_audio_processors/juce_audio_processors.cpp index 49c6e390..2dace73b 100644 --- a/modules/juce_audio_processors/juce_audio_processors.cpp +++ b/modules/juce_audio_processors/juce_audio_processors.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -42,13 +42,6 @@ #include //============================================================================== -#if JUCE_MAC - #if JUCE_SUPPORT_CARBON && (JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_AU) - #include - #include - #endif -#endif - #if (JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_VST3) && (JUCE_LINUX || JUCE_BSD) #include #include @@ -56,7 +49,7 @@ #undef KeyPress #endif -#if ! JUCE_WINDOWS && ! JUCE_MAC && ! JUCE_LINUX && ! JUCE_BSD +#if ! JUCE_WINDOWS && ! JUCE_MAC && ! JUCE_LINUX #undef JUCE_PLUGINHOST_VST3 #define JUCE_PLUGINHOST_VST3 0 #endif @@ -65,11 +58,10 @@ #include #endif -//============================================================================== namespace juce { -#if JUCE_PLUGINHOST_VST || (JUCE_PLUGINHOST_LADSPA && (JUCE_LINUX || JUCE_BSD)) +#if JUCE_PLUGINHOST_VST || (JUCE_PLUGINHOST_LADSPA && JUCE_LINUX) static bool arrayContainsPlugin (const OwnedArray& list, const PluginDescription& desc) @@ -83,6 +75,26 @@ static bool arrayContainsPlugin (const OwnedArray& list, #endif +template +void callOnMessageThread (Callback&& callback) +{ + if (MessageManager::getInstance()->existsAndIsLockedByCurrentThread()) + { + callback(); + return; + } + + WaitableEvent completionEvent; + + MessageManager::callAsync ([&callback, &completionEvent] + { + callback(); + completionEvent.signal(); + }); + + completionEvent.wait(); +} + #if JUCE_MAC //============================================================================== @@ -142,21 +154,19 @@ private: } } - struct FlippedNSView : public ObjCClass + struct InnerNSView : public ObjCClass { - FlippedNSView() - : ObjCClass ("JuceFlippedNSView_") + InnerNSView() + : ObjCClass ("JuceInnerNSView_") { addIvar ("owner"); - addMethod (@selector (isFlipped), isFlipped); addMethod (@selector (isOpaque), isOpaque); addMethod (@selector (didAddSubview:), didAddSubview); registerClass(); } - static BOOL isFlipped (id, SEL) { return YES; } static BOOL isOpaque (id, SEL) { return YES; } static void nudge (id self) @@ -166,15 +176,12 @@ private: owner->triggerAsyncUpdate(); } - static void viewDidUnhide (id self, SEL) { nudge (self); } static void didAddSubview (id self, SEL, NSView*) { nudge (self); } - static void viewDidMoveToSuperview (id self, SEL) { nudge (self); } - static void viewDidMoveToWindow (id self, SEL) { nudge (self); } }; - static FlippedNSView& getViewClass() + static InnerNSView& getViewClass() { - static FlippedNSView result; + static InnerNSView result; return result; } }; @@ -183,6 +190,7 @@ private: } // namespace juce +#include "utilities/juce_FlagCache.h" #include "format/juce_AudioPluginFormat.cpp" #include "format/juce_AudioPluginFormatManager.cpp" #include "format_types/juce_LegacyAudioParameter.cpp" @@ -192,10 +200,12 @@ private: #include "processors/juce_AudioProcessorGraph.cpp" #include "processors/juce_GenericAudioProcessorEditor.cpp" #include "processors/juce_PluginDescription.cpp" +#include "format_types/juce_ARACommon.cpp" #include "format_types/juce_LADSPAPluginFormat.cpp" #include "format_types/juce_VSTPluginFormat.cpp" #include "format_types/juce_VST3PluginFormat.cpp" #include "format_types/juce_AudioUnitPluginFormat.mm" +#include "format_types/juce_ARAHosting.cpp" #include "scanning/juce_KnownPluginList.cpp" #include "scanning/juce_PluginDirectoryScanner.cpp" #include "scanning/juce_PluginListComponent.cpp" @@ -209,3 +219,12 @@ private: #include "utilities/juce_ParameterAttachments.cpp" #include "utilities/juce_AudioProcessorValueTreeState.cpp" #include "utilities/juce_PluginHostType.cpp" +#include "utilities/juce_NativeScaleFactorNotifier.cpp" +#include "utilities/ARA/juce_ARA_utils.cpp" + +#include "format_types/juce_LV2PluginFormat.cpp" + +#if JUCE_UNIT_TESTS + #include "format_types/juce_VST3PluginFormat_test.cpp" + #include "format_types/juce_LV2PluginFormat_test.cpp" +#endif diff --git a/modules/juce_audio_processors/juce_audio_processors.h b/modules/juce_audio_processors/juce_audio_processors.h index 6e6b90e9..339421b8 100644 --- a/modules/juce_audio_processors/juce_audio_processors.h +++ b/modules/juce_audio_processors/juce_audio_processors.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_audio_processors vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE audio processor classes description: Classes for loading and playing VST, AU, LADSPA, or internally-generated audio processors. website: http://www.juce.com/juce @@ -94,6 +94,24 @@ #define JUCE_PLUGINHOST_LADSPA 0 #endif +/** Config: JUCE_PLUGINHOST_LV2 + Enables the LV2 plugin hosting classes. + */ +#ifndef JUCE_PLUGINHOST_LV2 + #define JUCE_PLUGINHOST_LV2 0 +#endif + +/** Config: JUCE_PLUGINHOST_ARA + Enables the ARA plugin extension hosting classes. You will need to download the ARA SDK and specify the + path to it either in the Projucer, using juce_set_ara_sdk_path() in your CMake project file. + + The directory can be obtained by recursively cloning https://github.com/Celemony/ARA_SDK and checking out + the tag releases/2.1.0. +*/ +#ifndef JUCE_PLUGINHOST_ARA + #define JUCE_PLUGINHOST_ARA 0 +#endif + /** Config: JUCE_CUSTOM_VST3_SDK If enabled, the embedded VST3 SDK in JUCE will not be added to the project and instead you should add the path to your custom VST3 SDK to the project's header search paths. Most users shouldn't @@ -107,10 +125,6 @@ // #error "You need to set either the JUCE_PLUGINHOST_AU and/or JUCE_PLUGINHOST_VST and/or JUCE_PLUGINHOST_VST3 and/or JUCE_PLUGINHOST_LADSPA flags if you're using this module!" #endif -#if ! (defined (JUCE_SUPPORT_CARBON) || JUCE_64BIT || JUCE_IOS) - #define JUCE_SUPPORT_CARBON 1 -#endif - #ifndef JUCE_SUPPORT_LEGACY_AUDIOPROCESSOR #define JUCE_SUPPORT_LEGACY_AUDIOPROCESSOR 1 #endif @@ -118,6 +132,8 @@ //============================================================================== #include "utilities/juce_VSTCallbackHandler.h" #include "utilities/juce_VST3ClientExtensions.h" +#include "utilities/juce_NativeScaleFactorNotifier.h" +#include "format_types/juce_ARACommon.h" #include "utilities/juce_ExtensionsVisitor.h" #include "processors/juce_AudioProcessorParameter.h" #include "processors/juce_HostedAudioProcessorParameter.h" @@ -135,9 +151,11 @@ #include "scanning/juce_KnownPluginList.h" #include "format_types/juce_AudioUnitPluginFormat.h" #include "format_types/juce_LADSPAPluginFormat.h" +#include "format_types/juce_LV2PluginFormat.h" +#include "format_types/juce_VST3PluginFormat.h" #include "format_types/juce_VSTMidiEventList.h" #include "format_types/juce_VSTPluginFormat.h" -#include "format_types/juce_VST3PluginFormat.h" +#include "format_types/juce_ARAHosting.h" #include "scanning/juce_PluginDirectoryScanner.h" #include "scanning/juce_PluginListComponent.h" #include "utilities/juce_AudioProcessorParameterWithID.h" @@ -149,3 +167,18 @@ #include "utilities/juce_ParameterAttachments.h" #include "utilities/juce_AudioProcessorValueTreeState.h" #include "utilities/juce_PluginHostType.h" +#include "utilities/ARA/juce_ARA_utils.h" + +//============================================================================== +// These declarations are here to avoid missing-prototype warnings in user code. + +// If you're implementing a plugin, you should supply a body for +// this function in your own code. +juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter(); + +// If you are implementing an ARA enabled plugin, you need to +// implement this function somewhere in the codebase by returning +// SubclassOfARADocumentControllerSpecialisation::createARAFactory(); +#if JucePlugin_Enable_ARA + const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory(); +#endif diff --git a/modules/juce_audio_processors/juce_audio_processors.mm b/modules/juce_audio_processors/juce_audio_processors.mm index db19d2a3..8652647f 100644 --- a/modules/juce_audio_processors/juce_audio_processors.mm +++ b/modules/juce_audio_processors/juce_audio_processors.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/juce_audio_processors_ara.cpp b/modules/juce_audio_processors/juce_audio_processors_ara.cpp new file mode 100644 index 00000000..d8e35ca4 --- /dev/null +++ b/modules/juce_audio_processors/juce_audio_processors_ara.cpp @@ -0,0 +1,40 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include +#include + +/* Having WIN32_LEAN_AND_MEAN defined at the point of including ARADebug.c will produce warnings. + + To prevent such problems it's easiest to have it in its own translation unit. +*/ + +#if (JucePlugin_Enable_ARA || (JUCE_PLUGINHOST_ARA && (JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_AU))) && (JUCE_MAC || JUCE_WINDOWS) + +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments", "-Wmissing-prototypes") + #include +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +#endif diff --git a/modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp b/modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp new file mode 100644 index 00000000..22b2d118 --- /dev/null +++ b/modules/juce_audio_processors/juce_audio_processors_lv2_libs.cpp @@ -0,0 +1,35 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#if JUCE_PLUGINHOST_LV2 + #ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS + #endif + + #include + #include + + #include "format_types/juce_LV2SupportLibs.cpp" +#endif diff --git a/modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp b/modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp index c3112c10..e2927d04 100644 --- a/modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -211,18 +211,11 @@ void AudioPluginInstance::assertOnceOnDeprecatedMethodUse() const noexcept bool AudioPluginInstance::deprecationAssertiontriggered = false; AudioPluginInstance::Parameter::Parameter() + : onStrings { TRANS ("on"), TRANS ("yes"), TRANS ("true") }, + offStrings { TRANS ("off"), TRANS ("no"), TRANS ("false") } { - onStrings.add (TRANS("on")); - onStrings.add (TRANS("yes")); - onStrings.add (TRANS("true")); - - offStrings.add (TRANS("off")); - offStrings.add (TRANS("no")); - offStrings.add (TRANS("false")); } -AudioPluginInstance::Parameter::~Parameter() = default; - String AudioPluginInstance::Parameter::getText (float value, int maximumStringLength) const { if (isBoolean()) diff --git a/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h b/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h index 05f8e784..e849bef3 100644 --- a/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h +++ b/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -150,13 +150,12 @@ protected: { public: Parameter(); - ~Parameter() override; String getText (float value, int maximumStringLength) const override; float getValueForText (const String& text) const override; private: - StringArray onStrings, offStrings; + const StringArray onStrings, offStrings; }; AudioPluginInstance() = default; diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp index fbf91cb8..53aa9c3d 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -427,10 +427,19 @@ void AudioProcessor::updateHostDisplay (const AudioProcessorListener::ChangeDeta l->audioProcessorChanged (this, details); } -void AudioProcessor::checkForUnsafeParamID (AudioProcessorParameter* param) +void AudioProcessor::validateParameter (AudioProcessorParameter* param) { checkForDuplicateParamID (param); checkForDuplicateTrimmedParamID (param); + + /* If you're building this plugin as an AudioUnit, and you intend to use the plugin in + Logic Pro or GarageBand, it's a good idea to set version hints on all of your parameters + so that you can add parameters safely in future versions of the plugin. + See the documentation for AudioProcessorParameter(int) for more information. + */ + #if JucePlugin_Build_AU + jassert (wrapperType == wrapperType_Undefined || param->getVersionHint() != 0); + #endif } void AudioProcessor::checkForDuplicateTrimmedParamID (AudioProcessorParameter* param) @@ -512,7 +521,7 @@ void AudioProcessor::addParameter (AudioProcessorParameter* param) param->parameterIndex = flatParameterList.size(); flatParameterList.add (param); - checkForUnsafeParamID (param); + validateParameter (param); } void AudioProcessor::addParameterGroup (std::unique_ptr group) @@ -529,7 +538,7 @@ void AudioProcessor::addParameterGroup (std::unique_ptrprocessor = this; p->parameterIndex = i; - checkForUnsafeParamID (p); + validateParameter (p); } parameterTree.addChild (std::move (group)); @@ -553,7 +562,7 @@ void AudioProcessor::setParameterTree (AudioProcessorParameterGroup&& newTree) p->processor = this; p->parameterIndex = i; - checkForUnsafeParamID (p); + validateParameter (p); } } @@ -1239,10 +1248,10 @@ const char* AudioProcessor::getWrapperTypeDescription (AudioProcessor::WrapperTy case AudioProcessor::wrapperType_VST3: return "VST3"; case AudioProcessor::wrapperType_AudioUnit: return "AU"; case AudioProcessor::wrapperType_AudioUnitv3: return "AUv3"; - case AudioProcessor::wrapperType_RTAS: return "RTAS"; case AudioProcessor::wrapperType_AAX: return "AAX"; case AudioProcessor::wrapperType_Standalone: return "Standalone"; case AudioProcessor::wrapperType_Unity: return "Unity"; + case AudioProcessor::wrapperType_LV2: return "LV2"; default: jassertfalse; return {}; } } @@ -1492,8 +1501,6 @@ void AudioProcessorListener::audioProcessorParameterChangeGestureBegin (AudioPro void AudioProcessorListener::audioProcessorParameterChangeGestureEnd (AudioProcessor*, int) {} //============================================================================== -AudioProcessorParameter::AudioProcessorParameter() noexcept {} - AudioProcessorParameter::~AudioProcessorParameter() { #if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.h b/modules/juce_audio_processors/processors/juce_AudioProcessor.h index d4ef6fb4..36e9769f 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessor.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -31,7 +31,7 @@ namespace juce Base class for audio processing classes or plugins. This is intended to act as a base class of audio processor that is general enough - to be wrapped as a VST, AU, RTAS, etc, or used internally. + to be wrapped as a VST, AU, AAX, etc, or used internally. It is also used by the plugin hosting code as the wrapper around an instance of a loaded plugin. @@ -78,6 +78,12 @@ public: doublePrecision }; + enum class Realtime + { + no, + yes + }; + using ChangeDetails = AudioProcessorListener::ChangeDetails; //============================================================================== @@ -500,12 +506,12 @@ public: /** Returns the audio bus with a given index and direction. If busIndex is invalid then this method will return a nullptr. */ - Bus* getBus (bool isInput, int busIndex) noexcept { return (isInput ? inputBuses : outputBuses)[busIndex]; } + Bus* getBus (bool isInput, int busIndex) noexcept { return getBusImpl (*this, isInput, busIndex); } /** Returns the audio bus with a given index and direction. If busIndex is invalid then this method will return a nullptr. */ - const Bus* getBus (bool isInput, int busIndex) const noexcept { return const_cast (this)->getBus (isInput, busIndex); } + const Bus* getBus (bool isInput, int busIndex) const noexcept { return getBusImpl (*this, isInput, busIndex); } //============================================================================== /** Callback to query if a bus can currently be added. @@ -904,7 +910,7 @@ public: processBlockBypassed but use the returned parameter to control the bypass state instead. - A plug-in can override this function to return a parameter which control's your + A plug-in can override this function to return a parameter which controls your plug-in's bypass. You should always check the value of this parameter in your processBlock callback and bypass any effects if it is non-zero. */ @@ -923,6 +929,21 @@ public: */ bool isNonRealtime() const noexcept { return nonRealtime; } + /** Returns no if the processor is being run in an offline mode for rendering. + + If the processor is being run live on realtime signals, this returns yes. + If the mode is unknown, this will assume it's realtime and return yes. + + This value may be unreliable until the prepareToPlay() method has been called, + and could change each time prepareToPlay() is called. + + @see setNonRealtime() + */ + Realtime isRealtime() const noexcept + { + return isNonRealtime() ? Realtime::no : Realtime::yes; + } + /** Called by the host to tell this processor whether it's being used in a non-realtime capacity for offline rendering or bouncing. */ @@ -1200,10 +1221,10 @@ public: wrapperType_VST3, wrapperType_AudioUnit, wrapperType_AudioUnitv3, - wrapperType_RTAS, wrapperType_AAX, wrapperType_Standalone, - wrapperType_Unity + wrapperType_Unity, + wrapperType_LV2 }; /** When loaded by a plugin wrapper, this flag will be set to indicate the type @@ -1452,6 +1473,12 @@ private: return layouts; } + template + static auto getBusImpl (This& t, bool isInput, int busIndex) -> decltype (t.getBus (isInput, busIndex)) + { + return (isInput ? t.inputBuses : t.outputBuses)[busIndex]; + } + //============================================================================== static BusesProperties busesPropertiesFromLayoutArray (const Array&); @@ -1495,7 +1522,7 @@ private: #endif void checkForDuplicateTrimmedParamID (AudioProcessorParameter*); - void checkForUnsafeParamID (AudioProcessorParameter*); + void validateParameter (AudioProcessorParameter*); void checkForDuplicateParamID (AudioProcessorParameter*); void checkForDuplicateGroupIDs (const AudioProcessorParameterGroup&); diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp index 038fbb5d..3b88ccee 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -58,12 +58,12 @@ void AudioProcessorEditor::initialise() { /* ========================================================================== - In accordance with the terms of the JUCE 6 End-Use License Agreement, the + In accordance with the terms of the JUCE 7 End-Use License Agreement, the JUCE Code in SECTION A cannot be removed, changed or otherwise rendered ineffective unless you have a JUCE Indie or Pro license, or are using JUCE under the GPL v3 license. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence ========================================================================== */ diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h index 896d018c..df43af64 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h b/modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h index af7bf1b8..1c3de6b9 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorEditorHostContext.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp index f9999c80..ea943564 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -37,8 +37,6 @@ static void updateOnMessageThread (AsyncUpdater& updater) template struct GraphRenderSequence { - GraphRenderSequence() {} - struct Context { FloatType** audioBuffers; @@ -64,6 +62,8 @@ struct GraphRenderSequence midiChunk.clear(); midiChunk.addEvents (midiMessages, chunkStartSample, chunkSize, -chunkStartSample); + // Splitting up the buffer like this will cause the play head and host time to be + // invalid for all but the first chunk... perform (audioChunk, midiChunk, audioPlayHead); chunkStartSample += maxSamples; @@ -268,7 +268,18 @@ private: for (int i = 0; i < totalChans; ++i) audioChannels[i] = c.audioBuffers[audioChannelsToUse.getUnchecked (i)]; - AudioBuffer buffer (audioChannels, totalChans, c.numSamples); + auto numAudioChannels = [this] + { + if (const auto* proc = node->getProcessor()) + if (proc->getTotalNumInputChannels() == 0 && proc->getTotalNumOutputChannels() == 0) + return 0; + + return totalChans; + }(); + + AudioBuffer buffer (audioChannels, numAudioChannels, c.numSamples); + + const ScopedLock lock (processor.getCallbackLock()); if (processor.isSuspended()) buffer.clear(); diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h index 7b6ab003..5b690882 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -156,17 +156,24 @@ public: void unprepare(); template - void processBlock (AudioBuffer& audio, MidiBuffer& midi) + void callProcessFunction (AudioBuffer& audio, + MidiBuffer& midi, + void (AudioProcessor::* function) (AudioBuffer&, MidiBuffer&)) { const ScopedLock lock (processorLock); - processor->processBlock (audio, midi); + (processor.get()->*function) (audio, midi); + } + + template + void processBlock (AudioBuffer& audio, MidiBuffer& midi) + { + callProcessFunction (audio, midi, &AudioProcessor::processBlock); } template void processBlockBypassed (AudioBuffer& audio, MidiBuffer& midi) { - const ScopedLock lock (processorLock); - processor->processBlockBypassed (audio, midi); + callProcessFunction (audio, midi, &AudioProcessor::processBlockBypassed); } CriticalSection processorLock; diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h b/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h index 9f695ddc..77516239 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h b/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h index bdb5360d..29d5d64d 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -39,7 +39,58 @@ class AudioProcessor; class JUCE_API AudioProcessorParameter { public: - AudioProcessorParameter() noexcept; + AudioProcessorParameter() noexcept = default; + + /** The version hint supplied to this constructor is used in Audio Unit plugins to aid ordering + parameter identifiers when JUCE_FORCE_USE_LEGACY_PARAM_IDS is not enabled. + + When adding a parameter that is not present in a previous version of the Audio Unit, you + must ensure that the version hint supplied is a number higher than that of any parameter in + any previous plugin version. + + For example, in the first release of a plugin, every parameter was created with "1" as a + version hint. If you add some parameters in the second release of the plugin, all of the + new parameters should have "2" as a version hint. Additional parameters added in subsequent + plugin versions should have "3", "4", and so forth, increasing monotonically. + + Note that adding or removing parameters with a version hint that is lower than the maximum + version hint of all parameters will break saved automation in some hosts, so be careful! + + A version hint of "0" will be treated as though the version hint has not been set + explicitly. When targeting the AU format, the version hint may be checked at runtime in + debug builds to ensure that it has been set. + + Rationale: + + According to Apple's Documentation: + > An audio unit parameter is uniquely identified by the combination of its scope, element, and ID. + + However, Logic Pro and GarageBand have a known limitation that causes them to use parameter + indices instead of IDs to identify parameters. The effect of this is that adding parameters + to a later version of a plugin can break automation saved with an earlier version of the + plugin if the indices of existing parameters are changed. It is *always* unsafe to remove + parameters from an Audio Unit plugin that will be used in one of these hosts, because + removing a parameter will always modify the indices of following parameters. + + In order to work around this limitation, parameters in AUv2 plugins are sorted first by + their version hint, and then by the hash of their string identifier. As long as the + parameters from later versions of the plugin always have a version hint that is higher than + the parameters from earlier versions of the plugin, recall of automation data will work as + expected in Logic and GarageBand. + + Note that we can't just use the JUCE parameter index directly in order to preserve ordering. + This would require all new parameters to be added at the end of the parameter list, which + would make it impossible to add parameters to existing parameter groups. It would also make + it awkward to structure code sensibly, undoing all of the benefits of string-based parameter + identifiers. + + At time of writing, AUv3 plugins seem to be affected by the same issue, but there does not + appear to be any API to control parameter indices in this format. Therefore, when building + AUv3 plugins you must not add or remove parameters in subsequent plugin versions if you + wish to support Logic and GarageBand. + */ + explicit AudioProcessorParameter (int versionHint) + : version (versionHint) {} /** Destructor. */ virtual ~AudioProcessorParameter(); @@ -224,6 +275,10 @@ public: */ virtual StringArray getAllValueStrings() const; + //============================================================================== + /** @see AudioProcessorParameter(int) */ + int getVersionHint() const { return version; } + //============================================================================== /** A base class for listeners that want to know about changes to an @@ -291,6 +346,7 @@ private: friend class LegacyAudioParameter; AudioProcessor* processor = nullptr; int parameterIndex = -1; + int version = 0; CriticalSection listenerLock; Array listeners; mutable StringArray valueStrings; diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp index 90599802..f66854c2 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h b/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h index 46ae9225..5bb4f372 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp b/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp index 8c9df0d4..ad908494 100644 --- a/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp +++ b/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h b/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h index ce003b19..85a23295 100644 --- a/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h +++ b/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h b/modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h index 2d4990af..0485808d 100644 --- a/modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h +++ b/modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -34,6 +34,8 @@ namespace juce */ struct HostedAudioProcessorParameter : public AudioProcessorParameter { + using AudioProcessorParameter::AudioProcessorParameter; + /** Returns an ID that is unique to this parameter. Parameter indices are unstable across plugin versions, which means that the diff --git a/modules/juce_audio_processors/processors/juce_PluginDescription.cpp b/modules/juce_audio_processors/processors/juce_PluginDescription.cpp index a7f2d1c7..470ff9d9 100644 --- a/modules/juce_audio_processors/processors/juce_PluginDescription.cpp +++ b/modules/juce_audio_processors/processors/juce_PluginDescription.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -79,6 +79,7 @@ std::unique_ptr PluginDescription::createXml() const e->setAttribute ("numInputs", numInputChannels); e->setAttribute ("numOutputs", numOutputChannels); e->setAttribute ("isShell", hasSharedContainer); + e->setAttribute ("hasARAExtension", hasARAExtension); e->setAttribute ("uid", String::toHexString (deprecatedUid)); @@ -102,6 +103,7 @@ bool PluginDescription::loadFromXml (const XmlElement& xml) numInputChannels = xml.getIntAttribute ("numInputs"); numOutputChannels = xml.getIntAttribute ("numOutputs"); hasSharedContainer = xml.getBoolAttribute ("isShell", false); + hasARAExtension = xml.getBoolAttribute ("hasARAExtension", false); deprecatedUid = xml.getStringAttribute ("uid").getHexValue32(); uniqueId = xml.getStringAttribute ("uniqueId", "0").getHexValue32(); diff --git a/modules/juce_audio_processors/processors/juce_PluginDescription.h b/modules/juce_audio_processors/processors/juce_PluginDescription.h index c01b73b9..08f1939f 100644 --- a/modules/juce_audio_processors/processors/juce_PluginDescription.h +++ b/modules/juce_audio_processors/processors/juce_PluginDescription.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -129,6 +129,9 @@ public: /** True if the plug-in is part of a multi-type container, e.g. a VST Shell. */ bool hasSharedContainer = false; + /** True if the plug-in is ARA enabled and can supply a valid ARAFactoryWrapper. */ + bool hasARAExtension = false; + /** Returns true if the two descriptions refer to the same plug-in. This isn't quite as simple as them just having the same file (because of diff --git a/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp b/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp index 916eb442..9775d299 100644 --- a/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp +++ b/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/scanning/juce_KnownPluginList.h b/modules/juce_audio_processors/scanning/juce_KnownPluginList.h index b6e48120..9af96f4a 100644 --- a/modules/juce_audio_processors/scanning/juce_KnownPluginList.h +++ b/modules/juce_audio_processors/scanning/juce_KnownPluginList.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp b/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp index 9eab44c2..7f79c0d3 100644 --- a/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp +++ b/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h b/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h index fc8aa8c5..30f532c9 100644 --- a/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h +++ b/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp b/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp index b1e3484a..6af4db76 100644 --- a/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp +++ b/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/scanning/juce_PluginListComponent.h b/modules/juce_audio_processors/scanning/juce_PluginListComponent.h index d9090869..42f7433c 100644 --- a/modules/juce_audio_processors/scanning/juce_PluginListComponent.h +++ b/modules/juce_audio_processors/scanning/juce_PluginListComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp b/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp new file mode 100644 index 00000000..cbbe5df0 --- /dev/null +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp @@ -0,0 +1,971 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +class ARADocumentControllerSpecialisation::ARADocumentControllerImpl : public ARADocumentController, + private juce::Timer +{ +public: + ARADocumentControllerImpl (const ARA::PlugIn::PlugInEntry* entry, + const ARA::ARADocumentControllerHostInstance* instance, + ARADocumentControllerSpecialisation* spec) + : ARADocumentController (entry, instance), specialisation (spec) + { + } + + template + std::vector const& getPlaybackRenderers() const noexcept + { + return ARA::PlugIn::DocumentController::getPlaybackRenderers(); + } + + template + std::vector const& getEditorRenderers() const noexcept + { + return ARA::PlugIn::DocumentController::getEditorRenderers(); + } + + template + std::vector const& getEditorViews() const noexcept + { + return ARA::PlugIn::DocumentController::getEditorViews(); + } + + auto getSpecialisation() { return specialisation; } + +protected: + //============================================================================== + bool doRestoreObjectsFromStream (ARAInputStream& input, const ARARestoreObjectsFilter* filter) noexcept + { + return specialisation->doRestoreObjectsFromStream (input, filter); + } + + bool doStoreObjectsToStream (ARAOutputStream& output, const ARAStoreObjectsFilter* filter) noexcept + { + return specialisation->doStoreObjectsToStream (output, filter); + } + + //============================================================================== + // Model object creation + ARA::PlugIn::Document* doCreateDocument () noexcept override; + ARA::PlugIn::MusicalContext* doCreateMusicalContext (ARA::PlugIn::Document* document, ARA::ARAMusicalContextHostRef hostRef) noexcept override; + ARA::PlugIn::RegionSequence* doCreateRegionSequence (ARA::PlugIn::Document* document, ARA::ARARegionSequenceHostRef hostRef) noexcept override; + ARA::PlugIn::AudioSource* doCreateAudioSource (ARA::PlugIn::Document* document, ARA::ARAAudioSourceHostRef hostRef) noexcept override; + ARA::PlugIn::AudioModification* doCreateAudioModification (ARA::PlugIn::AudioSource* audioSource, ARA::ARAAudioModificationHostRef hostRef, const ARA::PlugIn::AudioModification* optionalModificationToClone) noexcept override; + ARA::PlugIn::PlaybackRegion* doCreatePlaybackRegion (ARA::PlugIn::AudioModification* modification, ARA::ARAPlaybackRegionHostRef hostRef) noexcept override; + + //============================================================================== + // Plugin role implementation + friend class ARAPlaybackRegionReader; + ARA::PlugIn::PlaybackRenderer* doCreatePlaybackRenderer() noexcept override; + ARA::PlugIn::EditorRenderer* doCreateEditorRenderer() noexcept override; + ARA::PlugIn::EditorView* doCreateEditorView() noexcept override; + + //============================================================================== + // ARAAudioSource content access + bool doIsAudioSourceContentAvailable (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) noexcept override; + ARA::ARAContentGrade doGetAudioSourceContentGrade (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) noexcept override; + ARA::PlugIn::ContentReader* doCreateAudioSourceContentReader (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept override; + + //============================================================================== + // ARAAudioModification content access + bool doIsAudioModificationContentAvailable (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type) noexcept override; + ARA::ARAContentGrade doGetAudioModificationContentGrade (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type) noexcept override; + ARA::PlugIn::ContentReader* doCreateAudioModificationContentReader (ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept override; + + //============================================================================== + // ARAPlaybackRegion content access + bool doIsPlaybackRegionContentAvailable (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type) noexcept override; + ARA::ARAContentGrade doGetPlaybackRegionContentGrade (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type) noexcept override; + ARA::PlugIn::ContentReader* doCreatePlaybackRegionContentReader (ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept override; + + //============================================================================== + // ARAAudioSource analysis + bool doIsAudioSourceContentAnalysisIncomplete (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) noexcept override; + void doRequestAudioSourceContentAnalysis (ARA::PlugIn::AudioSource* audioSource, + std::vector const& contentTypes) noexcept override; + + //============================================================================== + // Analysis Algorithm selection + ARA::ARAInt32 doGetProcessingAlgorithmsCount() noexcept override; + const ARA::ARAProcessingAlgorithmProperties* doGetProcessingAlgorithmProperties (ARA::ARAInt32 algorithmIndex) noexcept override; + ARA::ARAInt32 doGetProcessingAlgorithmForAudioSource (const ARA::PlugIn::AudioSource* audioSource) noexcept override; + void doRequestProcessingAlgorithmForAudioSource (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAInt32 algorithmIndex) noexcept override; + +#ifndef DOXYGEN + + //============================================================================== + bool doRestoreObjectsFromArchive (ARA::PlugIn::HostArchiveReader* archiveReader, const ARA::PlugIn::RestoreObjectsFilter* filter) noexcept override; + bool doStoreObjectsToArchive (ARA::PlugIn::HostArchiveWriter* archiveWriter, const ARA::PlugIn::StoreObjectsFilter* filter) noexcept override; + + //============================================================================== + // Document notifications + void willBeginEditing() noexcept override; + void didEndEditing() noexcept override; + void willNotifyModelUpdates() noexcept override; + void didNotifyModelUpdates() noexcept override; + void willUpdateDocumentProperties (ARA::PlugIn::Document* document, ARADocument::PropertiesPtr newProperties) noexcept override; + void didUpdateDocumentProperties (ARA::PlugIn::Document* document) noexcept override; + void didAddMusicalContextToDocument (ARA::PlugIn::Document* document, ARA::PlugIn::MusicalContext* musicalContext) noexcept override; + void willRemoveMusicalContextFromDocument (ARA::PlugIn::Document* document, ARA::PlugIn::MusicalContext* musicalContext) noexcept override; + void didReorderMusicalContextsInDocument (ARA::PlugIn::Document* document) noexcept override; + void didAddRegionSequenceToDocument (ARA::PlugIn::Document* document, ARA::PlugIn::RegionSequence* regionSequence) noexcept override; + void willRemoveRegionSequenceFromDocument (ARA::PlugIn::Document* document, ARA::PlugIn::RegionSequence* regionSequence) noexcept override; + void didReorderRegionSequencesInDocument (ARA::PlugIn::Document* document) noexcept override; + void didAddAudioSourceToDocument (ARA::PlugIn::Document* document, ARA::PlugIn::AudioSource* audioSource) noexcept override; + void willRemoveAudioSourceFromDocument (ARA::PlugIn::Document* document, ARA::PlugIn::AudioSource* audioSource) noexcept override; + void willDestroyDocument (ARA::PlugIn::Document* document) noexcept override; + + //============================================================================== + // MusicalContext notifications + void willUpdateMusicalContextProperties (ARA::PlugIn::MusicalContext* musicalContext, ARAMusicalContext::PropertiesPtr newProperties) noexcept override; + void didUpdateMusicalContextProperties (ARA::PlugIn::MusicalContext* musicalContext) noexcept override; + void doUpdateMusicalContextContent (ARA::PlugIn::MusicalContext* musicalContext, const ARA::ARAContentTimeRange* range, ARA::ContentUpdateScopes flags) noexcept override; + void didAddRegionSequenceToMusicalContext (ARA::PlugIn::MusicalContext* musicalContext, ARA::PlugIn::RegionSequence* regionSequence) noexcept override; + void willRemoveRegionSequenceFromMusicalContext (ARA::PlugIn::MusicalContext* musicalContext, ARA::PlugIn::RegionSequence* regionSequence) noexcept override; + void didReorderRegionSequencesInMusicalContext (ARA::PlugIn::MusicalContext* musicalContext) noexcept override; + void willDestroyMusicalContext (ARA::PlugIn::MusicalContext* musicalContext) noexcept override; + + //============================================================================== + // RegionSequence notifications, typically not overridden further + void willUpdateRegionSequenceProperties (ARA::PlugIn::RegionSequence* regionSequence, ARARegionSequence::PropertiesPtr newProperties) noexcept override; + void didUpdateRegionSequenceProperties (ARA::PlugIn::RegionSequence* regionSequence) noexcept override; + void didAddPlaybackRegionToRegionSequence (ARA::PlugIn::RegionSequence* regionSequence, ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; + void willRemovePlaybackRegionFromRegionSequence (ARA::PlugIn::RegionSequence* regionSequence, ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; + void willDestroyRegionSequence (ARA::PlugIn::RegionSequence* regionSequence) noexcept override; + + //============================================================================== + // AudioSource notifications + void willUpdateAudioSourceProperties (ARA::PlugIn::AudioSource* audioSource, ARAAudioSource::PropertiesPtr newProperties) noexcept override; + void didUpdateAudioSourceProperties (ARA::PlugIn::AudioSource* audioSource) noexcept override; + void doUpdateAudioSourceContent (ARA::PlugIn::AudioSource* audioSource, const ARA::ARAContentTimeRange* range, ARA::ContentUpdateScopes flags) noexcept override; + void willEnableAudioSourceSamplesAccess (ARA::PlugIn::AudioSource* audioSource, bool enable) noexcept override; + void didEnableAudioSourceSamplesAccess (ARA::PlugIn::AudioSource* audioSource, bool enable) noexcept override; + void didAddAudioModificationToAudioSource (ARA::PlugIn::AudioSource* audioSource, ARA::PlugIn::AudioModification* audioModification) noexcept override; + void willRemoveAudioModificationFromAudioSource (ARA::PlugIn::AudioSource* audioSource, ARA::PlugIn::AudioModification* audioModification) noexcept override; + void willDeactivateAudioSourceForUndoHistory (ARA::PlugIn::AudioSource* audioSource, bool deactivate) noexcept override; + void didDeactivateAudioSourceForUndoHistory (ARA::PlugIn::AudioSource* audioSource, bool deactivate) noexcept override; + void willDestroyAudioSource (ARA::PlugIn::AudioSource* audioSource) noexcept override; + + //============================================================================== + // AudioModification notifications + void willUpdateAudioModificationProperties (ARA::PlugIn::AudioModification* audioModification, ARAAudioModification::PropertiesPtr newProperties) noexcept override; + void didUpdateAudioModificationProperties (ARA::PlugIn::AudioModification* audioModification) noexcept override; + void didAddPlaybackRegionToAudioModification (ARA::PlugIn::AudioModification* audioModification, ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; + void willRemovePlaybackRegionFromAudioModification (ARA::PlugIn::AudioModification* audioModification, ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; + void willDeactivateAudioModificationForUndoHistory (ARA::PlugIn::AudioModification* audioModification, bool deactivate) noexcept override; + void didDeactivateAudioModificationForUndoHistory (ARA::PlugIn::AudioModification* audioModification, bool deactivate) noexcept override; + void willDestroyAudioModification (ARA::PlugIn::AudioModification* audioModification) noexcept override; + + //============================================================================== + // PlaybackRegion notifications + void willUpdatePlaybackRegionProperties (ARA::PlugIn::PlaybackRegion* playbackRegion, ARAPlaybackRegion::PropertiesPtr newProperties) noexcept override; + void didUpdatePlaybackRegionProperties (ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; + void willDestroyPlaybackRegion (ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; + + //============================================================================== + // juce::Timer overrides + void timerCallback() override; + +public: + //============================================================================== + /** @internal */ + void internalNotifyAudioSourceAnalysisProgressStarted (ARAAudioSource* audioSource) override; + + /** @internal */ + void internalNotifyAudioSourceAnalysisProgressUpdated (ARAAudioSource* audioSource, float progress) override; + + /** @internal */ + void internalNotifyAudioSourceAnalysisProgressCompleted (ARAAudioSource* audioSource) override; + + /** @internal */ + void internalDidUpdateAudioSourceAnalysisProgress (ARAAudioSource* audioSource, + ARAAudioSource::ARAAnalysisProgressState state, + float progress) override; + + //============================================================================== + /** @internal */ + void internalNotifyAudioSourceContentChanged (ARAAudioSource* audioSource, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) override; + + /** @internal */ + void internalNotifyAudioModificationContentChanged (ARAAudioModification* audioModification, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) override; + + /** @internal */ + void internalNotifyPlaybackRegionContentChanged (ARAPlaybackRegion* playbackRegion, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) override; + +#endif + +private: + //============================================================================== + ARADocumentControllerSpecialisation* specialisation; + std::atomic internalAnalysisProgressIsSynced { true }; + ScopedJuceInitialiser_GUI libraryInitialiser; + int activeAudioSourcesCount = 0; + + //============================================================================== + template + void notifyListeners (Function ModelObject::Listener::* function, ModelObject* modelObject, Ts... ts) + { + (specialisation->*function) (modelObject, ts...); + modelObject->notifyListeners ([&] (auto& l) + { + try + { + (l.*function) (modelObject, ts...); + } + catch (...) + { + } + }); + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARADocumentControllerImpl) +}; + +ARA::PlugIn::DocumentController* ARADocumentControllerSpecialisation::getDocumentController() noexcept +{ + return documentController.get(); +} + +//============================================================================== +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalNotifyAudioSourceAnalysisProgressStarted (ARAAudioSource* audioSource) +{ + if (audioSource->internalAnalysisProgressTracker.updateProgress (ARA::kARAAnalysisProgressStarted, 0.0f)) + internalAnalysisProgressIsSynced.store (false, std::memory_order_release); + + DocumentController::notifyAudioSourceAnalysisProgressStarted (audioSource); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalNotifyAudioSourceAnalysisProgressUpdated (ARAAudioSource* audioSource, + float progress) +{ + if (audioSource->internalAnalysisProgressTracker.updateProgress (ARA::kARAAnalysisProgressUpdated, progress)) + internalAnalysisProgressIsSynced.store (false, std::memory_order_release); + + DocumentController::notifyAudioSourceAnalysisProgressUpdated (audioSource, progress); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalNotifyAudioSourceAnalysisProgressCompleted (ARAAudioSource* audioSource) +{ + if (audioSource->internalAnalysisProgressTracker.updateProgress (ARA::kARAAnalysisProgressCompleted, 1.0f)) + internalAnalysisProgressIsSynced.store (false, std::memory_order_release); + + DocumentController::notifyAudioSourceAnalysisProgressCompleted (audioSource); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalDidUpdateAudioSourceAnalysisProgress (ARAAudioSource* audioSource, + ARAAudioSource::ARAAnalysisProgressState state, + float progress) +{ + specialisation->didUpdateAudioSourceAnalysisProgress (audioSource, state, progress); +} + +//============================================================================== +ARADocumentControllerSpecialisation* ARADocumentControllerSpecialisation::getSpecialisedDocumentControllerImpl (ARA::PlugIn::DocumentController* dc) +{ + return static_cast (dc)->getSpecialisation(); +} + +ARADocument* ARADocumentControllerSpecialisation::getDocumentImpl() +{ + return documentController->getDocument(); +} + +//============================================================================== +// some helper macros to ease repeated declaration & implementation of notification functions below: +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments") + +// no notification arguments +#define OVERRIDE_TO_NOTIFY_1(function, ModelObjectType, modelObject) \ + void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::function (ARA::PlugIn::ModelObjectType* modelObject) noexcept \ + { \ + notifyListeners (&ARA##ModelObjectType::Listener::function, static_cast (modelObject)); \ + } + +// single notification argument, model object version +#define OVERRIDE_TO_NOTIFY_2(function, ModelObjectType, modelObject, ArgumentType, argument) \ + void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::function (ARA::PlugIn::ModelObjectType* modelObject, ARA::PlugIn::ArgumentType argument) noexcept \ + { \ + notifyListeners (&ARA##ModelObjectType::Listener::function, static_cast (modelObject), static_cast (argument)); \ + } + +// single notification argument, non-model object version +#define OVERRIDE_TO_NOTIFY_3(function, ModelObjectType, modelObject, ArgumentType, argument) \ + void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::function (ARA::PlugIn::ModelObjectType* modelObject, ArgumentType argument) noexcept \ + { \ + notifyListeners (&ARA##ModelObjectType::Listener::function, static_cast (modelObject), argument); \ + } + +//============================================================================== +ARA::PlugIn::Document* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateDocument() noexcept +{ + auto* document = specialisation->doCreateDocument(); + + // Your Document subclass must inherit from juce::ARADocument + jassert (dynamic_cast (document)); + + return document; +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::willBeginEditing() noexcept +{ + notifyListeners (&ARADocument::Listener::willBeginEditing, static_cast (getDocument())); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::didEndEditing() noexcept +{ + notifyListeners (&ARADocument::Listener::didEndEditing, static_cast (getDocument())); + + if (isTimerRunning() && (activeAudioSourcesCount == 0)) + stopTimer(); + else if (! isTimerRunning() && (activeAudioSourcesCount > 0)) + startTimerHz (20); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::willNotifyModelUpdates() noexcept +{ + notifyListeners (&ARADocument::Listener::willNotifyModelUpdates, static_cast (getDocument())); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::didNotifyModelUpdates() noexcept +{ + notifyListeners (&ARADocument::Listener::didNotifyModelUpdates, static_cast (getDocument())); +} + +//============================================================================== +bool ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doRestoreObjectsFromArchive (ARA::PlugIn::HostArchiveReader* archiveReader, + const ARA::PlugIn::RestoreObjectsFilter* filter) noexcept +{ + ARAInputStream reader (archiveReader); + return doRestoreObjectsFromStream (reader, filter); +} + +bool ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doStoreObjectsToArchive (ARA::PlugIn::HostArchiveWriter* archiveWriter, + const ARA::PlugIn::StoreObjectsFilter* filter) noexcept +{ + ARAOutputStream writer (archiveWriter); + return doStoreObjectsToStream (writer, filter); +} + +//============================================================================== +OVERRIDE_TO_NOTIFY_3 (willUpdateDocumentProperties, Document, document, ARADocument::PropertiesPtr, newProperties) +OVERRIDE_TO_NOTIFY_1 (didUpdateDocumentProperties, Document, document) +OVERRIDE_TO_NOTIFY_2 (didAddMusicalContextToDocument, Document, document, MusicalContext*, musicalContext) +OVERRIDE_TO_NOTIFY_2 (willRemoveMusicalContextFromDocument, Document, document, MusicalContext*, musicalContext) +OVERRIDE_TO_NOTIFY_1 (didReorderMusicalContextsInDocument, Document, document) +OVERRIDE_TO_NOTIFY_2 (didAddRegionSequenceToDocument, Document, document, RegionSequence*, regionSequence) +OVERRIDE_TO_NOTIFY_2 (willRemoveRegionSequenceFromDocument, Document, document, RegionSequence*, regionSequence) +OVERRIDE_TO_NOTIFY_1 (didReorderRegionSequencesInDocument, Document, document) +OVERRIDE_TO_NOTIFY_2 (didAddAudioSourceToDocument, Document, document, AudioSource*, audioSource) +OVERRIDE_TO_NOTIFY_2 (willRemoveAudioSourceFromDocument, Document, document, AudioSource*, audioSource) +OVERRIDE_TO_NOTIFY_1 (willDestroyDocument, Document, document) + +//============================================================================== +ARA::PlugIn::MusicalContext* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateMusicalContext (ARA::PlugIn::Document* document, + ARA::ARAMusicalContextHostRef hostRef) noexcept +{ + return specialisation->doCreateMusicalContext (static_cast (document), hostRef); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doUpdateMusicalContextContent (ARA::PlugIn::MusicalContext* musicalContext, + const ARA::ARAContentTimeRange*, + ARA::ContentUpdateScopes flags) noexcept +{ + notifyListeners (&ARAMusicalContext::Listener::doUpdateMusicalContextContent, + static_cast (musicalContext), + flags); +} + +OVERRIDE_TO_NOTIFY_3 (willUpdateMusicalContextProperties, MusicalContext, musicalContext, ARAMusicalContext::PropertiesPtr, newProperties) +OVERRIDE_TO_NOTIFY_1 (didUpdateMusicalContextProperties, MusicalContext, musicalContext) +OVERRIDE_TO_NOTIFY_2 (didAddRegionSequenceToMusicalContext, MusicalContext, musicalContext, RegionSequence*, regionSequence) +OVERRIDE_TO_NOTIFY_2 (willRemoveRegionSequenceFromMusicalContext, MusicalContext, musicalContext, RegionSequence*, regionSequence) +OVERRIDE_TO_NOTIFY_1 (didReorderRegionSequencesInMusicalContext, MusicalContext, musicalContext) +OVERRIDE_TO_NOTIFY_1 (willDestroyMusicalContext, MusicalContext, musicalContext) + +//============================================================================== +ARA::PlugIn::RegionSequence* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateRegionSequence (ARA::PlugIn::Document* document, ARA::ARARegionSequenceHostRef hostRef) noexcept +{ + return specialisation->doCreateRegionSequence (static_cast (document), hostRef); +} + +OVERRIDE_TO_NOTIFY_3 (willUpdateRegionSequenceProperties, RegionSequence, regionSequence, ARARegionSequence::PropertiesPtr, newProperties) +OVERRIDE_TO_NOTIFY_1 (didUpdateRegionSequenceProperties, RegionSequence, regionSequence) +OVERRIDE_TO_NOTIFY_2 (didAddPlaybackRegionToRegionSequence, RegionSequence, regionSequence, PlaybackRegion*, playbackRegion) +OVERRIDE_TO_NOTIFY_2 (willRemovePlaybackRegionFromRegionSequence, RegionSequence, regionSequence, PlaybackRegion*, playbackRegion) +OVERRIDE_TO_NOTIFY_1 (willDestroyRegionSequence, RegionSequence, regionSequence) + +//============================================================================== +ARA::PlugIn::AudioSource* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateAudioSource (ARA::PlugIn::Document* document, ARA::ARAAudioSourceHostRef hostRef) noexcept +{ + ++activeAudioSourcesCount; + return specialisation->doCreateAudioSource (static_cast (document), hostRef); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doUpdateAudioSourceContent (ARA::PlugIn::AudioSource* audioSource, + const ARA::ARAContentTimeRange*, + ARA::ContentUpdateScopes flags) noexcept +{ + notifyListeners (&ARAAudioSource::Listener::doUpdateAudioSourceContent, static_cast (audioSource), flags); +} + +OVERRIDE_TO_NOTIFY_3 (willUpdateAudioSourceProperties, AudioSource, audioSource, ARAAudioSource::PropertiesPtr, newProperties) +OVERRIDE_TO_NOTIFY_1 (didUpdateAudioSourceProperties, AudioSource, audioSource) +OVERRIDE_TO_NOTIFY_3 (willEnableAudioSourceSamplesAccess, AudioSource, audioSource, bool, enable) +OVERRIDE_TO_NOTIFY_3 (didEnableAudioSourceSamplesAccess, AudioSource, audioSource, bool, enable) +OVERRIDE_TO_NOTIFY_2 (didAddAudioModificationToAudioSource, AudioSource, audioSource, AudioModification*, audioModification) +OVERRIDE_TO_NOTIFY_2 (willRemoveAudioModificationFromAudioSource, AudioSource, audioSource, AudioModification*, audioModification) +OVERRIDE_TO_NOTIFY_3 (willDeactivateAudioSourceForUndoHistory, AudioSource, audioSource, bool, deactivate) + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::didDeactivateAudioSourceForUndoHistory (ARA::PlugIn::AudioSource* audioSource, + bool deactivate) noexcept +{ + activeAudioSourcesCount += (deactivate ? -1 : 1); + notifyListeners (&ARAAudioSource::Listener::didDeactivateAudioSourceForUndoHistory, + static_cast (audioSource), + deactivate); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::willDestroyAudioSource (ARA::PlugIn::AudioSource* audioSource) noexcept +{ + if (! audioSource->isDeactivatedForUndoHistory()) + --activeAudioSourcesCount; + + notifyListeners (&ARAAudioSource::Listener::willDestroyAudioSource, static_cast (audioSource)); +} +//============================================================================== +ARA::PlugIn::AudioModification* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateAudioModification (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAAudioModificationHostRef hostRef, + const ARA::PlugIn::AudioModification* optionalModificationToClone) noexcept +{ + return specialisation->doCreateAudioModification (static_cast (audioSource), + hostRef, + static_cast (optionalModificationToClone)); +} + +OVERRIDE_TO_NOTIFY_3 (willUpdateAudioModificationProperties, AudioModification, audioModification, ARAAudioModification::PropertiesPtr, newProperties) +OVERRIDE_TO_NOTIFY_1 (didUpdateAudioModificationProperties, AudioModification, audioModification) +OVERRIDE_TO_NOTIFY_2 (didAddPlaybackRegionToAudioModification, AudioModification, audioModification, PlaybackRegion*, playbackRegion) +OVERRIDE_TO_NOTIFY_2 (willRemovePlaybackRegionFromAudioModification, AudioModification, audioModification, PlaybackRegion*, playbackRegion) +OVERRIDE_TO_NOTIFY_3 (willDeactivateAudioModificationForUndoHistory, AudioModification, audioModification, bool, deactivate) +OVERRIDE_TO_NOTIFY_3 (didDeactivateAudioModificationForUndoHistory, AudioModification, audioModification, bool, deactivate) +OVERRIDE_TO_NOTIFY_1 (willDestroyAudioModification, AudioModification, audioModification) + +//============================================================================== +ARA::PlugIn::PlaybackRegion* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreatePlaybackRegion (ARA::PlugIn::AudioModification* modification, + ARA::ARAPlaybackRegionHostRef hostRef) noexcept +{ + return specialisation->doCreatePlaybackRegion (static_cast (modification), hostRef); +} + +OVERRIDE_TO_NOTIFY_3 (willUpdatePlaybackRegionProperties, PlaybackRegion, playbackRegion, ARAPlaybackRegion::PropertiesPtr, newProperties) +OVERRIDE_TO_NOTIFY_1 (didUpdatePlaybackRegionProperties, PlaybackRegion, playbackRegion) +OVERRIDE_TO_NOTIFY_1 (willDestroyPlaybackRegion, PlaybackRegion, playbackRegion) + +//============================================================================== +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalNotifyAudioSourceContentChanged (ARAAudioSource* audioSource, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) +{ + if (notifyARAHost) + DocumentController::notifyAudioSourceContentChanged (audioSource, scopeFlags); + + notifyListeners (&ARAAudioSource::Listener::doUpdateAudioSourceContent, audioSource, scopeFlags); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalNotifyAudioModificationContentChanged (ARAAudioModification* audioModification, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) +{ + if (notifyARAHost) + DocumentController::notifyAudioModificationContentChanged (audioModification, scopeFlags); + + notifyListeners (&ARAAudioModification::Listener::didUpdateAudioModificationContent, audioModification, scopeFlags); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::internalNotifyPlaybackRegionContentChanged (ARAPlaybackRegion* playbackRegion, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) +{ + if (notifyARAHost) + DocumentController::notifyPlaybackRegionContentChanged (playbackRegion, scopeFlags); + + notifyListeners (&ARAPlaybackRegion::Listener::didUpdatePlaybackRegionContent, playbackRegion, scopeFlags); +} + +//============================================================================== +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +#undef OVERRIDE_TO_NOTIFY_1 +#undef OVERRIDE_TO_NOTIFY_2 +#undef OVERRIDE_TO_NOTIFY_3 + +//============================================================================== +ARADocument* ARADocumentControllerSpecialisation::doCreateDocument() +{ + return new ARADocument (static_cast (getDocumentController())); +} + +ARAMusicalContext* ARADocumentControllerSpecialisation::doCreateMusicalContext (ARADocument* document, + ARA::ARAMusicalContextHostRef hostRef) +{ + return new ARAMusicalContext (static_cast (document), hostRef); +} + +ARARegionSequence* ARADocumentControllerSpecialisation::doCreateRegionSequence (ARADocument* document, + ARA::ARARegionSequenceHostRef hostRef) +{ + return new ARARegionSequence (static_cast (document), hostRef); +} + +ARAAudioSource* ARADocumentControllerSpecialisation::doCreateAudioSource (ARADocument* document, + ARA::ARAAudioSourceHostRef hostRef) +{ + return new ARAAudioSource (static_cast (document), hostRef); +} + +ARAAudioModification* ARADocumentControllerSpecialisation::doCreateAudioModification ( + ARAAudioSource* audioSource, + ARA::ARAAudioModificationHostRef hostRef, + const ARAAudioModification* optionalModificationToClone) +{ + return new ARAAudioModification (static_cast (audioSource), + hostRef, + static_cast (optionalModificationToClone)); +} + +ARAPlaybackRegion* + ARADocumentControllerSpecialisation::doCreatePlaybackRegion (ARAAudioModification* modification, + ARA::ARAPlaybackRegionHostRef hostRef) +{ + return new ARAPlaybackRegion (static_cast (modification), hostRef); +} + +//============================================================================== +ARA::PlugIn::PlaybackRenderer* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreatePlaybackRenderer() noexcept +{ + return specialisation->doCreatePlaybackRenderer(); +} + +ARA::PlugIn::EditorRenderer* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateEditorRenderer() noexcept +{ + return specialisation->doCreateEditorRenderer(); +} + +ARA::PlugIn::EditorView* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateEditorView() noexcept +{ + return specialisation->doCreateEditorView(); +} + +bool ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doIsAudioSourceContentAvailable (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) noexcept +{ + return specialisation->doIsAudioSourceContentAvailable (audioSource, type); +} + +ARA::ARAContentGrade ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doGetAudioSourceContentGrade (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) noexcept +{ + return specialisation->doGetAudioSourceContentGrade (audioSource, type); +} + +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateAudioSourceContentReader (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept +{ + return specialisation->doCreateAudioSourceContentReader (audioSource, type, range); +} + +bool ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doIsAudioModificationContentAvailable (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type) noexcept +{ + return specialisation->doIsAudioModificationContentAvailable (audioModification, type); +} + +ARA::ARAContentGrade ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doGetAudioModificationContentGrade (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type) noexcept +{ + return specialisation->doGetAudioModificationContentGrade (audioModification, type); +} + +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreateAudioModificationContentReader (ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept +{ + return specialisation->doCreateAudioModificationContentReader (audioModification, type, range); +} + +bool ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doIsPlaybackRegionContentAvailable (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type) noexcept +{ + return specialisation->doIsPlaybackRegionContentAvailable (playbackRegion, type); +} + +ARA::ARAContentGrade + ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doGetPlaybackRegionContentGrade (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type) noexcept +{ + return specialisation->doGetPlaybackRegionContentGrade (playbackRegion, type); +} + +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doCreatePlaybackRegionContentReader (ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) noexcept +{ + return specialisation->doCreatePlaybackRegionContentReader (playbackRegion, type, range); +} + +bool ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doIsAudioSourceContentAnalysisIncomplete (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) noexcept +{ + return specialisation->doIsAudioSourceContentAnalysisIncomplete (audioSource, type); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doRequestAudioSourceContentAnalysis (ARA::PlugIn::AudioSource* audioSource, + std::vector const& contentTypes) noexcept +{ + specialisation->doRequestAudioSourceContentAnalysis (audioSource, contentTypes); +} + +ARA::ARAInt32 ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doGetProcessingAlgorithmsCount() noexcept +{ + return specialisation->doGetProcessingAlgorithmsCount(); +} + +const ARA::ARAProcessingAlgorithmProperties* ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doGetProcessingAlgorithmProperties (ARA::ARAInt32 algorithmIndex) noexcept +{ + return specialisation->doGetProcessingAlgorithmProperties (algorithmIndex); +} + +ARA::ARAInt32 ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doGetProcessingAlgorithmForAudioSource (const ARA::PlugIn::AudioSource* audioSource) noexcept +{ + return specialisation->doGetProcessingAlgorithmForAudioSource (audioSource); +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::doRequestProcessingAlgorithmForAudioSource (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAInt32 algorithmIndex) noexcept +{ + return specialisation->doRequestProcessingAlgorithmForAudioSource (audioSource, algorithmIndex); +} + +//============================================================================== +// Helper code for ARADocumentControllerSpecialisation::ARADocumentControllerImpl::timerCallback() to +// rewire the host-related ARA SDK's progress tracker to our internal update mechanism. +namespace ModelUpdateControllerProgressAdapter +{ + using namespace ARA; + + static void ARA_CALL notifyAudioSourceAnalysisProgress (ARAModelUpdateControllerHostRef /*controllerHostRef*/, + ARAAudioSourceHostRef audioSourceHostRef, ARAAnalysisProgressState state, float value) noexcept + { + auto audioSource = reinterpret_cast (audioSourceHostRef); + audioSource->getDocumentController()->internalDidUpdateAudioSourceAnalysisProgress (audioSource, state, value); + audioSource->notifyListeners ([&] (ARAAudioSource::Listener& l) { l.didUpdateAudioSourceAnalysisProgress (audioSource, state, value); }); + } + + static void ARA_CALL notifyAudioSourceContentChanged (ARAModelUpdateControllerHostRef, ARAAudioSourceHostRef, + const ARAContentTimeRange*, ARAContentUpdateFlags) noexcept + { + jassertfalse; // not to be called - this adapter only forwards analysis progress + } + + static void ARA_CALL notifyAudioModificationContentChanged (ARAModelUpdateControllerHostRef, ARAAudioModificationHostRef, + const ARAContentTimeRange*, ARAContentUpdateFlags) noexcept + { + jassertfalse; // not to be called - this adapter only forwards analysis progress + } + + static void ARA_CALL notifyPlaybackRegionContentChanged (ARAModelUpdateControllerHostRef, ARAPlaybackRegionHostRef, + const ARAContentTimeRange*, ARAContentUpdateFlags) noexcept + { + jassertfalse; // not to be called - this adapter only forwards analysis progress + } + + static ARA::PlugIn::HostModelUpdateController* get() + { + static const auto modelUpdateControllerInterface = makeARASizedStruct (&ARA::ARAModelUpdateControllerInterface::notifyPlaybackRegionContentChanged, + ModelUpdateControllerProgressAdapter::notifyAudioSourceAnalysisProgress, + ModelUpdateControllerProgressAdapter::notifyAudioSourceContentChanged, + ModelUpdateControllerProgressAdapter::notifyAudioModificationContentChanged, + ModelUpdateControllerProgressAdapter::notifyPlaybackRegionContentChanged); + + static const auto instance = makeARASizedStruct (&ARA::ARADocumentControllerHostInstance::playbackControllerInterface, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + &modelUpdateControllerInterface, + nullptr, + nullptr); + + static auto progressAdapter = ARA::PlugIn::HostModelUpdateController { &instance }; + return &progressAdapter; + } +} + +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::timerCallback() +{ + if (! internalAnalysisProgressIsSynced.exchange (true, std::memory_order_release)) + for (auto& audioSource : getDocument()->getAudioSources()) + audioSource->internalAnalysisProgressTracker.notifyProgress (ModelUpdateControllerProgressAdapter::get(), + reinterpret_cast (audioSource)); +} + +//============================================================================== +ARAInputStream::ARAInputStream (ARA::PlugIn::HostArchiveReader* reader) + : archiveReader (reader), + size ((int64) reader->getArchiveSize()) +{} + +int ARAInputStream::read (void* destBuffer, int maxBytesToRead) +{ + const auto bytesToRead = std::min ((int64) maxBytesToRead, size - position); + + if (bytesToRead > 0 && ! archiveReader->readBytesFromArchive ((ARA::ARASize) position, (ARA::ARASize) bytesToRead, + static_cast (destBuffer))) + { + failure = true; + return 0; + } + + position += bytesToRead; + return (int) bytesToRead; +} + +bool ARAInputStream::setPosition (int64 newPosition) +{ + position = jlimit ((int64) 0, size, newPosition); + return true; +} + +bool ARAInputStream::isExhausted() +{ + return position >= size; +} + +ARAOutputStream::ARAOutputStream (ARA::PlugIn::HostArchiveWriter* writer) + : archiveWriter (writer) +{} + +bool ARAOutputStream::write (const void* dataToWrite, size_t numberOfBytes) +{ + if (! archiveWriter->writeBytesToArchive ((ARA::ARASize) position, numberOfBytes, (const ARA::ARAByte*) dataToWrite)) + return false; + + position += numberOfBytes; + return true; +} + +bool ARAOutputStream::setPosition (int64 newPosition) +{ + position = newPosition; + return true; +} + +//============================================================================== +ARADocumentControllerSpecialisation::ARADocumentControllerSpecialisation ( + const ARA::PlugIn::PlugInEntry* entry, + const ARA::ARADocumentControllerHostInstance* instance) + : documentController (std::make_unique (entry, instance, this)) +{ +} + +ARADocumentControllerSpecialisation::~ARADocumentControllerSpecialisation() = default; + +ARAPlaybackRenderer* ARADocumentControllerSpecialisation::doCreatePlaybackRenderer() +{ + return new ARAPlaybackRenderer (getDocumentController()); +} + +ARAEditorRenderer* ARADocumentControllerSpecialisation::doCreateEditorRenderer() +{ + return new ARAEditorRenderer (getDocumentController()); +} + +ARAEditorView* ARADocumentControllerSpecialisation::doCreateEditorView() +{ + return new ARAEditorView (getDocumentController()); +} + +bool ARADocumentControllerSpecialisation::doIsAudioSourceContentAvailable (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) +{ + juce::ignoreUnused (audioSource, type); + return false; +} + +ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetAudioSourceContentGrade (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) +{ + // Overriding doIsAudioSourceContentAvailable() requires overriding + // doGetAudioSourceContentGrade() accordingly! + jassertfalse; + + juce::ignoreUnused (audioSource, type); + return ARA::kARAContentGradeInitial; +} + +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreateAudioSourceContentReader (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) +{ + // Overriding doIsAudioSourceContentAvailable() requires overriding + // doCreateAudioSourceContentReader() accordingly! + jassertfalse; + + juce::ignoreUnused (audioSource, type, range); + return nullptr; +} + +bool ARADocumentControllerSpecialisation::doIsAudioModificationContentAvailable (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type) +{ + juce::ignoreUnused (audioModification, type); + return false; +} + +ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetAudioModificationContentGrade (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type) +{ + // Overriding doIsAudioModificationContentAvailable() requires overriding + // doGetAudioModificationContentGrade() accordingly! + jassertfalse; + + juce::ignoreUnused (audioModification, type); + return ARA::kARAContentGradeInitial; +} + +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreateAudioModificationContentReader (ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) +{ + // Overriding doIsAudioModificationContentAvailable() requires overriding + // doCreateAudioModificationContentReader() accordingly! + jassertfalse; + + juce::ignoreUnused (audioModification, type, range); + return nullptr; +} + +bool ARADocumentControllerSpecialisation::doIsPlaybackRegionContentAvailable (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type) +{ + juce::ignoreUnused (playbackRegion, type); + return false; +} + +ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetPlaybackRegionContentGrade (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type) +{ + // Overriding doIsPlaybackRegionContentAvailable() requires overriding + // doGetPlaybackRegionContentGrade() accordingly! + jassertfalse; + + juce::ignoreUnused (playbackRegion, type); + return ARA::kARAContentGradeInitial; +} + +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreatePlaybackRegionContentReader (ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range) +{ + // Overriding doIsPlaybackRegionContentAvailable() requires overriding + // doCreatePlaybackRegionContentReader() accordingly! + jassertfalse; + + juce::ignoreUnused (playbackRegion, type, range); + return nullptr; +} + +bool ARADocumentControllerSpecialisation::doIsAudioSourceContentAnalysisIncomplete (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type) +{ + juce::ignoreUnused (audioSource, type); + return false; +} + +void ARADocumentControllerSpecialisation::doRequestAudioSourceContentAnalysis (ARA::PlugIn::AudioSource* audioSource, + std::vector const& contentTypes) +{ + juce::ignoreUnused (audioSource, contentTypes); +} + +ARA::ARAInt32 ARADocumentControllerSpecialisation::doGetProcessingAlgorithmsCount() { return 0; } + +const ARA::ARAProcessingAlgorithmProperties* + ARADocumentControllerSpecialisation::doGetProcessingAlgorithmProperties (ARA::ARAInt32 algorithmIndex) +{ + juce::ignoreUnused (algorithmIndex); + return nullptr; +} + +ARA::ARAInt32 ARADocumentControllerSpecialisation::doGetProcessingAlgorithmForAudioSource (const ARA::PlugIn::AudioSource* audioSource) +{ + // doGetProcessingAlgorithmForAudioSource() must be implemented if the supported + // algorithm count is greater than zero. + if (getDocumentController()->getProcessingAlgorithmsCount() > 0) + jassertfalse; + + juce::ignoreUnused (audioSource); + return 0; +} + +void ARADocumentControllerSpecialisation::doRequestProcessingAlgorithmForAudioSource (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAInt32 algorithmIndex) +{ + // doRequestProcessingAlgorithmForAudioSource() must be implemented if the supported + // algorithm count is greater than zero. + if (getDocumentController()->getProcessingAlgorithmsCount() > 0) + jassertfalse; + + juce::ignoreUnused (audioSource, algorithmIndex); +} + +} // namespace juce diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h b/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h new file mode 100644 index 00000000..2787972c --- /dev/null +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.h @@ -0,0 +1,520 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#pragma once + +namespace juce +{ + +class ARAPlaybackRenderer; +class ARAEditorRenderer; +class ARAEditorView; +class ARAInputStream; +class ARAOutputStream; + +/** This class contains the customisation points for the JUCE provided ARA document controller + implementation. + + Every ARA enabled plugin must provide its own document controller implementation. To do this, + inherit from this class, and override its protected methods as needed. Then you need to + implement a global function somewhere in your module called createARAFactory(). This function + must return an ARAFactory* that will instantiate document controller objects using your + specialisation. There are helper functions inside ARADocumentControllerSpecialisation, so the + implementation of createARAFactory() can always be a simple one-liner. For example + + @code + class MyDocumentController : public ARADocumentControllerSpecialisation + { + //... + }; + + const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory() + { + return juce::ARADocumentControllerSpecialisation::createARAFactory(); + } + @endcode + + Most member functions have a default implementation so you can build up your required feature + set gradually. The protected functions of this class fall in three distinct groups: + - interactive editing and playback, + - analysis features provided by the plugin and utilised by the host, and + - maintaining the ARA model graph. + + On top of the pure virtual functions, you will probably want to override + doCreatePlaybackRenderer() at the very least if you want your plugin to play any sound. This + function belongs to the first group. + + If your plugin has analysis capabilities and wants to allow the host to access these, functions + in the second group should be overridden. + + The default implementation of the ARA model object classes - i.e. ARADocument, ARAMusicalContext, + ARARegionSequence, ARAAudioSource, ARAAudioModification, ARAPlaybackRegion - should be sufficient + for maintaining a representation of the ARA model graph, hence overriding the model object + creation functions e.g. doCreateMusicalContext() is considered an advanced use case. Hence you + should be able to get a lot done without overriding functions in the third group. + + In order to react to the various ARA state changes you can override any of the ARA model object + Listener functions that ARADocumentControllerSpecialisation inherits from. Such listener + functions can be attached to one particular model objects instance, but the listener functions + inside ARADocumentControllerSpecialisation will respond to the events of all instances of the + model objects. + + @tags{ARA} +*/ +class ARADocumentControllerSpecialisation : public ARADocument::Listener, + public ARAMusicalContext::Listener, + public ARARegionSequence::Listener, + public ARAAudioSource::Listener, + public ARAAudioModification::Listener, + public ARAPlaybackRegion::Listener +{ +public: + //============================================================================== + /** Constructor. Used internally by the ARAFactory implementation. + */ + ARADocumentControllerSpecialisation (const ARA::PlugIn::PlugInEntry* entry, + const ARA::ARADocumentControllerHostInstance* instance); + + /** Destructor. */ + virtual ~ARADocumentControllerSpecialisation(); + + /** Returns the underlying DocumentController object that references this specialisation. + */ + ARA::PlugIn::DocumentController* getDocumentController() noexcept; + + /** Helper function for implementing the global createARAFactory() function. + + For example + + @code + class MyDocumentController : public ARADocumentControllerSpecialisation + { + //... + }; + + const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory() + { + return juce::ARADocumentControllerSpecialisation::createARAFactory(); + } + @endcode + */ + template + static const ARA::ARAFactory* createARAFactory() + { + static_assert (std::is_base_of::value, + "DocumentController specialization types must inherit from ARADocumentControllerSpecialisation"); + return ARA::PlugIn::PlugInEntry::getPlugInEntry>()->getFactory(); + } + + /** Returns a pointer to the ARADocumentControllerSpecialisation instance that is referenced + by the provided DocumentController. You can use this function to access your specialisation + from anywhere where you have access to ARA::PlugIn::DocumentController*. + */ + template + static Specialisation* getSpecialisedDocumentController (ARA::PlugIn::DocumentController* dc) + { + return static_cast (getSpecialisedDocumentControllerImpl (dc)); + } + + /** Returns a pointer to the ARA document root maintained by this document controller. */ + template + DocumentType* getDocument() + { + return static_cast (getDocumentImpl()); + } + +protected: + //============================================================================== + /** Read an ARADocument archive from a juce::InputStream. + + @param input Data stream containing previously persisted data to be used when restoring the ARADocument + @param filter A filter to be applied to the stream + + Return true if the operation is successful. + + @see ARADocumentControllerInterface::restoreObjectsFromArchive + */ + virtual bool doRestoreObjectsFromStream (ARAInputStream& input, const ARARestoreObjectsFilter* filter) = 0; + + /** Write an ARADocument archive to a juce::OutputStream. + + @param output Data stream that should be used to write the persistent ARADocument data + @param filter A filter to be applied to the stream + + Returns true if the operation is successful. + + @see ARADocumentControllerInterface::storeObjectsToArchive + */ + virtual bool doStoreObjectsToStream (ARAOutputStream& output, const ARAStoreObjectsFilter* filter) = 0; + + //============================================================================== + /** Override to return a custom subclass instance of ARAPlaybackRenderer. */ + virtual ARAPlaybackRenderer* doCreatePlaybackRenderer(); + + /** Override to return a custom subclass instance of ARAEditorRenderer. */ + virtual ARAEditorRenderer* doCreateEditorRenderer(); + + /** Override to return a custom subclass instance of ARAEditorView. */ + virtual ARAEditorView* doCreateEditorView(); + + //============================================================================== + // ARAAudioSource content access + + /** Override to implement isAudioSourceContentAvailable() for all your supported content types - + the default implementation always returns false, preventing any calls to doGetAudioSourceContentGrade() + and doCreateAudioSourceContentReader(). + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doIsAudioSourceContentAvailable. + */ + virtual bool doIsAudioSourceContentAvailable (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type); + + /** Override to implement getAudioSourceContentGrade() for all your supported content types. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doGetAudioSourceContentGrade. + */ + virtual ARA::ARAContentGrade doGetAudioSourceContentGrade (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type); + + /** Override to implement createAudioSourceContentReader() for all your supported content types, + returning a custom subclass instance of ContentReader providing data of the requested type. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doCreateAudioSourceContentReader. + */ + virtual ARA::PlugIn::ContentReader* doCreateAudioSourceContentReader (ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range); + + //============================================================================== + // ARAAudioModification content access + + /** Override to implement isAudioModificationContentAvailable() for all your supported content types - + the default implementation always returns false. + For read-only data directly inherited from the underlying audio source you can just delegate the + call to the audio source, but user-editable modification data must be specifically handled here. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doIsAudioModificationContentAvailable. + */ + virtual bool doIsAudioModificationContentAvailable (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type); + + /** Override to implement getAudioModificationContentGrade() for all your supported content types. + For read-only data directly inherited from the underlying audio source you can just delegate the + call to the audio source, but user-editable modification data must be specifically handled here. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doGetAudioModificationContentGrade. + */ + virtual ARA::ARAContentGrade doGetAudioModificationContentGrade (const ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type); + + /** Override to implement createAudioModificationContentReader() for all your supported content types, + returning a custom subclass instance of ContentReader providing data of the requested \p type. + For read-only data directly inherited from the underlying audio source you can just delegate the + call to the audio source, but user-editable modification data must be specifically handled here. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doCreateAudioModificationContentReader. + */ + virtual ARA::PlugIn::ContentReader* doCreateAudioModificationContentReader (ARA::PlugIn::AudioModification* audioModification, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range); + + //============================================================================== + // ARAPlaybackRegion content access + + /** Override to implement isPlaybackRegionContentAvailable() for all your supported content types - + the default implementation always returns false. + Typically, this call can directly delegate to the underlying audio modification, since most + plug-ins will apply their modification data to the playback region with a transformation that + does not affect content availability. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doIsPlaybackRegionContentAvailable. + */ + virtual bool doIsPlaybackRegionContentAvailable (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type); + + /** Override to implement getPlaybackRegionContentGrade() for all your supported content types. + Typically, this call can directly delegate to the underlying audio modification, since most + plug-ins will apply their modification data to the playback region with a transformation that + does not affect content grade. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doGetPlaybackRegionContentGrade. + */ + virtual ARA::ARAContentGrade doGetPlaybackRegionContentGrade (const ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type); + + /** Override to implement createPlaybackRegionContentReader() for all your supported content types, + returning a custom subclass instance of ContentReader providing data of the requested type. + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doCreatePlaybackRegionContentReader. + */ + virtual ARA::PlugIn::ContentReader* doCreatePlaybackRegionContentReader (ARA::PlugIn::PlaybackRegion* playbackRegion, + ARA::ARAContentType type, + const ARA::ARAContentTimeRange* range); + + //============================================================================== + // ARAAudioSource analysis + + /** Override to implement isAudioSourceContentAnalysisIncomplete(). + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doIsAudioSourceContentAnalysisIncomplete. + */ + virtual bool doIsAudioSourceContentAnalysisIncomplete (const ARA::PlugIn::AudioSource* audioSource, + ARA::ARAContentType type); + + /** Override to implement requestAudioSourceContentAnalysis(). + + This function's called from + ARA::PlugIn::DocumentControllerDelegate::doRequestAudioSourceContentAnalysis. + */ + virtual void doRequestAudioSourceContentAnalysis (ARA::PlugIn::AudioSource* audioSource, + std::vector const& contentTypes); + + //============================================================================== + // Analysis Algorithm selection + + /** Override to implement getProcessingAlgorithmsCount(). + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doGetProcessingAlgorithmsCount. + */ + virtual ARA::ARAInt32 doGetProcessingAlgorithmsCount (); + + /** Override to implement getProcessingAlgorithmProperties(). + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doGetProcessingAlgorithmProperties. + */ + virtual const ARA::ARAProcessingAlgorithmProperties* + doGetProcessingAlgorithmProperties (ARA::ARAInt32 algorithmIndex); + + /** Override to implement getProcessingAlgorithmForAudioSource(). + + This function's result is returned from + ARA::PlugIn::DocumentControllerDelegate::doGetProcessingAlgorithmForAudioSource. + */ + virtual ARA::ARAInt32 doGetProcessingAlgorithmForAudioSource (const ARA::PlugIn::AudioSource* audioSource); + + /** Override to implement requestProcessingAlgorithmForAudioSource(). + + This function's called from + ARA::PlugIn::DocumentControllerDelegate::doRequestProcessingAlgorithmForAudioSource. + */ + virtual void doRequestProcessingAlgorithmForAudioSource (ARA::PlugIn::AudioSource* audioSource, ARA::ARAInt32 algorithmIndex); + + //============================================================================== + /** Override to return a custom subclass instance of ARADocument. */ + ARADocument* doCreateDocument(); + + /** Override to return a custom subclass instance of ARAMusicalContext. */ + ARAMusicalContext* doCreateMusicalContext (ARADocument* document, + ARA::ARAMusicalContextHostRef hostRef); + + /** Override to return a custom subclass instance of ARARegionSequence. */ + ARARegionSequence* doCreateRegionSequence (ARADocument* document, + ARA::ARARegionSequenceHostRef hostRef); + + /** Override to return a custom subclass instance of ARAAudioSource. */ + ARAAudioSource* doCreateAudioSource (ARADocument* document, + ARA::ARAAudioSourceHostRef hostRef); + + /** Override to return a custom subclass instance of ARAAudioModification. */ + ARAAudioModification* doCreateAudioModification (ARAAudioSource* audioSource, + ARA::ARAAudioModificationHostRef hostRef, + const ARAAudioModification* optionalModificationToClone); + + /** Override to return a custom subclass instance of ARAPlaybackRegion. */ + ARAPlaybackRegion* doCreatePlaybackRegion (ARAAudioModification* modification, + ARA::ARAPlaybackRegionHostRef hostRef); + +private: + //============================================================================== + template + class FactoryConfig : public ARA::PlugIn::FactoryConfig + { + public: + FactoryConfig() noexcept + { + const juce::String compatibleDocumentArchiveIDString = JucePlugin_ARACompatibleArchiveIDs; + + if (compatibleDocumentArchiveIDString.isNotEmpty()) + { + compatibleDocumentArchiveIDStrings = juce::StringArray::fromLines (compatibleDocumentArchiveIDString); + for (const auto& compatibleID : compatibleDocumentArchiveIDStrings) + compatibleDocumentArchiveIDs.push_back (compatibleID.toRawUTF8()); + } + + // Update analyzeable content types + static constexpr std::array contentTypes { + ARA::kARAContentTypeNotes, + ARA::kARAContentTypeTempoEntries, + ARA::kARAContentTypeBarSignatures, + ARA::kARAContentTypeStaticTuning, + ARA::kARAContentTypeKeySignatures, + ARA::kARAContentTypeSheetChords + }; + + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6313) + + for (size_t i = 0; i < contentTypes.size(); ++i) + if (JucePlugin_ARAContentTypes & (1 << i)) + analyzeableContentTypes.push_back (contentTypes[i]); + + JUCE_END_IGNORE_WARNINGS_MSVC + + // Update playback transformation flags + static constexpr std::array playbackTransformationFlags { + ARA::kARAPlaybackTransformationTimestretch, + ARA::kARAPlaybackTransformationTimestretchReflectingTempo, + ARA::kARAPlaybackTransformationContentBasedFadeAtTail, + ARA::kARAPlaybackTransformationContentBasedFadeAtHead + }; + + supportedPlaybackTransformationFlags = 0; + + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6313) + + for (size_t i = 0; i < playbackTransformationFlags.size(); ++i) + if (JucePlugin_ARATransformationFlags & (1 << i)) + supportedPlaybackTransformationFlags |= playbackTransformationFlags[i]; + + JUCE_END_IGNORE_WARNINGS_MSVC + } + + const char* getFactoryID() const noexcept override { return JucePlugin_ARAFactoryID; } + const char* getPlugInName() const noexcept override { return JucePlugin_Name; } + const char* getManufacturerName() const noexcept override { return JucePlugin_Manufacturer; } + const char* getInformationURL() const noexcept override { return JucePlugin_ManufacturerWebsite; } + const char* getVersion() const noexcept override { return JucePlugin_VersionString; } + const char* getDocumentArchiveID() const noexcept override { return JucePlugin_ARADocumentArchiveID; } + + ARA::ARASize getCompatibleDocumentArchiveIDsCount() const noexcept override + { + return compatibleDocumentArchiveIDs.size(); + } + + const ARA::ARAPersistentID* getCompatibleDocumentArchiveIDs() const noexcept override + { + return compatibleDocumentArchiveIDs.empty() ? nullptr : compatibleDocumentArchiveIDs.data(); + } + + ARA::ARASize getAnalyzeableContentTypesCount() const noexcept override + { + return analyzeableContentTypes.size(); + } + + const ARA::ARAContentType* getAnalyzeableContentTypes() const noexcept override + { + return analyzeableContentTypes.empty() ? nullptr : analyzeableContentTypes.data(); + } + + ARA::ARAPlaybackTransformationFlags getSupportedPlaybackTransformationFlags() const noexcept override + { + return supportedPlaybackTransformationFlags; + } + + ARA::PlugIn::DocumentController* createDocumentController (const ARA::PlugIn::PlugInEntry* entry, + const ARA::ARADocumentControllerHostInstance* instance) const noexcept override + { + auto* spec = new SpecialisationType (entry, instance); + return spec->getDocumentController(); + } + + void destroyDocumentController (ARA::PlugIn::DocumentController* controller) const noexcept override + { + delete getSpecialisedDocumentController (controller); + } + + private: + juce::StringArray compatibleDocumentArchiveIDStrings; + std::vector compatibleDocumentArchiveIDs; + std::vector analyzeableContentTypes; + ARA::ARAPlaybackTransformationFlags supportedPlaybackTransformationFlags; + }; + + //============================================================================== + static ARADocumentControllerSpecialisation* getSpecialisedDocumentControllerImpl (ARA::PlugIn::DocumentController*); + + ARADocument* getDocumentImpl(); + + //============================================================================== + class ARADocumentControllerImpl; + std::unique_ptr documentController; +}; + +/** Used to read persisted ARA archives - see doRestoreObjectsFromStream() for details. + + @tags{ARA} +*/ +class ARAInputStream : public InputStream +{ +public: + explicit ARAInputStream (ARA::PlugIn::HostArchiveReader*); + + int64 getPosition() override { return position; } + int64 getTotalLength() override { return size; } + + int read (void*, int) override; + bool setPosition (int64) override; + bool isExhausted() override; + + bool failed() const { return failure; } + +private: + ARA::PlugIn::HostArchiveReader* archiveReader; + int64 position = 0; + int64 size; + bool failure = false; +}; + +/** Used to write persistent ARA archives - see doStoreObjectsToStream() for details. + + @tags{ARA} +*/ +class ARAOutputStream : public OutputStream +{ +public: + explicit ARAOutputStream (ARA::PlugIn::HostArchiveWriter*); + + int64 getPosition() override { return position; } + void flush() override {} + + bool write (const void*, size_t) override; + bool setPosition (int64) override; + +private: + ARA::PlugIn::HostArchiveWriter* archiveWriter; + int64 position = 0; +}; +} // namespace juce diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp b/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp new file mode 100644 index 00000000..2b2364ce --- /dev/null +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp @@ -0,0 +1,71 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +class ARADocumentController : public ARA::PlugIn::DocumentController +{ +public: + using ARA::PlugIn::DocumentController::DocumentController; + + template + Document_t* getDocument() const noexcept { return ARA::PlugIn::DocumentController::getDocument(); } + + //============================================================================== + /** @internal */ + virtual void internalNotifyAudioSourceAnalysisProgressStarted (ARAAudioSource* audioSource) = 0; + + /** @internal */ + virtual void internalNotifyAudioSourceAnalysisProgressUpdated (ARAAudioSource* audioSource, float progress) = 0; + + /** @internal */ + virtual void internalNotifyAudioSourceAnalysisProgressCompleted (ARAAudioSource* audioSource) = 0; + + /** @internal */ + virtual void internalDidUpdateAudioSourceAnalysisProgress (ARAAudioSource* audioSource, + ARAAudioSource::ARAAnalysisProgressState state, + float progress) = 0; + + //============================================================================== + /** @internal */ + virtual void internalNotifyAudioSourceContentChanged (ARAAudioSource* audioSource, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) = 0; + + /** @internal */ + virtual void internalNotifyAudioModificationContentChanged (ARAAudioModification* audioModification, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) = 0; + + /** @internal */ + virtual void internalNotifyPlaybackRegionContentChanged (ARAPlaybackRegion* playbackRegion, + ARAContentUpdateScopes scopeFlags, + bool notifyARAHost) = 0; + + friend class ARAPlaybackRegionReader; +}; + +} // namespace juce diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp b/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp new file mode 100644 index 00000000..918aee43 --- /dev/null +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp @@ -0,0 +1,199 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +//============================================================================== +size_t ARADocument::getNumChildren() const noexcept +{ + return getMusicalContexts().size() + getRegionSequences().size() + getAudioSources().size(); +} + +ARAObject* ARADocument::getChild (size_t index) +{ + auto& musicalContexts = getMusicalContexts(); + + if (index < musicalContexts.size()) + return musicalContexts[index]; + + const auto numMusicalContexts = musicalContexts.size(); + auto& regionSequences = getRegionSequences(); + + if (index < numMusicalContexts + regionSequences.size()) + return regionSequences[index - numMusicalContexts]; + + const auto numMusicalContextsAndRegionSequences = numMusicalContexts + regionSequences.size(); + auto& audioSources = getAudioSources(); + + if (index < numMusicalContextsAndRegionSequences + audioSources.size()) + return getAudioSources()[index - numMusicalContextsAndRegionSequences]; + + return nullptr; +} + +//============================================================================== +size_t ARARegionSequence::getNumChildren() const noexcept +{ + return 0; +} + +ARAObject* ARARegionSequence::getChild (size_t) +{ + return nullptr; +} + +Range ARARegionSequence::getTimeRange (ARAPlaybackRegion::IncludeHeadAndTail includeHeadAndTail) const +{ + if (getPlaybackRegions().empty()) + return {}; + + auto startTime = std::numeric_limits::max(); + auto endTime = std::numeric_limits::lowest(); + for (const auto& playbackRegion : getPlaybackRegions()) + { + const auto regionTimeRange = playbackRegion->getTimeRange (includeHeadAndTail); + startTime = jmin (startTime, regionTimeRange.getStart()); + endTime = jmax (endTime, regionTimeRange.getEnd()); + } + return { startTime, endTime }; +} + +double ARARegionSequence::getCommonSampleRate() const +{ + const auto getSampleRate = [] (auto* playbackRegion) + { + return playbackRegion->getAudioModification()->getAudioSource()->getSampleRate(); + }; + + const auto range = getPlaybackRegions(); + const auto sampleRate = range.size() > 0 ? getSampleRate (range.front()) : 0.0; + + if (std::any_of (range.begin(), range.end(), [&] (auto& x) { return getSampleRate (x) != sampleRate; })) + return 0.0; + + return sampleRate; +} + +//============================================================================== +size_t ARAAudioSource::getNumChildren() const noexcept +{ + return getAudioModifications().size(); +} + +ARAObject* ARAAudioSource::getChild (size_t index) +{ + return getAudioModifications()[index]; +} + +void ARAAudioSource::notifyAnalysisProgressStarted() +{ + getDocumentController()->internalNotifyAudioSourceAnalysisProgressStarted (this); +} + +void ARAAudioSource::notifyAnalysisProgressUpdated (float progress) +{ + getDocumentController()->internalNotifyAudioSourceAnalysisProgressUpdated (this, progress); +} + +void ARAAudioSource::notifyAnalysisProgressCompleted() +{ + getDocumentController()->internalNotifyAudioSourceAnalysisProgressCompleted (this); +} + +void ARAAudioSource::notifyContentChanged (ARAContentUpdateScopes scopeFlags, bool notifyARAHost) +{ + getDocumentController()->internalNotifyAudioSourceContentChanged (this, + scopeFlags, + notifyARAHost); +} + +//============================================================================== +size_t ARAAudioModification::getNumChildren() const noexcept +{ + return getPlaybackRegions().size(); +} + +ARAObject* ARAAudioModification::getChild (size_t index) +{ + return getPlaybackRegions()[index]; +} + +void ARAAudioModification::notifyContentChanged (ARAContentUpdateScopes scopeFlags, bool notifyARAHost) +{ + getDocumentController()->internalNotifyAudioModificationContentChanged (this, + scopeFlags, + notifyARAHost); +} + +//============================================================================== +ARAObject* ARAPlaybackRegion::getParent() { return getAudioModification(); } + +Range ARAPlaybackRegion::getTimeRange (IncludeHeadAndTail includeHeadAndTail) const +{ + auto startTime = getStartInPlaybackTime(); + auto endTime = getEndInPlaybackTime(); + + if (includeHeadAndTail == IncludeHeadAndTail::yes) + { + ARA::ARATimeDuration headTime {}, tailTime {}; + getDocumentController()->getPlaybackRegionHeadAndTailTime (toRef (this), &headTime, &tailTime); + startTime -= headTime; + endTime += tailTime; + } + + return { startTime, endTime }; +} + +Range ARAPlaybackRegion::getSampleRange (double sampleRate, IncludeHeadAndTail includeHeadAndTail) const +{ + const auto timeRange = getTimeRange (includeHeadAndTail); + + return { ARA::samplePositionAtTime (timeRange.getStart(), sampleRate), + ARA::samplePositionAtTime (timeRange.getEnd(), sampleRate) }; +} + +double ARAPlaybackRegion::getHeadTime() const +{ + ARA::ARATimeDuration headTime {}, tailTime {}; + getDocumentController()->getPlaybackRegionHeadAndTailTime (toRef (this), &headTime, &tailTime); + return headTime; +} + +double ARAPlaybackRegion::getTailTime() const +{ + ARA::ARATimeDuration headTime {}, tailTime {}; + getDocumentController()->getPlaybackRegionHeadAndTailTime (toRef (this), &headTime, &tailTime); + return tailTime; +} + +void ARAPlaybackRegion::notifyContentChanged (ARAContentUpdateScopes scopeFlags, bool notifyARAHost) +{ + getDocumentController()->internalNotifyPlaybackRegionContentChanged (this, + scopeFlags, + notifyARAHost); +} + +} // namespace juce diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h b/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h new file mode 100644 index 00000000..021d2503 --- /dev/null +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h @@ -0,0 +1,1145 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#pragma once + +namespace juce +{ + +class ARADocumentController; +class ARADocument; +class ARAMusicalContext; +class ARARegionSequence; +class ARAAudioSource; +class ARAAudioModification; +class ARAPlaybackRegion; + +/** Base class used by the JUCE ARA model objects to provide listenable interfaces. + + @tags{ARA} +*/ +template +class JUCE_API ARAListenableModelClass +{ +public: + /** Constructor. */ + ARAListenableModelClass() = default; + + /** Destructor. */ + virtual ~ARAListenableModelClass() = default; + + /** Subscribe \p l to notified by changes to the object. + @param l The listener instance. + */ + void addListener (ListenerType* l) { listeners.add (l); } + + /** Unsubscribe \p l from object notifications. + @param l The listener instance. + */ + void removeListener (ListenerType* l) { listeners.remove (l); } + + /** Call the provided callback for each of the added listeners. */ + template + void notifyListeners (Callback&& callback) + { + listeners.call (callback); + } + +private: + ListenerList listeners; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAListenableModelClass) +}; + +/** Create a derived implementation of this class and pass it to ARAObject::visit() to retrieve the + concrete type of a model object. + + Combined with ARAObject::traverse() on the ARADocument object it is possible to discover the + entire model graph. + + Note that the references passed to the visit member functions are only guaranteed to live for + the duration of the function call, so don't store pointers to these objects! + + @tags{Audio} +*/ +class ARAObjectVisitor +{ +public: + /** Destructor. */ + virtual ~ARAObjectVisitor() = default; + + /** Called when visiting an ARADocument object. */ + virtual void visitDocument (juce::ARADocument&) {} + + /** Called when visiting an ARAMusicalContext object. */ + virtual void visitMusicalContext (juce::ARAMusicalContext&) {} + + /** Called when visiting an ARARegionSequence object. */ + virtual void visitRegionSequence (juce::ARARegionSequence&) {} + + /** Called when visiting an ARAPlaybackRegion object. */ + virtual void visitPlaybackRegion (juce::ARAPlaybackRegion&) {} + + /** Called when visiting an ARAAudioModification object. */ + virtual void visitAudioModification (juce::ARAAudioModification&) {} + + /** Called when visiting an ARAAudioSource object. */ + virtual void visitAudioSource (juce::ARAAudioSource&) {} +}; + +/** Common base class for all JUCE ARA model objects to aid with the discovery and traversal of the + entire ARA model graph. + + @tags{ARA} +*/ +class ARAObject +{ +public: + /** Destructor. */ + virtual ~ARAObject() = default; + + /** Returns the number of ARA model objects aggregated by this object. Objects that are merely + referred to, but not aggregated by the current object are not included in this count, e.g. + a referenced RegionSequence does not count as a child of the referring PlaybackRegion. + + See the ARA documentation's ARA Model Graph Overview for more details. + */ + virtual size_t getNumChildren() const noexcept = 0; + + /** Returns the child object associated with the given index. + + The index should be smaller than the value returned by getNumChildren(). + + Note that the index of a particular object may change when the ARA model graph is edited. + */ + virtual ARAObject* getChild (size_t index) = 0; + + /** Returns the ARA model object that aggregates this object. + + Returns nullptr for the ARADocument root object. + */ + virtual ARAObject* getParent() = 0; + + /** Implements a depth first traversal of the ARA model graph starting from the current object, + and visiting its children recursively. + + The provided function should accept a single ARAObject& parameter. + */ + template + void traverse (Fn&& fn) + { + fn (*this); + + for (size_t i = 0; i < getNumChildren(); ++i) + { + getChild (i)->traverse (fn); + } + } + + /** Allows the retrieval of the concrete type of a model object. + + To use this, create a new class derived from ARAObjectVisitor and override its functions + depending on which concrete types you are interested in. + + Calling this function inside the function passed to ARAObject::traverse() allows you to + map the entire ARA model graph. + */ + virtual void visit (ARAObjectVisitor& visitor) = 0; +}; + +/** A base class for listeners that want to know about changes to an ARADocument object. + + Use ARADocument::addListener() to register your listener with an ARADocument. + + @tags{ARA} +*/ +class JUCE_API ARADocumentListener +{ +public: + /** Destructor */ + virtual ~ARADocumentListener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called before the document enters an editing state. + @param document The document about to enter an editing state. + */ + virtual void willBeginEditing (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called after the document exits an editing state. + @param document The document about exit an editing state. + */ + virtual void didEndEditing (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called before sending model updates do the host. + @param document The document whose model updates are about to be sent. + */ + virtual void willNotifyModelUpdates (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called after sending model updates do the host. + @param document The document whose model updates have just been sent. + */ + virtual void didNotifyModelUpdates (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called before the document's properties are updated. + @param document The document whose properties will be updated. + @param newProperties The document properties that will be assigned to \p document. + */ + virtual void willUpdateDocumentProperties (ARADocument* document, + ARA::PlugIn::PropertiesPtr newProperties) + { + ignoreUnused (document, newProperties); + } + + /** Called after the document's properties are updated. + @param document The document whose properties were updated. + */ + virtual void didUpdateDocumentProperties (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called after a musical context is added to the document. + @param document The document that \p musicalContext was added to. + @param musicalContext The musical context that was added to \p document. + */ + virtual void didAddMusicalContextToDocument (ARADocument* document, ARAMusicalContext* musicalContext) + { + ignoreUnused (document, musicalContext); + } + + /** Called before a musical context is removed from the document. + @param document The document that \p musicalContext will be removed from. + @param musicalContext The musical context that will be removed from \p document. + */ + virtual void willRemoveMusicalContextFromDocument (ARADocument* document, + ARAMusicalContext* musicalContext) + { + ignoreUnused (document, musicalContext); + } + + /** Called after the musical contexts are reordered in an ARA document + + Musical contexts are sorted by their order index - + this callback signals a change in this ordering within the document. + + @param document The document with reordered musical contexts. + */ + virtual void didReorderMusicalContextsInDocument (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called after a region sequence is added to the document. + @param document The document that \p regionSequence was added to. + @param regionSequence The region sequence that was added to \p document. + */ + virtual void didAddRegionSequenceToDocument (ARADocument* document, ARARegionSequence* regionSequence) + { + ignoreUnused (document, regionSequence); + } + + /** Called before a region sequence is removed from the document. + @param document The document that \p regionSequence will be removed from. + @param regionSequence The region sequence that will be removed from \p document. + */ + virtual void willRemoveRegionSequenceFromDocument (ARADocument* document, + ARARegionSequence* regionSequence) + { + ignoreUnused (document, regionSequence); + } + + /** Called after the region sequences are reordered in an ARA document + + Region sequences are sorted by their order index - + this callback signals a change in this ordering within the document. + + @param document The document with reordered region sequences. + */ + virtual void didReorderRegionSequencesInDocument (ARADocument* document) + { + ignoreUnused (document); + } + + /** Called after an audio source is added to the document. + @param document The document that \p audioSource was added to. + @param audioSource The audio source that was added to \p document. + */ + virtual void didAddAudioSourceToDocument (ARADocument* document, ARAAudioSource* audioSource) + { + ignoreUnused (document, audioSource); + } + + /** Called before an audio source is removed from the document. + @param document The document that \p audioSource will be removed from . + @param audioSource The audio source that will be removed from \p document. + */ + virtual void willRemoveAudioSourceFromDocument (ARADocument* document, ARAAudioSource* audioSource) + { + ignoreUnused (document, audioSource); + } + + /** Called before the document is destroyed by the ARA host. + @param document The document that will be destroyed. + */ + virtual void willDestroyDocument (ARADocument* document) + { + ignoreUnused (document); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END +}; + +//============================================================================== +/** Base class representing an ARA document. + + @tags{ARA} +*/ +class JUCE_API ARADocument : public ARA::PlugIn::Document, + public ARAListenableModelClass, + public ARAObject +{ +public: + using PropertiesPtr = ARA::PlugIn::PropertiesPtr; + using Listener = ARADocumentListener; + + using ARA::PlugIn::Document::Document; + + /** Returns the result of ARA::PlugIn::Document::getAudioSources() with the pointers within + cast to ARAAudioSource*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateAudioSource(), then + you can use the template parameter to cast the pointers to your subclass of ARAAudioSource. + */ + template + const std::vector& getAudioSources() const noexcept + { + return ARA::PlugIn::Document::getAudioSources(); + } + + /** Returns the result of ARA::PlugIn::Document::getMusicalContexts() with the pointers within + cast to ARAMusicalContext*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateMusicalContext(), then + you can use the template parameter to cast the pointers to your subclass of ARAMusicalContext. + */ + template + const std::vector& getMusicalContexts() const noexcept + { + return ARA::PlugIn::Document::getMusicalContexts(); + } + + /** Returns the result of ARA::PlugIn::Document::getRegionSequences() with the pointers within + cast to ARARegionSequence*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateRegionSequence(), then + you can use the template parameter to cast the pointers to your subclass of ARARegionSequence. + */ + template + const std::vector& getRegionSequences() const noexcept + { + return ARA::PlugIn::Document::getRegionSequences(); + } + + size_t getNumChildren() const noexcept override; + + ARAObject* getChild (size_t index) override; + + ARAObject* getParent() override { return nullptr; } + + void visit (ARAObjectVisitor& visitor) override { visitor.visitDocument (*this); } +}; + +/** A base class for listeners that want to know about changes to an ARAMusicalContext object. + + Use ARAMusicalContext::addListener() to register your listener with an ARAMusicalContext. + + @tags{ARA} +*/ +class JUCE_API ARAMusicalContextListener +{ +public: + virtual ~ARAMusicalContextListener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called before the musical context's properties are updated. + @param musicalContext The musical context whose properties will be updated. + @param newProperties The musical context properties that will be assigned to \p musicalContext. + */ + virtual void willUpdateMusicalContextProperties (ARAMusicalContext* musicalContext, + ARA::PlugIn::PropertiesPtr newProperties) + { + ignoreUnused (musicalContext, newProperties); + } + + /** Called after the musical context's properties are updated by the host. + @param musicalContext The musical context whose properties were updated. + */ + virtual void didUpdateMusicalContextProperties (ARAMusicalContext* musicalContext) + { + ignoreUnused (musicalContext); + } + + /** Called when the musical context's content (i.e tempo entries or chords) changes. + @param musicalContext The musical context with updated content. + @param scopeFlags The scope of the content update indicating what has changed. + */ + virtual void doUpdateMusicalContextContent (ARAMusicalContext* musicalContext, + ARAContentUpdateScopes scopeFlags) + { + ignoreUnused (musicalContext, scopeFlags); + } + + /** Called after a region sequence is added to the musical context. + @param musicalContext The musical context that \p regionSequence was added to. + @param regionSequence The region sequence that was added to \p musicalContext. + */ + virtual void didAddRegionSequenceToMusicalContext (ARAMusicalContext* musicalContext, + ARARegionSequence* regionSequence) + { + ignoreUnused (musicalContext, regionSequence); + } + + /** Called before a region sequence is removed from the musical context. + @param musicalContext The musical context that \p regionSequence will be removed from. + @param regionSequence The region sequence that will be removed from \p musicalContext. + */ + virtual void willRemoveRegionSequenceFromMusicalContext (ARAMusicalContext* musicalContext, + ARARegionSequence* regionSequence) + { + ignoreUnused (musicalContext, regionSequence); + } + + /** Called after the region sequences are reordered in an ARA MusicalContext + + Region sequences are sorted by their order index - + this callback signals a change in this ordering within the musical context. + + @param musicalContext The musical context with reordered region sequences. + */ + virtual void didReorderRegionSequencesInMusicalContext (ARAMusicalContext* musicalContext) + { + ignoreUnused (musicalContext); + } + + /** Called before the musical context is destroyed. + @param musicalContext The musical context that will be destoyed. + */ + virtual void willDestroyMusicalContext (ARAMusicalContext* musicalContext) + { + ignoreUnused (musicalContext); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END +}; + +//============================================================================== +/** Base class representing an ARA musical context. + + @tags{ARA} +*/ +class JUCE_API ARAMusicalContext : public ARA::PlugIn::MusicalContext, + public ARAListenableModelClass, + public ARAObject +{ +public: + using PropertiesPtr = ARA::PlugIn::PropertiesPtr; + using Listener = ARAMusicalContextListener; + + using ARA::PlugIn::MusicalContext::MusicalContext; + + /** Returns the result of ARA::PlugIn::MusicalContext::getDocument() with the pointer cast + to ARADocument*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateDocument(), then you + can use the template parameter to cast the pointers to your subclass of ARADocument. + */ + template + Document_t* getDocument() const noexcept + { + return ARA::PlugIn::MusicalContext::getDocument(); + } + + /** Returns the result of ARA::PlugIn::MusicalContext::getRegionSequences() with the pointers + within cast to ARARegionSequence*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateRegionSequence(), then you + can use the template parameter to cast the pointers to your subclass of ARARegionSequence. + */ + template + const std::vector& getRegionSequences() const noexcept + { + return ARA::PlugIn::MusicalContext::getRegionSequences(); + } + + size_t getNumChildren() const noexcept override { return 0; } + + ARAObject* getChild (size_t) override { return nullptr; } + + ARAObject* getParent() override { return getDocument(); } + + void visit (ARAObjectVisitor& visitor) override { visitor.visitMusicalContext (*this); } +}; + +/** A base class for listeners that want to know about changes to an ARAPlaybackRegion object. + + Use ARAPlaybackRegion::addListener() to register your listener with an ARAPlaybackRegion. + + @tags{ARA} +*/ +class JUCE_API ARAPlaybackRegionListener +{ +public: + /** Destructor. */ + virtual ~ARAPlaybackRegionListener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called before the playback region's properties are updated. + @param playbackRegion The playback region whose properties will be updated. + @param newProperties The playback region properties that will be assigned to \p playbackRegion. + */ + virtual void willUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion, + ARA::PlugIn::PropertiesPtr newProperties) + { + ignoreUnused (playbackRegion, newProperties); + } + + /** Called after the playback region's properties are updated. + @param playbackRegion The playback region whose properties were updated. + */ + virtual void didUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion) + { + ignoreUnused (playbackRegion); + } + + /** Called when the playback region's content (i.e. samples or notes) changes. + @param playbackRegion The playback region with updated content. + @param scopeFlags The scope of the content update. + */ + virtual void didUpdatePlaybackRegionContent (ARAPlaybackRegion* playbackRegion, + ARAContentUpdateScopes scopeFlags) + { + ignoreUnused (playbackRegion, scopeFlags); + } + + /** Called before the playback region is destroyed. + @param playbackRegion The playback region that will be destoyed. + */ + virtual void willDestroyPlaybackRegion (ARAPlaybackRegion* playbackRegion) + { + ignoreUnused (playbackRegion); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END +}; + +//============================================================================== +/** Base class representing an ARA playback region. + + @tags{ARA} +*/ +class JUCE_API ARAPlaybackRegion : public ARA::PlugIn::PlaybackRegion, + public ARAListenableModelClass, + public ARAObject +{ +public: + using PropertiesPtr = ARA::PlugIn::PropertiesPtr; + using Listener = ARAPlaybackRegionListener; + + using ARA::PlugIn::PlaybackRegion::PlaybackRegion; + + /** Returns the result of ARA::PlugIn::PlaybackRegion::getAudioModification() with the pointer cast + to ARAAudioModification*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateAudioModification(), then you + can use the template parameter to cast the pointers to your subclass of ARAAudioModification. + */ + template + AudioModification_t* getAudioModification() const noexcept + { + return ARA::PlugIn::PlaybackRegion::getAudioModification(); + } + + /** Returns the result of ARA::PlugIn::PlaybackRegion::getRegionSequence() with the pointer cast + to ARARegionSequence*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateRegionSequence(), then you + can use the template parameter to cast the pointers to your subclass of ARARegionSequence. + */ + template + RegionSequence_t* getRegionSequence() const noexcept + { + return ARA::PlugIn::PlaybackRegion::getRegionSequence(); + } + + size_t getNumChildren() const noexcept override { return 0; } + + ARAObject* getChild (size_t) override { return nullptr; } + + ARAObject* getParent() override; + + void visit (ARAObjectVisitor& visitor) override { visitor.visitPlaybackRegion (*this); } + + /** Used in getTimeRange to indicate whether the head and tail times should be included in the result. + */ + enum class IncludeHeadAndTail { no, yes }; + + /** Returns the playback time range of this playback region. + @param includeHeadAndTail Whether or not the range includes the head and tail + time of all playback regions in the sequence. + */ + Range getTimeRange (IncludeHeadAndTail includeHeadAndTail = IncludeHeadAndTail::no) const; + + /** Returns the playback sample range of this playback region. + @param sampleRate The rate at which the sample position should be calculated from + the time range. + @param includeHeadAndTail Whether or not the range includes the head and tail + time of all playback regions in the sequence. + */ + Range getSampleRange (double sampleRate, IncludeHeadAndTail includeHeadAndTail = IncludeHeadAndTail::no) const; + + /** Get the head length in seconds before the start of the region's playback time. */ + double getHeadTime() const; + + /** Get the tail length in seconds after the end of the region's playback time. */ + double getTailTime() const; + + /** Notify the ARA host and any listeners of a content update initiated by the plug-in. + This must be called by the plug-in model management code on the message thread whenever updating + the internal content representation, such as after the user edited the pitch of a note in the + underlying audio modification. + Listeners will be notified immediately. If \p notifyARAHost is true, a notification to the host + will be enqueued and sent out the next time it polls for updates. + + @param scopeFlags The scope of the content update. + @param notifyARAHost If true, the ARA host will be notified of the content change. + */ + void notifyContentChanged (ARAContentUpdateScopes scopeFlags, bool notifyARAHost); +}; + +/** A base class for listeners that want to know about changes to an ARARegionSequence object. + + Use ARARegionSequence::addListener() to register your listener with an ARARegionSequence. + + @tags{ARA} +*/ +class JUCE_API ARARegionSequenceListener +{ +public: + /** Destructor. */ + virtual ~ARARegionSequenceListener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called before the region sequence's properties are updated. + @param regionSequence The region sequence whose properties will be updated. + @param newProperties The region sequence properties that will be assigned to \p regionSequence. + */ + virtual void willUpdateRegionSequenceProperties (ARARegionSequence* regionSequence, + ARA::PlugIn::PropertiesPtr newProperties) + { + ignoreUnused (regionSequence, newProperties); + } + + /** Called after the region sequence's properties are updated. + @param regionSequence The region sequence whose properties were updated. + */ + virtual void didUpdateRegionSequenceProperties (ARARegionSequence* regionSequence) + { + ignoreUnused (regionSequence); + } + + /** Called before a playback region is removed from the region sequence. + @param regionSequence The region sequence that \p playbackRegion will be removed from. + @param playbackRegion The playback region that will be removed from \p regionSequence. + */ + virtual void willRemovePlaybackRegionFromRegionSequence (ARARegionSequence* regionSequence, + ARAPlaybackRegion* playbackRegion) + { + ignoreUnused (regionSequence, playbackRegion); + } + + /** Called after a playback region is added to the region sequence. + @param regionSequence The region sequence that \p playbackRegion was added to. + @param playbackRegion The playback region that was added to \p regionSequence. + */ + virtual void didAddPlaybackRegionToRegionSequence (ARARegionSequence* regionSequence, + ARAPlaybackRegion* playbackRegion) + { + ignoreUnused (regionSequence, playbackRegion); + } + + /** Called before the region sequence is destroyed. + @param regionSequence The region sequence that will be destoyed. + */ + virtual void willDestroyRegionSequence (ARARegionSequence* regionSequence) + { + ignoreUnused (regionSequence); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END +}; + +//============================================================================== +/** Base class representing an ARA region sequence. + + @tags{ARA} +*/ +class JUCE_API ARARegionSequence : public ARA::PlugIn::RegionSequence, + public ARAListenableModelClass, + public ARAObject +{ +public: + using PropertiesPtr = ARA::PlugIn::PropertiesPtr; + using Listener = ARARegionSequenceListener; + + using ARA::PlugIn::RegionSequence::RegionSequence; + + /** Returns the result of ARA::PlugIn::RegionSequence::getDocument() with the pointer cast + to ARADocument*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateDocument(), then you + can use the template parameter to cast the pointers to your subclass of ARADocument. + */ + template + Document_t* getDocument() const noexcept + { + return ARA::PlugIn::RegionSequence::getDocument(); + } + + /** Returns the result of ARA::PlugIn::RegionSequence::getMusicalContext() with the pointer cast + to ARAMusicalContext*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateMusicalContext(), then you + can use the template parameter to cast the pointers to your subclass of ARAMusicalContext. + */ + template + MusicalContext_t* getMusicalContext() const noexcept + { + return ARA::PlugIn::RegionSequence::getMusicalContext(); + } + + /** Returns the result of ARA::PlugIn::RegionSequence::getPlaybackRegions() with the pointers within cast + to ARAPlaybackRegion*. + + If you have overridden ARADocumentControllerSpecialisation::doCreatePlaybackRegion(), then you + can use the template parameter to cast the pointers to your subclass of ARAPlaybackRegion. + */ + template + const std::vector& getPlaybackRegions() const noexcept + { + return ARA::PlugIn::RegionSequence::getPlaybackRegions(); + } + + size_t getNumChildren() const noexcept override; + + ARAObject* getChild (size_t index) override; + + ARAObject* getParent () override { return getDocument(); } + + void visit (ARAObjectVisitor& visitor) override { visitor.visitRegionSequence (*this); } + + /** Returns the playback time range covered by the regions in this sequence. + @param includeHeadAndTail Whether or not the range includes the playback region's head and tail time. + */ + Range getTimeRange (ARAPlaybackRegion::IncludeHeadAndTail includeHeadAndTail = ARAPlaybackRegion::IncludeHeadAndTail::no) const; + + /** If all audio sources used by the playback regions in this region sequence have the same + sample rate, this rate is returned here, otherwise 0.0 is returned. + + If the region sequence has no playback regions, this also returns 0.0. + */ + double getCommonSampleRate() const; +}; + +/** A base class for listeners that want to know about changes to an ARAAudioSource object. + + Use ARAAudioSource::addListener() to register your listener with an ARAAudioSource. + + @tags{ARA} +*/ +class JUCE_API ARAAudioSourceListener +{ +public: + /** Destructor. */ + virtual ~ARAAudioSourceListener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called before the audio source's properties are updated. + @param audioSource The audio source whose properties will be updated. + @param newProperties The audio source properties that will be assigned to \p audioSource. + */ + virtual void willUpdateAudioSourceProperties (ARAAudioSource* audioSource, + ARA::PlugIn::PropertiesPtr newProperties) + { + ignoreUnused (audioSource, newProperties); + } + + /** Called after the audio source's properties are updated. + @param audioSource The audio source whose properties were updated. + */ + virtual void didUpdateAudioSourceProperties (ARAAudioSource* audioSource) + { + ignoreUnused (audioSource); + } + + /** Called when the audio source's content (i.e. samples or notes) changes. + @param audioSource The audio source with updated content. + @param scopeFlags The scope of the content update. + */ + virtual void doUpdateAudioSourceContent (ARAAudioSource* audioSource, ARAContentUpdateScopes scopeFlags) + { + ignoreUnused (audioSource, scopeFlags); + } + + /** Called to notify progress when an audio source is being analyzed. + @param audioSource The audio source being analyzed. + @param state Indicates start, intermediate update or completion of the analysis. + @param progress Progress normalized to the 0..1 range. + */ + virtual void didUpdateAudioSourceAnalysisProgress (ARAAudioSource* audioSource, + ARA::ARAAnalysisProgressState state, + float progress) + { + ignoreUnused (audioSource, state, progress); + } + + /** Called before access to an audio source's samples is enabled or disabled. + @param audioSource The audio source whose sample access state will be changed. + @param enable A bool indicating whether or not sample access will be enabled or disabled. + */ + virtual void willEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) + { + ignoreUnused (audioSource, enable); + } + + /** Called after access to an audio source's samples is enabled or disabled. + @param audioSource The audio source whose sample access state was changed. + @param enable A bool indicating whether or not sample access was enabled or disabled. + */ + virtual void didEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) + { + ignoreUnused (audioSource, enable); + } + + /** Called before an audio source is activated or deactivated when being removed / added from the host's undo history. + @param audioSource The audio source that will be activated or deactivated + @param deactivate A bool indicating whether \p audioSource was deactivated or activated. + */ + virtual void willDeactivateAudioSourceForUndoHistory (ARAAudioSource* audioSource, bool deactivate) + { + ignoreUnused (audioSource, deactivate); + } + + /** Called after an audio source is activated or deactivated when being removed / added from the host's undo history. + @param audioSource The audio source that was activated or deactivated + @param deactivate A bool indicating whether \p audioSource was deactivated or activated. + */ + virtual void didDeactivateAudioSourceForUndoHistory (ARAAudioSource* audioSource, bool deactivate) + { + ignoreUnused (audioSource, deactivate); + } + + /** Called after an audio modification is added to the audio source. + @param audioSource The region sequence that \p audioModification was added to. + @param audioModification The playback region that was added to \p audioSource. + */ + virtual void didAddAudioModificationToAudioSource (ARAAudioSource* audioSource, + ARAAudioModification* audioModification) + { + ignoreUnused (audioSource, audioModification); + } + + /** Called before an audio modification is removed from the audio source. + @param audioSource The audio source that \p audioModification will be removed from. + @param audioModification The audio modification that will be removed from \p audioSource. + */ + virtual void willRemoveAudioModificationFromAudioSource (ARAAudioSource* audioSource, + ARAAudioModification* audioModification) + { + ignoreUnused (audioSource, audioModification); + } + + /** Called before the audio source is destroyed. + @param audioSource The audio source that will be destoyed. + */ + virtual void willDestroyAudioSource (ARAAudioSource* audioSource) + { + ignoreUnused (audioSource); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END +}; + +//============================================================================== +/** Base class representing an ARA audio source. + + @tags{ARA} +*/ +class JUCE_API ARAAudioSource : public ARA::PlugIn::AudioSource, + public ARAListenableModelClass, + public ARAObject +{ +public: + using PropertiesPtr = ARA::PlugIn::PropertiesPtr; + using ARAAnalysisProgressState = ARA::ARAAnalysisProgressState; + using Listener = ARAAudioSourceListener; + + using ARA::PlugIn::AudioSource::AudioSource; + + /** Returns the result of ARA::PlugIn::AudioSource::getDocument() with the pointer cast + to ARADocument*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateDocument(), then you + can use the template parameter to cast the pointers to your subclass of ARADocument. + */ + template + Document_t* getDocument() const noexcept + { + return ARA::PlugIn::AudioSource::getDocument(); + } + + /** Returns the result of ARA::PlugIn::AudioSource::getAudioModifications() with the pointers + within cast to ARAAudioModification*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateAudioModification(), + then you can use the template parameter to cast the pointers to your subclass of + ARAAudioModification. + */ + template + const std::vector& getAudioModifications() const noexcept + { + return ARA::PlugIn::AudioSource::getAudioModifications(); + } + + size_t getNumChildren() const noexcept override; + + ARAObject* getChild (size_t index) override; + + ARAObject* getParent() override { return getDocument(); } + + void visit (ARAObjectVisitor& visitor) override { visitor.visitAudioSource (*this); } + + /** Notify the ARA host and any listeners of analysis progress. + Contrary to most ARA functions, this call can be made from any thread. + The implementation will enqueue these notifications and later post them from the message thread. + Calling code must ensure start and completion state are always balanced, + and must send updates in ascending order. + */ + void notifyAnalysisProgressStarted(); + + /** \copydoc notifyAnalysisProgressStarted + @param progress Progress normalized to the 0..1 range. + */ + void notifyAnalysisProgressUpdated (float progress); + + /** \copydoc notifyAnalysisProgressStarted + */ + void notifyAnalysisProgressCompleted(); + + /** Notify the ARA host and any listeners of a content update initiated by the plug-in. + This must be called by the plug-in model management code on the message thread whenever updating + the internal content representation, such as after successfully analyzing a new tempo map. + Listeners will be notified immediately. If \p notifyARAHost is true, a notification to the host + will be enqueued and sent out the next time it polls for updates. + \p notifyARAHost must be false if the update was triggered by the host via doUpdateAudioSourceContent(). + Furthermore, \p notifyARAHost must be false if the updated content is being restored from an archive. + + @param scopeFlags The scope of the content update. + @param notifyARAHost If true, the ARA host will be notified of the content change. + */ + void notifyContentChanged (ARAContentUpdateScopes scopeFlags, bool notifyARAHost); + +public: + friend ARADocumentController; + ARA::PlugIn::AnalysisProgressTracker internalAnalysisProgressTracker; +}; + +/** A base class for listeners that want to know about changes to an ARAAudioModification object. + + Use ARAAudioModification::addListener() to register your listener with an ARAAudioModification. + + @tags{ARA} +*/ +class JUCE_API ARAAudioModificationListener +{ +public: + /** Destructor. */ + virtual ~ARAAudioModificationListener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called before the audio modification's properties are updated. + @param audioModification The audio modification whose properties will be updated. + @param newProperties The audio modification properties that will be assigned to \p audioModification. + */ + virtual void willUpdateAudioModificationProperties (ARAAudioModification* audioModification, + ARA::PlugIn::PropertiesPtr newProperties) + { + ignoreUnused (audioModification, newProperties); + } + + /** Called after the audio modification's properties are updated. + @param audioModification The audio modification whose properties were updated. + */ + virtual void didUpdateAudioModificationProperties (ARAAudioModification* audioModification) + { + ignoreUnused (audioModification); + } + + /** Called when the audio modification's content (i.e. samples or notes) changes. + @param audioModification The audio modification with updated content. + @param scopeFlags The scope of the content update. + */ + virtual void didUpdateAudioModificationContent (ARAAudioModification* audioModification, ARAContentUpdateScopes scopeFlags) + { + ignoreUnused (audioModification, scopeFlags); + } + + /** Called before an audio modification is activated or deactivated when being removed / added from the host's undo history. + @param audioModification The audio modification that was activated or deactivated + @param deactivate A bool indicating whether \p audioModification was deactivated or activated. + */ + virtual void willDeactivateAudioModificationForUndoHistory (ARAAudioModification* audioModification, bool deactivate) + { + ignoreUnused (audioModification, deactivate); + } + + /** Called after an audio modification is activated or deactivated when being removed / added from the host's undo history. + @param audioModification The audio modification that was activated or deactivated + @param deactivate A bool indicating whether \p audioModification was deactivated or activated. + */ + virtual void didDeactivateAudioModificationForUndoHistory (ARAAudioModification* audioModification, bool deactivate) + { + ignoreUnused (audioModification, deactivate); + } + + /** Called after a playback region is added to the audio modification. + @param audioModification The audio modification that \p playbackRegion was added to. + @param playbackRegion The playback region that was added to \p audioModification. + */ + virtual void didAddPlaybackRegionToAudioModification (ARAAudioModification* audioModification, + ARAPlaybackRegion* playbackRegion) + { + ignoreUnused (audioModification, playbackRegion); + } + + /** Called before a playback region is removed from the audio modification. + @param audioModification The audio modification that \p playbackRegion will be removed from. + @param playbackRegion The playback region that will be removed from \p audioModification. + */ + virtual void willRemovePlaybackRegionFromAudioModification (ARAAudioModification* audioModification, + ARAPlaybackRegion* playbackRegion) + { + ignoreUnused (audioModification, playbackRegion); + } + + /** Called before the audio modification is destroyed. + @param audioModification The audio modification that will be destoyed. + */ + virtual void willDestroyAudioModification (ARAAudioModification* audioModification) + { + ignoreUnused (audioModification); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END +}; + +//============================================================================== +/** Base class representing an ARA audio modification. + + @tags{ARA} +*/ +class JUCE_API ARAAudioModification : public ARA::PlugIn::AudioModification, + public ARAListenableModelClass, + public ARAObject +{ +public: + using PropertiesPtr = ARA::PlugIn::PropertiesPtr; + using Listener = ARAAudioModificationListener; + + using ARA::PlugIn::AudioModification::AudioModification; + + /** Returns the result of ARA::PlugIn::AudioModification::getAudioSource() with the pointer cast + to ARAAudioSource*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateAudioSource(), then you + can use the template parameter to cast the pointers to your subclass of ARAAudioSource. + */ + template + AudioSource_t* getAudioSource() const noexcept + { + return ARA::PlugIn::AudioModification::getAudioSource(); + } + + /** Returns the result of ARA::PlugIn::AudioModification::getPlaybackRegions() with the + pointers within cast to ARAPlaybackRegion*. + + If you have overridden ARADocumentControllerSpecialisation::doCreatePlaybackRegion(), then + you can use the template parameter to cast the pointers to your subclass of ARAPlaybackRegion. + */ + template + const std::vector& getPlaybackRegions() const noexcept + { + return ARA::PlugIn::AudioModification::getPlaybackRegions(); + } + + size_t getNumChildren() const noexcept override; + + ARAObject* getChild (size_t index) override; + + ARAObject* getParent() override { return getAudioSource(); } + + void visit (ARAObjectVisitor& visitor) override { visitor.visitAudioModification (*this); } + + /** Notify the ARA host and any listeners of a content update initiated by the plug-in. + This must be called by the plug-in model management code on the message thread whenever updating + the internal content representation, such as after the user editing the pitch of a note. + Listeners will be notified immediately. If \p notifyARAHost is true, a notification to the host + will be enqueued and sent out the next time it polls for updates. + \p notifyARAHost must be false if the updated content is being restored from an archive. + + @param scopeFlags The scope of the content update. + @param notifyARAHost If true, the ARA host will be notified of the content change. + */ + void notifyContentChanged (ARAContentUpdateScopes scopeFlags, bool notifyARAHost); +}; + +} // namespace juce diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp b/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp new file mode 100644 index 00000000..fcece498 --- /dev/null +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp @@ -0,0 +1,92 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "juce_ARAPlugInInstanceRoles.h" + +namespace juce +{ + +bool ARARenderer::processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept +{ + ignoreUnused (buffer, realtime, positionInfo); + + // If you hit this assertion then either the caller called the double + // precision version of processBlock on a processor which does not support it + // (i.e. supportsDoublePrecisionProcessing() returns false), or the implementation + // of the ARARenderer forgot to override the double precision version of this method + jassertfalse; + + return false; +} + +//============================================================================== +#if ARA_VALIDATE_API_CALLS +void ARAPlaybackRenderer::addPlaybackRegion (ARA::ARAPlaybackRegionRef playbackRegionRef) noexcept +{ + if (araExtension) + ARA_VALIDATE_API_STATE (! araExtension->isPrepared); + + ARA::PlugIn::PlaybackRenderer::addPlaybackRegion (playbackRegionRef); +} + +void ARAPlaybackRenderer::removePlaybackRegion (ARA::ARAPlaybackRegionRef playbackRegionRef) noexcept +{ + if (araExtension) + ARA_VALIDATE_API_STATE (! araExtension->isPrepared); + + ARA::PlugIn::PlaybackRenderer::removePlaybackRegion (playbackRegionRef); +} +#endif + +//============================================================================== +void ARAEditorView::doNotifySelection (const ARA::PlugIn::ViewSelection* viewSelection) noexcept +{ + listeners.call ([&] (Listener& l) + { + l.onNewSelection (*viewSelection); + }); +} + +void ARAEditorView::doNotifyHideRegionSequences (std::vector const& regionSequences) noexcept +{ + listeners.call ([&] (Listener& l) + { + l.onHideRegionSequences (ARA::vector_cast (regionSequences)); + }); +} + +void ARAEditorView::addListener (Listener* l) +{ + listeners.add (l); +} + +void ARAEditorView::removeListener (Listener* l) +{ + listeners.remove (l); +} + +} // namespace juce diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h b/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h new file mode 100644 index 00000000..01762924 --- /dev/null +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h @@ -0,0 +1,271 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#pragma once + +namespace juce +{ + +//============================================================================== +/** Base class for a renderer fulfilling either the ARAPlaybackRenderer or the ARAEditorRenderer role. + + Instances of either subclass are constructed by the DocumentController. + + @tags{ARA} +*/ +class JUCE_API ARARenderer +{ +public: + enum class AlwaysNonRealtime { no, yes }; + + virtual ~ARARenderer() = default; + + /** Initialises the renderer for playback. + + @param sampleRate The sample rate that will be used for the data that is sent + to the renderer + @param maximumSamplesPerBlock The maximum number of samples that will be in the blocks + sent to process() method + @param numChannels The number of channels that the process() method will be + expected to handle + @param precision This should be the same as the result of getProcessingPrecision() + for the enclosing AudioProcessor + @param alwaysNonRealtime yes if this renderer is never used in realtime (e.g. if + providing data for views only) + */ + virtual void prepareToPlay (double sampleRate, + int maximumSamplesPerBlock, + int numChannels, + AudioProcessor::ProcessingPrecision precision, + AlwaysNonRealtime alwaysNonRealtime = AlwaysNonRealtime::no) + { + ignoreUnused (sampleRate, maximumSamplesPerBlock, numChannels, precision, alwaysNonRealtime); + } + + /** Frees render resources allocated in prepareToPlay(). */ + virtual void releaseResources() {} + + /** Resets the internal state variables of the renderer. */ + virtual void reset() {} + + /** Renders the output into the given buffer. Returns true if rendering executed without error, + false otherwise. + + @param buffer The output buffer for the rendering. ARAPlaybackRenderers will + replace the sample data, while ARAEditorRenderer will add to it. + @param realtime Indicates whether the call is executed under real time constraints. + The value of this parameter may change from one call to the next, + and if the value is yes, the rendering may fail if the required + samples cannot be obtained in time. + @param positionInfo Current song position, playback state and playback loop location. + There should be no need to access the bpm, timeSig and ppqPosition + members in any ARA renderer since ARA provides that information with + random access in its model graph. + + Returns false if non-ARA fallback rendering is required and true otherwise. + */ + virtual bool processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept = 0; + + /** Renders the output into the given buffer. Returns true if rendering executed without error, + false otherwise. + + @param buffer The output buffer for the rendering. ARAPlaybackRenderers will + replace the sample data, while ARAEditorRenderer will add to it. + @param realtime Indicates whether the call is executed under real time constraints. + The value of this parameter may change from one call to the next, + and if the value is yes, the rendering may fail if the required + samples cannot be obtained in time. + @param positionInfo Current song position, playback state and playback loop location. + There should be no need to access the bpm, timeSig and ppqPosition + members in any ARA renderer since ARA provides that information with + random access in its model graph. + + Returns false if non-ARA fallback rendering is required and true otherwise. + */ + virtual bool processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept; +}; + +//============================================================================== +/** Base class for a renderer fulfilling the ARAPlaybackRenderer role as described in the ARA SDK. + + Instances of this class are constructed by the DocumentController. If you are subclassing + ARAPlaybackRenderer, make sure to call the base class implementation of any overridden function, + except for processBlock. + + @tags{ARA} +*/ +class JUCE_API ARAPlaybackRenderer : public ARA::PlugIn::PlaybackRenderer, + public ARARenderer +{ +public: + using ARA::PlugIn::PlaybackRenderer::PlaybackRenderer; + + bool processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept override + { + ignoreUnused (buffer, realtime, positionInfo); + return false; + } + + // Shadowing templated getters to default to JUCE versions of the returned classes + /** Returns the PlaybackRegions + * + * @tparam PlaybackRegion_t + * @return + */ + template + std::vector const& getPlaybackRegions() const noexcept + { + return ARA::PlugIn::PlaybackRenderer::getPlaybackRegions(); + } + +#if ARA_VALIDATE_API_CALLS + void addPlaybackRegion (ARA::ARAPlaybackRegionRef playbackRegionRef) noexcept override; + void removePlaybackRegion (ARA::ARAPlaybackRegionRef playbackRegionRef) noexcept override; + AudioProcessorARAExtension* araExtension {}; +#endif + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAPlaybackRenderer) +}; + +//============================================================================== +/** Base class for a renderer fulfilling the ARAEditorRenderer role as described in the ARA SDK. + + Instances of this class are constructed by the DocumentController. If you are subclassing + ARAEditorRenderer, make sure to call the base class implementation of any overridden function, + except for processBlock. + + @tags{ARA} +*/ +class JUCE_API ARAEditorRenderer : public ARA::PlugIn::EditorRenderer, + public ARARenderer +{ +public: + using ARA::PlugIn::EditorRenderer::EditorRenderer; + + // Shadowing templated getters to default to JUCE versions of the returned classes + template + std::vector const& getPlaybackRegions() const noexcept + { + return ARA::PlugIn::EditorRenderer::getPlaybackRegions(); + } + + template + std::vector const& getRegionSequences() const noexcept + { + return ARA::PlugIn::EditorRenderer::getRegionSequences(); + } + + // By default, editor renderers will just let the signal pass through unaltered. + // If you're overriding this to implement actual audio preview, remember to check + // isNonRealtime of the process context - typically preview is limited to realtime. + bool processBlock (AudioBuffer& buffer, + AudioProcessor::Realtime isNonRealtime, + const AudioPlayHead::PositionInfo& positionInfo) noexcept override + { + ignoreUnused (buffer, isNonRealtime, positionInfo); + return true; + } + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAEditorRenderer) +}; + +//============================================================================== +/** Base class for a renderer fulfilling the ARAEditorView role as described in the ARA SDK. + + Instances of this class are constructed by the DocumentController. If you are subclassing + ARAEditorView, make sure to call the base class implementation of overridden functions. + + @tags{ARA} +*/ +class JUCE_API ARAEditorView : public ARA::PlugIn::EditorView +{ +public: + using ARA::PlugIn::EditorView::EditorView; + + // Shadowing templated getters to default to JUCE versions of the returned classes + template + std::vector const& getHiddenRegionSequences() const noexcept + { + return ARA::PlugIn::EditorView::getHiddenRegionSequences(); + } + + // Base class implementation must be called if overridden + void doNotifySelection (const ARA::PlugIn::ViewSelection* currentSelection) noexcept override; + + // Base class implementation must be called if overridden + void doNotifyHideRegionSequences (std::vector const& regionSequences) noexcept override; + + /** A base class for listeners that want to know about changes to an ARAEditorView object. + + Use ARAEditorView::addListener() to register your listener with an ARAEditorView. + */ + class JUCE_API Listener + { + public: + /** Destructor. */ + virtual ~Listener() = default; + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN + + /** Called when the editor view's selection changes. + @param viewSelection The current selection state + */ + virtual void onNewSelection (const ARA::PlugIn::ViewSelection& viewSelection) + { + ignoreUnused (viewSelection); + } + + /** Called when region sequences are flagged as hidden in the host UI. + @param regionSequences A vector containing all hidden region sequences. + */ + virtual void onHideRegionSequences (std::vector const& regionSequences) + { + ignoreUnused (regionSequences); + } + + ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END + }; + + /** \copydoc ARAListenableModelClass::addListener */ + void addListener (Listener* l); + + /** \copydoc ARAListenableModelClass::removeListener */ + void removeListener (Listener* l); + +private: + ListenerList listeners; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAEditorView) +}; + +} diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp b/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp new file mode 100644 index 00000000..ed914026 --- /dev/null +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.cpp @@ -0,0 +1,32 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#if JucePlugin_Enable_ARA +#include "juce_ARADocumentControllerCommon.cpp" +#include "juce_ARADocumentController.cpp" +#include "juce_ARAModelObjects.cpp" +#include "juce_ARAPlugInInstanceRoles.cpp" +#include "juce_AudioProcessor_ARAExtensions.cpp" +#endif diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h b/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h new file mode 100644 index 00000000..e30cbbe3 --- /dev/null +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARA_utils.h @@ -0,0 +1,85 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#if JucePlugin_Enable_ARA + +// Include ARA SDK headers +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wgnu-zero-variadic-macro-arguments", + "-Wunused-parameter") +JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6387) + +#include + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE +JUCE_END_IGNORE_WARNINGS_MSVC + +namespace juce +{ + +using ARAViewSelection = ARA::PlugIn::ViewSelection; +using ARAContentUpdateScopes = ARA::ContentUpdateScopes; +using ARARestoreObjectsFilter = ARA::PlugIn::RestoreObjectsFilter; +using ARAStoreObjectsFilter = ARA::PlugIn::StoreObjectsFilter; + +/** Converts an ARA::ARAUtf8String to a JUCE String. */ +inline String convertARAString (ARA::ARAUtf8String str) +{ + return String (CharPointer_UTF8 (str)); +} + +/** Converts a potentially NULL ARA::ARAUtf8String to a JUCE String. + + Returns the JUCE equivalent of the provided string if it's not nullptr, and the fallback string + otherwise. +*/ +inline String convertOptionalARAString (ARA::ARAUtf8String str, const String& fallbackString = String()) +{ + return (str != nullptr) ? convertARAString (str) : fallbackString; +} + +/** Converts an ARA::ARAColor* to a JUCE Colour. */ +inline Colour convertARAColour (const ARA::ARAColor* colour) +{ + return Colour::fromFloatRGBA (colour->r, colour->g, colour->b, 1.0f); +} + +/** Converts a potentially NULL ARA::ARAColor* to a JUCE Colour. + + Returns the JUCE equivalent of the provided colour if it's not nullptr, and the fallback colour + otherwise. +*/ +inline Colour convertOptionalARAColour (const ARA::ARAColor* colour, const Colour& fallbackColour = Colour()) +{ + return (colour != nullptr) ? convertARAColour (colour) : fallbackColour; +} + +} // namespace juce + +#include "juce_ARAModelObjects.h" +#include "juce_ARADocumentController.h" +#include "juce_AudioProcessor_ARAExtensions.h" +#include "juce_ARAPlugInInstanceRoles.h" + +#endif diff --git a/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp b/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp new file mode 100644 index 00000000..9d871b3d --- /dev/null +++ b/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.cpp @@ -0,0 +1,154 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "juce_AudioProcessor_ARAExtensions.h" + +namespace juce +{ + +//============================================================================== +bool AudioProcessorARAExtension::getTailLengthSecondsForARA (double& tailLength) const +{ + if (! isBoundToARA()) + return false; + + tailLength = 0.0; + + if (auto playbackRenderer = getPlaybackRenderer()) + for (const auto& playbackRegion : playbackRenderer->getPlaybackRegions()) + tailLength = jmax (tailLength, playbackRegion->getTailTime()); + + return true; +} + +bool AudioProcessorARAExtension::prepareToPlayForARA (double sampleRate, + int samplesPerBlock, + int numChannels, + AudioProcessor::ProcessingPrecision precision) +{ +#if ARA_VALIDATE_API_CALLS + isPrepared = true; +#endif + + if (! isBoundToARA()) + return false; + + if (auto playbackRenderer = getPlaybackRenderer()) + playbackRenderer->prepareToPlay (sampleRate, samplesPerBlock, numChannels, precision); + + if (auto editorRenderer = getEditorRenderer()) + editorRenderer->prepareToPlay (sampleRate, samplesPerBlock, numChannels, precision); + + return true; +} + +bool AudioProcessorARAExtension::releaseResourcesForARA() +{ +#if ARA_VALIDATE_API_CALLS + isPrepared = false; +#endif + + if (! isBoundToARA()) + return false; + + if (auto playbackRenderer = getPlaybackRenderer()) + playbackRenderer->releaseResources(); + + if (auto editorRenderer = getEditorRenderer()) + editorRenderer->releaseResources(); + + return true; +} + +bool AudioProcessorARAExtension::processBlockForARA (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo) +{ + // validate that the host has prepared us before processing + ARA_VALIDATE_API_STATE (isPrepared); + + if (! isBoundToARA()) + return false; + + // Render our ARA playback regions for this buffer. + if (auto playbackRenderer = getPlaybackRenderer()) + playbackRenderer->processBlock (buffer, realtime, positionInfo); + + // Render our ARA editor regions and sequences for this buffer. + // This example does not support editor rendering and thus uses the default implementation, + // which is a no-op and could be omitted in actual plug-ins to optimize performance. + if (auto editorRenderer = getEditorRenderer()) + editorRenderer->processBlock (buffer, realtime, positionInfo); + + return true; +} + +bool AudioProcessorARAExtension::processBlockForARA (AudioBuffer& buffer, + juce::AudioProcessor::Realtime realtime, + AudioPlayHead* playhead) +{ + return processBlockForARA (buffer, + realtime, + playhead != nullptr ? playhead->getPosition().orFallback (AudioPlayHead::PositionInfo{}) + : AudioPlayHead::PositionInfo{}); +} + +//============================================================================== +void AudioProcessorARAExtension::didBindToARA() noexcept +{ + // validate that the ARA binding is not established by the host while prepared to play +#if ARA_VALIDATE_API_CALLS + ARA_VALIDATE_API_STATE (! isPrepared); + if (auto playbackRenderer = getPlaybackRenderer()) + playbackRenderer->araExtension = this; +#endif + +#if (! JUCE_DISABLE_ASSERTIONS) + // validate proper subclassing of the instance role classes + if (auto playbackRenderer = getPlaybackRenderer()) + jassert (dynamic_cast (playbackRenderer) != nullptr); + if (auto editorRenderer = getEditorRenderer()) + jassert (dynamic_cast (editorRenderer) != nullptr); + if (auto editorView = getEditorView()) + jassert (dynamic_cast (editorView) != nullptr); +#endif +} + +//============================================================================== + +AudioProcessorEditorARAExtension::AudioProcessorEditorARAExtension (AudioProcessor* audioProcessor) + : araProcessorExtension (dynamic_cast (audioProcessor)) +{ + if (isARAEditorView()) + getARAEditorView()->setEditorOpen (true); +} + +AudioProcessorEditorARAExtension::~AudioProcessorEditorARAExtension() +{ + if (isARAEditorView()) + getARAEditorView()->setEditorOpen (false); +} + +} // namespace juce diff --git a/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h b/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h new file mode 100644 index 00000000..82a5644c --- /dev/null +++ b/modules/juce_audio_processors/utilities/ARA/juce_AudioProcessor_ARAExtensions.h @@ -0,0 +1,204 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#pragma once + +namespace juce +{ + +class AudioProcessor; +class ARAPlaybackRenderer; +class ARAEditorRenderer; +class ARAEditorView; + +//============================================================================== +/** Extension class meant to be subclassed by the plugin's implementation of @see AudioProcessor. + + Subclassing AudioProcessorARAExtension allows access to the three possible plugin instance + roles as defined by the ARA SDK. Hosts can assign any subset of roles to each plugin instance. + + @tags{ARA} +*/ +class JUCE_API AudioProcessorARAExtension : public ARA::PlugIn::PlugInExtension +{ +public: + AudioProcessorARAExtension() = default; + + //============================================================================== + /** Returns the result of ARA::PlugIn::PlugInExtension::getPlaybackRenderer() with the pointer + cast to ARAPlaybackRenderer*. + + If you have overridden ARADocumentControllerSpecialisation::doCreatePlaybackRenderer(), + then you can use the template parameter to cast the pointers to your subclass of + ARAPlaybackRenderer. + */ + template + PlaybackRenderer_t* getPlaybackRenderer() const noexcept + { + return ARA::PlugIn::PlugInExtension::getPlaybackRenderer(); + } + + /** Returns the result of ARA::PlugIn::PlugInExtension::getEditorRenderer() with the pointer + cast to ARAEditorRenderer*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateEditorRenderer(), + then you can use the template parameter to cast the pointers to your subclass of + ARAEditorRenderer. + */ + template + EditorRenderer_t* getEditorRenderer() const noexcept + { + return ARA::PlugIn::PlugInExtension::getEditorRenderer(); + } + + /** Returns the result of ARA::PlugIn::PlugInExtension::getEditorView() with the pointer + cast to ARAEditorView*. + + If you have overridden ARADocumentControllerSpecialisation::doCreateEditorView(), + then you can use the template parameter to cast the pointers to your subclass of + ARAEditorView. + */ + template + EditorView_t* getEditorView() const noexcept + { + return ARA::PlugIn::PlugInExtension::getEditorView(); + } + + //============================================================================== + /** Returns true if plugin instance fulfills the ARAPlaybackRenderer role. */ + bool isPlaybackRenderer() const noexcept + { + return ARA::PlugIn::PlugInExtension::getPlaybackRenderer() != nullptr; + } + + /** Returns true if plugin instance fulfills the ARAEditorRenderer role. */ + bool isEditorRenderer() const noexcept + { + return ARA::PlugIn::PlugInExtension::getEditorRenderer() != nullptr; + } + + /** Returns true if plugin instance fulfills the ARAEditorView role. */ + bool isEditorView() const noexcept + { + return ARA::PlugIn::PlugInExtension::getEditorView() != nullptr; + } + + //============================================================================== +#if ARA_VALIDATE_API_CALLS + bool isPrepared { false }; +#endif + +protected: + /** Implementation helper for AudioProcessor::getTailLengthSeconds(). + + If bound to ARA, this traverses the instance roles to retrieve the respective tail time + and returns true. Otherwise returns false and leaves tailLength unmodified. + */ + bool getTailLengthSecondsForARA (double& tailLength) const; + + /** Implementation helper for AudioProcessor::prepareToPlay(). + + If bound to ARA, this traverses the instance roles to prepare them for play and returns + true. Otherwise returns false and does nothing. + */ + bool prepareToPlayForARA (double sampleRate, + int samplesPerBlock, + int numChannels, + AudioProcessor::ProcessingPrecision precision); + + /** Implementation helper for AudioProcessor::releaseResources(). + + If bound to ARA, this traverses the instance roles to let them release resources and returns + true. Otherwise returns false and does nothing. + */ + bool releaseResourcesForARA(); + + /** Implementation helper for AudioProcessor::processBlock(). + + If bound to ARA, this traverses the instance roles to let them process the block and returns + true. Otherwise returns false and does nothing. + + Use this overload if your rendering code already has a current positionInfo available. + */ + bool processBlockForARA (AudioBuffer& buffer, + AudioProcessor::Realtime realtime, + const AudioPlayHead::PositionInfo& positionInfo); + + /** Implementation helper for AudioProcessor::processBlock(). + + If bound to ARA, this traverses the instance roles to let them process the block and returns + true. Otherwise returns false and does nothing. + + Use this overload if your rendering code does not have a current positionInfo available. + */ + bool processBlockForARA (AudioBuffer& buffer, AudioProcessor::Realtime isNonRealtime, AudioPlayHead* playhead); + + //============================================================================== + /** Optional hook for derived classes to perform any additional initialization that may be needed. + + If overriding this, make sure you call the base class implementation from your override. + */ + void didBindToARA() noexcept override; + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorARAExtension) +}; + +//============================================================================== +/** Extension class meant to be subclassed by the plugin's implementation of @see AudioProcessorEditor. + + Subclassing AudioProcessorARAExtension allows access to the ARAEditorView instance role as + described by the ARA SDK. + + @tags{ARA} +*/ +class JUCE_API AudioProcessorEditorARAExtension +{ +public: + /** Constructor. */ + explicit AudioProcessorEditorARAExtension (AudioProcessor* audioProcessor); + + /** \copydoc AudioProcessorARAExtension::getEditorView */ + template + EditorView_t* getARAEditorView() const noexcept + { + return (this->araProcessorExtension != nullptr) ? this->araProcessorExtension->getEditorView() + : nullptr; + } + + /** \copydoc AudioProcessorARAExtension::isEditorView */ + bool isARAEditorView() const noexcept { return getARAEditorView() != nullptr; } + +protected: + /** Destructor. */ + ~AudioProcessorEditorARAExtension(); + +private: + AudioProcessorARAExtension* araProcessorExtension; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorEditorARAExtension) +}; + +} // namespace juce diff --git a/modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp b/modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp index 4ba512dd..47911121 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp +++ b/modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,46 +26,36 @@ namespace juce { -AudioParameterBool::AudioParameterBool (const String& idToUse, const String& nameToUse, - bool def, const String& labelToUse, - std::function stringFromBool, - std::function boolFromString) - : RangedAudioParameter (idToUse, nameToUse, labelToUse), - value (def ? 1.0f : 0.0f), - defaultValue (value), - stringFromBoolFunction (stringFromBool), - boolFromStringFunction (boolFromString) +AudioParameterBool::AudioParameterBool (const ParameterID& idToUse, + const String& nameToUse, + bool def, + const AudioParameterBoolAttributes& attributes) + : RangedAudioParameter (idToUse, nameToUse, attributes.getAudioProcessorParameterWithIDAttributes()), + value (def ? 1.0f : 0.0f), + valueDefault (def), + stringFromBoolFunction (attributes.getStringFromValueFunction() != nullptr + ? attributes.getStringFromValueFunction() + : [] (bool v, int) { return v ? TRANS("On") : TRANS("Off"); }), + boolFromStringFunction (attributes.getValueFromStringFunction() != nullptr + ? attributes.getValueFromStringFunction() + : [] (const String& text) + { + static const StringArray onStrings { TRANS ("on"), TRANS ("yes"), TRANS ("true") }; + static const StringArray offStrings { TRANS ("off"), TRANS ("no"), TRANS ("false") }; + + String lowercaseText (text.toLowerCase()); + + for (auto& testText : onStrings) + if (lowercaseText == testText) + return true; + + for (auto& testText : offStrings) + if (lowercaseText == testText) + return false; + + return text.getIntValue() != 0; + }) { - if (stringFromBoolFunction == nullptr) - stringFromBoolFunction = [] (bool v, int) { return v ? TRANS("On") : TRANS("Off"); }; - - if (boolFromStringFunction == nullptr) - { - StringArray onStrings; - onStrings.add (TRANS("on")); - onStrings.add (TRANS("yes")); - onStrings.add (TRANS("true")); - - StringArray offStrings; - offStrings.add (TRANS("off")); - offStrings.add (TRANS("no")); - offStrings.add (TRANS("false")); - - boolFromStringFunction = [onStrings, offStrings] (const String& text) - { - String lowercaseText (text.toLowerCase()); - - for (auto& testText : onStrings) - if (lowercaseText == testText) - return true; - - for (auto& testText : offStrings) - if (lowercaseText == testText) - return false; - - return text.getIntValue() != 0; - }; - } } AudioParameterBool::~AudioParameterBool() @@ -78,7 +68,7 @@ AudioParameterBool::~AudioParameterBool() float AudioParameterBool::getValue() const { return value; } void AudioParameterBool::setValue (float newValue) { value = newValue; valueChanged (get()); } -float AudioParameterBool::getDefaultValue() const { return defaultValue; } +float AudioParameterBool::getDefaultValue() const { return valueDefault; } int AudioParameterBool::getNumSteps() const { return 2; } bool AudioParameterBool::isDiscrete() const { return true; } bool AudioParameterBool::isBoolean() const { return true; } diff --git a/modules/juce_audio_processors/utilities/juce_AudioParameterBool.h b/modules/juce_audio_processors/utilities/juce_AudioParameterBool.h index f4a7f2c4..f16945f7 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioParameterBool.h +++ b/modules/juce_audio_processors/utilities/juce_AudioParameterBool.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,13 @@ namespace juce { +/** Properties of an AudioParameterBool. + + @see AudioParameterBool(), RangedAudioParameterAttributes() +*/ +class AudioParameterBoolAttributes : public RangedAudioParameterAttributes {}; + +//============================================================================== /** Provides a class of AudioProcessorParameter that can be used as a boolean value. @@ -36,6 +43,28 @@ namespace juce class JUCE_API AudioParameterBool : public RangedAudioParameter { public: + /** Creates a AudioParameterBool with the specified parameters. + + Note that the attributes argument is optional and only needs to be + supplied if you want to change options from their default values. + + Example usage: + @code + auto attributes = AudioParameterBoolAttributes().withStringFromValueFunction ([] (auto x, auto) { return x ? "On" : "Off"; }) + .withLabel ("enabled"); + auto param = std::make_unique ("paramID", "Parameter Name", false, attributes); + @endcode + + @param parameterID The parameter ID to use + @param parameterName The parameter name to use + @param defaultValue The default value + @param attributes Optional characteristics + */ + AudioParameterBool (const ParameterID& parameterID, + const String& parameterName, + bool defaultValue, + const AudioParameterBoolAttributes& attributes = {}); + /** Creates a AudioParameterBool with the specified parameters. @param parameterID The parameter ID to use @@ -49,10 +78,21 @@ public: converts it into a bool value. Some hosts use this to allow users to type in parameter values. */ - AudioParameterBool (const String& parameterID, const String& parameterName, bool defaultValue, - const String& parameterLabel = String(), + [[deprecated ("Prefer the signature taking an Attributes argument")]] + AudioParameterBool (const ParameterID& parameterID, + const String& parameterName, + bool defaultValue, + const String& parameterLabel, std::function stringFromBool = nullptr, - std::function boolFromString = nullptr); + std::function boolFromString = nullptr) + : AudioParameterBool (parameterID, + parameterName, + defaultValue, + AudioParameterBoolAttributes().withLabel (parameterLabel) + .withStringFromValueFunction (std::move (stringFromBool)) + .withValueFromStringFunction (std::move (boolFromString))) + { + } /** Destructor. */ ~AudioParameterBool() override; @@ -88,7 +128,7 @@ private: const NormalisableRange range { 0.0f, 1.0f, 1.0f }; std::atomic value; - const float defaultValue; + const float valueDefault; std::function stringFromBoolFunction; std::function boolFromStringFunction; diff --git a/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp b/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp index 05ae5856..3e087593 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp +++ b/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,11 +26,13 @@ namespace juce { -AudioParameterChoice::AudioParameterChoice (const String& idToUse, const String& nameToUse, - const StringArray& c, int def, const String& labelToUse, - std::function stringFromIndex, - std::function indexFromString) - : RangedAudioParameter (idToUse, nameToUse, labelToUse), choices (c), +AudioParameterChoice::AudioParameterChoice (const ParameterID& idToUse, + const String& nameToUse, + const StringArray& c, + int def, + const AudioParameterChoiceAttributes& attributes) + : RangedAudioParameter (idToUse, nameToUse, attributes.getAudioProcessorParameterWithIDAttributes()), + choices (c), range ([this] { NormalisableRange rangeWithInterval { 0.0f, (float) choices.size() - 1.0f, @@ -42,16 +44,14 @@ AudioParameterChoice::AudioParameterChoice (const String& idToUse, const String& }()), value ((float) def), defaultValue (convertTo0to1 ((float) def)), - stringFromIndexFunction (stringFromIndex), - indexFromStringFunction (indexFromString) + stringFromIndexFunction (attributes.getStringFromValueFunction() != nullptr + ? attributes.getStringFromValueFunction() + : [this] (int index, int) { return choices [index]; }), + indexFromStringFunction (attributes.getValueFromStringFunction() != nullptr + ? attributes.getValueFromStringFunction() + : [this] (const String& text) { return choices.indexOf (text); }) { jassert (choices.size() > 1); // you must supply an actual set of items to choose from! - - if (stringFromIndexFunction == nullptr) - stringFromIndexFunction = [this] (int index, int) { return choices [index]; }; - - if (indexFromStringFunction == nullptr) - indexFromStringFunction = [this] (const String& text) { return choices.indexOf (text); }; } AudioParameterChoice::~AudioParameterChoice() diff --git a/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h b/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h index 818f3aca..f3fdd2d6 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h +++ b/modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,13 @@ namespace juce { +/** Properties of an AudioParameterChoice. + + @see AudioParameterChoice(), RangedAudioParameterAttributes() +*/ +class AudioParameterChoiceAttributes : public RangedAudioParameterAttributes {}; + +//============================================================================== /** Provides a class of AudioProcessorParameter that can be used to select an indexed, named choice from a list. @@ -39,10 +46,33 @@ class JUCE_API AudioParameterChoice : public RangedAudioParameter public: /** Creates a AudioParameterChoice with the specified parameters. + Note that the attributes argument is optional and only needs to be + supplied if you want to change options from their default values. + + Example usage: + @code + auto attributes = AudioParameterChoiceAttributes().withLabel ("selected"); + auto param = std::make_unique ("paramID", "Parameter Name", StringArray { "a", "b", "c" }, 0, attributes); + @endcode + @param parameterID The parameter ID to use @param parameterName The parameter name to use @param choices The set of choices to use @param defaultItemIndex The index of the default choice + @param attributes Optional characteristics + */ + AudioParameterChoice (const ParameterID& parameterID, + const String& parameterName, + const StringArray& choices, + int defaultItemIndex, + const AudioParameterChoiceAttributes& attributes = {}); + + /** Creates a AudioParameterChoice with the specified parameters. + + @param parameterID The parameter ID to use + @param parameterName The parameter name to use + @param choicesToUse The set of choices to use + @param defaultItemIndex The index of the default choice @param parameterLabel An optional label for the parameter's value @param stringFromIndex An optional lambda function that converts a choice index to a string with a maximum length. This may @@ -51,12 +81,23 @@ public: converts it into a choice index. Some hosts use this to allow users to type in parameter values. */ - AudioParameterChoice (const String& parameterID, const String& parameterName, - const StringArray& choices, + [[deprecated ("Prefer the signature taking an Attributes argument")]] + AudioParameterChoice (const ParameterID& parameterID, + const String& parameterName, + const StringArray& choicesToUse, int defaultItemIndex, - const String& parameterLabel = String(), + const String& parameterLabel, std::function stringFromIndex = nullptr, - std::function indexFromString = nullptr); + std::function indexFromString = nullptr) + : AudioParameterChoice (parameterID, + parameterName, + choicesToUse, + defaultItemIndex, + AudioParameterChoiceAttributes().withLabel (parameterLabel) + .withStringFromValueFunction (std::move (stringFromIndex)) + .withValueFromStringFunction (std::move (indexFromString))) + { + } /** Destructor. */ ~AudioParameterChoice() override; diff --git a/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp b/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp index ccd31f5d..a9f84d3a 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp +++ b/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,15 +26,17 @@ namespace juce { -AudioParameterFloat::AudioParameterFloat (const String& idToUse, const String& nameToUse, - NormalisableRange r, float def, - const String& labelToUse, Category categoryToUse, - std::function stringFromValue, - std::function valueFromString) - : RangedAudioParameter (idToUse, nameToUse, labelToUse, categoryToUse), - range (r), value (def), defaultValue (def), - stringFromValueFunction (stringFromValue), - valueFromStringFunction (valueFromString) +AudioParameterFloat::AudioParameterFloat (const ParameterID& idToUse, + const String& nameToUse, + NormalisableRange r, + float def, + const AudioParameterFloatAttributes& attributes) + : RangedAudioParameter (idToUse, nameToUse, attributes.getAudioProcessorParameterWithIDAttributes()), + range (r), + value (def), + valueDefault (def), + stringFromValueFunction (attributes.getStringFromValueFunction()), + valueFromStringFunction (attributes.getValueFromStringFunction()) { if (stringFromValueFunction == nullptr) { @@ -70,7 +72,7 @@ AudioParameterFloat::AudioParameterFloat (const String& idToUse, const String& n valueFromStringFunction = [] (const String& text) { return text.getFloatValue(); }; } -AudioParameterFloat::AudioParameterFloat (String pid, String nm, float minValue, float maxValue, float def) +AudioParameterFloat::AudioParameterFloat (const ParameterID& pid, const String& nm, float minValue, float maxValue, float def) : AudioParameterFloat (pid, nm, { minValue, maxValue, 0.01f }, def) { } @@ -85,7 +87,7 @@ AudioParameterFloat::~AudioParameterFloat() float AudioParameterFloat::getValue() const { return convertTo0to1 (value); } void AudioParameterFloat::setValue (float newValue) { value = convertFrom0to1 (newValue); valueChanged (get()); } -float AudioParameterFloat::getDefaultValue() const { return convertTo0to1 (defaultValue); } +float AudioParameterFloat::getDefaultValue() const { return convertTo0to1 (valueDefault); } int AudioParameterFloat::getNumSteps() const { return AudioProcessorParameterWithID::getNumSteps(); } String AudioParameterFloat::getText (float v, int length) const { return stringFromValueFunction (convertFrom0to1 (v), length); } float AudioParameterFloat::getValueForText (const String& text) const { return convertTo0to1 (valueFromStringFunction (text)); } diff --git a/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h b/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h index 59b058f9..c6adbe78 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h +++ b/modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,13 @@ namespace juce { +/** Properties of an AudioParameterFloat. + + @see AudioParameterFloat(), RangedAudioParameterAttributes() +*/ +class AudioParameterFloatAttributes : public RangedAudioParameterAttributes {}; + +//============================================================================== /** A subclass of AudioProcessorParameter that provides an easy way to create a parameter which maps onto a given NormalisableRange. @@ -37,6 +44,30 @@ namespace juce class JUCE_API AudioParameterFloat : public RangedAudioParameter { public: + /** Creates a AudioParameterFloat with the specified parameters. + + Note that the attributes argument is optional and only needs to be + supplied if you want to change options from their default values. + + Example usage: + @code + auto attributes = AudioParameterFloatAttributes().withStringFromValueFunction ([] (auto x, auto) { return String (x * 100); }) + .withLabel ("%"); + auto param = std::make_unique ("paramID", "Parameter Name", NormalisableRange(), 0.5f, attributes); + @endcode + + @param parameterID The parameter ID to use + @param parameterName The parameter name to use + @param normalisableRange The NormalisableRange to use + @param defaultValue The non-normalised default value + @param attributes Optional characteristics + */ + AudioParameterFloat (const ParameterID& parameterID, + const String& parameterName, + NormalisableRange normalisableRange, + float defaultValue, + const AudioParameterFloatAttributes& attributes = {}); + /** Creates a AudioParameterFloat with the specified parameters. @param parameterID The parameter ID to use @@ -52,22 +83,33 @@ public: converts it into a non-normalised value. Some hosts use this to allow users to type in parameter values. */ - AudioParameterFloat (const String& parameterID, + [[deprecated ("Prefer the signature taking an Attributes argument")]] + AudioParameterFloat (const ParameterID& parameterID, const String& parameterName, NormalisableRange normalisableRange, float defaultValue, - const String& parameterLabel = String(), + const String& parameterLabel, Category parameterCategory = AudioProcessorParameter::genericParameter, std::function stringFromValue = nullptr, - std::function valueFromString = nullptr); + std::function valueFromString = nullptr) + : AudioParameterFloat (parameterID, + parameterName, + std::move (normalisableRange), + defaultValue, + AudioParameterFloatAttributes().withLabel (parameterLabel) + .withCategory (parameterCategory) + .withStringFromValueFunction (std::move (stringFromValue)) + .withValueFromStringFunction (std::move (valueFromString))) + { + } /** Creates a AudioParameterFloat with an ID, name, and range. On creation, its value is set to the default value. For control over skew factors, you can use the other constructor and provide a NormalisableRange. */ - AudioParameterFloat (String parameterID, - String parameterName, + AudioParameterFloat (const ParameterID& parameterID, + const String& parameterName, float minValue, float maxValue, float defaultValue); @@ -106,7 +148,7 @@ private: float getValueForText (const String&) const override; std::atomic value; - const float defaultValue; + const float valueDefault; std::function stringFromValueFunction; std::function valueFromStringFunction; diff --git a/modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp b/modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp index e0b1f424..356ca036 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp +++ b/modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,33 +26,29 @@ namespace juce { -AudioParameterInt::AudioParameterInt (const String& idToUse, const String& nameToUse, +AudioParameterInt::AudioParameterInt (const ParameterID& idToUse, const String& nameToUse, int minValue, int maxValue, int def, - const String& labelToUse, - std::function stringFromInt, - std::function intFromString) - : RangedAudioParameter (idToUse, nameToUse, labelToUse), - range ([minValue, maxValue] - { - NormalisableRange rangeWithInterval { (float) minValue, (float) maxValue, - [] (float start, float end, float v) { return jlimit (start, end, v * (end - start) + start); }, - [] (float start, float end, float v) { return jlimit (0.0f, 1.0f, (v - start) / (end - start)); }, - [] (float start, float end, float v) { return (float) roundToInt (juce::jlimit (start, end, v)); } }; - rangeWithInterval.interval = 1.0f; - return rangeWithInterval; - }()), - value ((float) def), - defaultValue (convertTo0to1 ((float) def)), - stringFromIntFunction (stringFromInt), - intFromStringFunction (intFromString) + const AudioParameterIntAttributes& attributes) + : RangedAudioParameter (idToUse, nameToUse, attributes.getAudioProcessorParameterWithIDAttributes()), + range ([minValue, maxValue] + { + NormalisableRange rangeWithInterval { (float) minValue, (float) maxValue, + [] (float start, float end, float v) { return jlimit (start, end, v * (end - start) + start); }, + [] (float start, float end, float v) { return jlimit (0.0f, 1.0f, (v - start) / (end - start)); }, + [] (float start, float end, float v) { return (float) roundToInt (juce::jlimit (start, end, v)); } }; + rangeWithInterval.interval = 1.0f; + return rangeWithInterval; + }()), + value ((float) def), + defaultValue (convertTo0to1 ((float) def)), + stringFromIntFunction (attributes.getStringFromValueFunction() != nullptr + ? attributes.getStringFromValueFunction() + : [] (int v, int) { return String (v); }), + intFromStringFunction (attributes.getValueFromStringFunction() != nullptr + ? attributes.getValueFromStringFunction() + : [] (const String& text) { return text.getIntValue(); }) { jassert (minValue < maxValue); // must have a non-zero range of values! - - if (stringFromIntFunction == nullptr) - stringFromIntFunction = [] (int v, int) { return String (v); }; - - if (intFromStringFunction == nullptr) - intFromStringFunction = [] (const String& text) { return text.getIntValue(); }; } AudioParameterInt::~AudioParameterInt() diff --git a/modules/juce_audio_processors/utilities/juce_AudioParameterInt.h b/modules/juce_audio_processors/utilities/juce_AudioParameterInt.h index 6e969e79..965dac6a 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioParameterInt.h +++ b/modules/juce_audio_processors/utilities/juce_AudioParameterInt.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,13 @@ namespace juce { +/** Properties of an AudioParameterInt. + + @see AudioParameterInt(), RangedAudioParameterAttributes() +*/ +class AudioParameterIntAttributes : public RangedAudioParameterAttributes {}; + +//============================================================================== /** Provides a class of AudioProcessorParameter that can be used as an integer value with a given range. @@ -39,11 +46,37 @@ class JUCE_API AudioParameterInt : public RangedAudioParameter public: /** Creates a AudioParameterInt with the specified parameters. + Note that the attributes argument is optional and only needs to be + supplied if you want to change options from their default values. + + Example usage: + @code + auto attributes = AudioParameterIntAttributes().withStringFromValueFunction ([] (auto x, auto) { return String (x); }) + .withLabel ("things"); + auto param = std::make_unique ("paramID", "Parameter Name", 0, 100, 50, attributes); + @endcode + @param parameterID The parameter ID to use @param parameterName The parameter name to use @param minValue The minimum parameter value @param maxValue The maximum parameter value @param defaultValue The default value + @param attributes Optional characteristics + */ + AudioParameterInt (const ParameterID& parameterID, + const String& parameterName, + int minValue, + int maxValue, + int defaultValue, + const AudioParameterIntAttributes& attributes = {}); + + /** Creates a AudioParameterInt with the specified parameters. + + @param parameterID The parameter ID to use + @param parameterName The parameter name to use + @param minValue The minimum parameter value + @param maxValue The maximum parameter value + @param defaultValueIn The default value @param parameterLabel An optional label for the parameter's value @param stringFromInt An optional lambda function that converts a int value to a string with a maximum length. This may @@ -52,12 +85,25 @@ public: and converts it into an int. Some hosts use this to allow users to type in parameter values. */ - AudioParameterInt (const String& parameterID, const String& parameterName, - int minValue, int maxValue, - int defaultValue, - const String& parameterLabel = String(), + [[deprecated ("Prefer the signature taking an Attributes argument")]] + AudioParameterInt (const ParameterID& parameterID, + const String& parameterName, + int minValue, + int maxValue, + int defaultValueIn, + const String& parameterLabel, std::function stringFromInt = nullptr, - std::function intFromString = nullptr); + std::function intFromString = nullptr) + : AudioParameterInt (parameterID, + parameterName, + minValue, + maxValue, + defaultValueIn, + AudioParameterIntAttributes().withLabel (parameterLabel) + .withStringFromValueFunction (std::move (stringFromInt)) + .withValueFromStringFunction (std::move (intFromString))) + { + } /** Destructor. */ ~AudioParameterInt() override; diff --git a/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp b/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp index c8cb1081..848358d0 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp +++ b/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,12 +26,19 @@ namespace juce { -AudioProcessorParameterWithID::AudioProcessorParameterWithID (const String& idToUse, +AudioProcessorParameterWithID::AudioProcessorParameterWithID (const ParameterID& idToUse, const String& nameToUse, - const String& labelToUse, - AudioProcessorParameter::Category categoryToUse) - : paramID (idToUse), name (nameToUse), label (labelToUse), category (categoryToUse) {} -AudioProcessorParameterWithID::~AudioProcessorParameterWithID() {} + const AudioProcessorParameterWithIDAttributes& attributes) + : HostedAudioProcessorParameter (idToUse.getVersionHint()), + paramID (idToUse.getParamID()), + name (nameToUse), + label (attributes.getLabel()), + category (attributes.getCategory()), + meta (attributes.getMeta()), + automatable (attributes.getAutomatable()), + inverted (attributes.getInverted()) +{ +} String AudioProcessorParameterWithID::getName (int maximumStringLength) const { return name.substring (0, maximumStringLength); } String AudioProcessorParameterWithID::getLabel() const { return label; } diff --git a/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h b/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h index 6b26f61c..a75834c8 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h +++ b/modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,87 @@ namespace juce { +/** + Combines a parameter ID and a version hint. +*/ +class ParameterID +{ +public: + ParameterID() = default; + + /** Constructs an instance. + + Note that this constructor implicitly converts from Strings and string-like types. + + @param identifier A string that uniquely identifies a single parameter + @param versionHint Influences parameter ordering in Audio Unit plugins. + Used to provide backwards compatibility of Audio Unit plugins in + Logic and GarageBand. + @see AudioProcessorParameter(int) + */ + template > + ParameterID (StringLike&& identifier, int versionHint = 0) + : paramID (std::forward (identifier)), version (versionHint) {} + + /** @see AudioProcessorParameterWithID::paramID */ + auto getParamID() const { return paramID; } + + /** @see AudioProcessorParameter(int) */ + auto getVersionHint() const { return version; } + +private: + String paramID; + int version = 0; +}; + +/** + An instance of this class may be passed to the constructor of an AudioProcessorParameterWithID + to set optional characteristics of that parameter. +*/ +class AudioProcessorParameterWithIDAttributes +{ + using This = AudioProcessorParameterWithIDAttributes; + +public: + using Category = AudioProcessorParameter::Category; + + /** An optional label for the parameter's value */ + JUCE_NODISCARD auto withLabel (String x) const { return withMember (*this, &This::label, std::move (x)); } + + /** The semantics of this parameter */ + JUCE_NODISCARD auto withCategory (Category x) const { return withMember (*this, &This::category, std::move (x)); } + + /** @see AudioProcessorParameter::isMetaParameter() */ + JUCE_NODISCARD auto withMeta (bool x) const { return withMember (*this, &This::meta, std::move (x)); } + + /** @see AudioProcessorParameter::isAutomatable() */ + JUCE_NODISCARD auto withAutomatable (bool x) const { return withMember (*this, &This::automatable, std::move (x)); } + + /** @see AudioProcessorParameter::isOrientationInverted() */ + JUCE_NODISCARD auto withInverted (bool x) const { return withMember (*this, &This::inverted, std::move (x)); } + + /** An optional label for the parameter's value */ + JUCE_NODISCARD auto getLabel() const { return label; } + + /** The semantics of this parameter */ + JUCE_NODISCARD auto getCategory() const { return category; } + + /** @see AudioProcessorParameter::isMetaParameter() */ + JUCE_NODISCARD auto getMeta() const { return meta; } + + /** @see AudioProcessorParameter::isAutomatable() */ + JUCE_NODISCARD auto getAutomatable() const { return automatable; } + + /** @see AudioProcessorParameter::isOrientationInverted() */ + JUCE_NODISCARD auto getInverted() const { return inverted; } + +private: + String label; + Category category = AudioProcessorParameter::genericParameter; + bool meta = false, automatable = true, inverted = false; +}; + +//============================================================================== /** This abstract base class is used by some AudioProcessorParameter helper classes. @@ -36,16 +117,45 @@ namespace juce class JUCE_API AudioProcessorParameterWithID : public HostedAudioProcessorParameter { public: + /** The creation of this object requires providing a name and ID which will be constant for its lifetime. + + Given that AudioProcessorParameterWithID is abstract, you'll probably call this constructor + from a derived class constructor, e.g. + @code + MyParameterType (String paramID, String name, String label, bool automatable) + : AudioProcessorParameterWithID (paramID, name, AudioProcessorParameterWithIDAttributes().withLabel (label) + .withAutomatable (automatable)) + { + } + @endcode + + @param parameterID Specifies the identifier, and optionally the parameter's version hint. + @param parameterName The user-facing parameter name. + @param attributes Other parameter properties. + */ + AudioProcessorParameterWithID (const ParameterID& parameterID, + const String& parameterName, + const AudioProcessorParameterWithIDAttributes& attributes = {}); + /** The creation of this object requires providing a name and ID which will be constant for its lifetime. + + @param parameterID Used to uniquely identify the parameter + @param parameterName The user-facing name of the parameter + @param parameterLabel An optional label for the parameter's value + @param parameterCategory The semantics of this parameter */ - AudioProcessorParameterWithID (const String& parameterID, + [[deprecated ("Prefer the signature taking an Attributes argument")]] + AudioProcessorParameterWithID (const ParameterID& parameterID, const String& parameterName, - const String& parameterLabel = {}, - Category parameterCategory = AudioProcessorParameter::genericParameter); - - /** Destructor. */ - ~AudioProcessorParameterWithID() override; + const String& parameterLabel, + Category parameterCategory = AudioProcessorParameter::genericParameter) + : AudioProcessorParameterWithID (parameterID, + parameterName, + AudioProcessorParameterWithIDAttributes().withLabel (parameterLabel) + .withCategory (parameterCategory)) + { + } /** Provides access to the parameter's ID string. */ const String paramID; @@ -63,9 +173,14 @@ public: String getLabel() const override; Category getCategory() const override; - String getParameterID() const override { return paramID; } + String getParameterID() const override { return paramID; } + bool isMetaParameter() const override { return meta; } + bool isAutomatable() const override { return automatable; } + bool isOrientationInverted() const override { return inverted; } private: + bool meta = false, automatable = true, inverted = false; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorParameterWithID) }; diff --git a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp index bf4b5502..caf7eb79 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp +++ b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,40 +27,26 @@ namespace juce { //============================================================================== -AudioProcessorValueTreeState::Parameter::Parameter (const String& parameterID, + +AudioProcessorValueTreeState::Parameter::Parameter (const ParameterID& parameterID, const String& parameterName, - const String& labelText, NormalisableRange valueRange, float defaultParameterValue, - std::function valueToTextFunction, - std::function textToValueFunction, - bool isMetaParameter, - bool isAutomatableParameter, - bool isDiscrete, - AudioProcessorParameter::Category parameterCategory, - bool isBoolean) + const AudioProcessorValueTreeStateParameterAttributes& attributes) : AudioParameterFloat (parameterID, parameterName, valueRange, defaultParameterValue, - labelText, - parameterCategory, - valueToTextFunction == nullptr ? std::function() - : [valueToTextFunction] (float v, int) { return valueToTextFunction (v); }, - std::move (textToValueFunction)), + attributes.getAudioParameterFloatAttributes()), unsnappedDefault (valueRange.convertTo0to1 (defaultParameterValue)), - metaParameter (isMetaParameter), - automatable (isAutomatableParameter), - discrete (isDiscrete), - boolean (isBoolean) + discrete (attributes.getDiscrete()), + boolean (attributes.getBoolean()) { } float AudioProcessorValueTreeState::Parameter::getDefaultValue() const { return unsnappedDefault; } int AudioProcessorValueTreeState::Parameter::getNumSteps() const { return RangedAudioParameter::getNumSteps(); } -bool AudioProcessorValueTreeState::Parameter::isMetaParameter() const { return metaParameter; } -bool AudioProcessorValueTreeState::Parameter::isAutomatable() const { return automatable; } bool AudioProcessorValueTreeState::Parameter::isDiscrete() const { return discrete; } bool AudioProcessorValueTreeState::Parameter::isBoolean() const { return boolean; } @@ -303,18 +289,21 @@ RangedAudioParameter* AudioProcessorValueTreeState::createAndAddParameter (const AudioProcessorParameter::Category category, bool isBooleanParameter) { + auto attributes = AudioProcessorValueTreeStateParameterAttributes() + .withLabel (labelText) + .withStringFromValueFunction ([fn = std::move (valueToTextFunction)] (float v, int) { return fn (v); }) + .withValueFromStringFunction (std::move (textToValueFunction)) + .withMeta (isMetaParameter) + .withAutomatable (isAutomatableParameter) + .withDiscrete (isDiscreteParameter) + .withCategory (category) + .withBoolean (isBooleanParameter); + return createAndAddParameter (std::make_unique (paramID, paramName, - labelText, range, defaultVal, - std::move (valueToTextFunction), - std::move (textToValueFunction), - isMetaParameter, - isAutomatableParameter, - isDiscreteParameter, - category, - isBooleanParameter)); + std::move (attributes))); } RangedAudioParameter* AudioProcessorValueTreeState::createAndAddParameter (std::unique_ptr param) @@ -533,7 +522,7 @@ struct ParameterAdapterTests : public UnitTest { const auto test = [&] (NormalisableRange range, float value) { - AudioParameterFloat param ({}, {}, range, value, {}); + AudioParameterFloat param ({}, {}, range, value); AudioProcessorValueTreeState::ParameterAdapter adapter (param); @@ -548,7 +537,7 @@ struct ParameterAdapterTests : public UnitTest { const auto test = [&] (NormalisableRange range, float value) { - AudioParameterFloat param ({}, {}, range, {}, {}); + AudioParameterFloat param ({}, {}, range, {}); AudioProcessorValueTreeState::ParameterAdapter adapter (param); adapter.setDenormalisedValue (value); @@ -565,7 +554,7 @@ struct ParameterAdapterTests : public UnitTest { const auto test = [&] (NormalisableRange range, float value, String expected) { - AudioParameterFloat param ({}, {}, range, {}, {}); + AudioParameterFloat param ({}, {}, range, {}); AudioProcessorValueTreeState::ParameterAdapter adapter (param); expectEquals (adapter.getTextForDenormalisedValue (value), expected); @@ -581,7 +570,7 @@ struct ParameterAdapterTests : public UnitTest { const auto test = [&] (NormalisableRange range, String text, float expected) { - AudioParameterFloat param ({}, {}, range, {}, {}); + AudioParameterFloat param ({}, {}, range, {}); AudioProcessorValueTreeState::ParameterAdapter adapter (param); expectEquals (adapter.getDenormalisedValueForText (text), expected); @@ -621,6 +610,7 @@ private: using Parameter = AudioProcessorValueTreeState::Parameter; using ParameterGroup = AudioProcessorParameterGroup; using ParameterLayout = AudioProcessorValueTreeState::ParameterLayout; + using Attributes = AudioProcessorValueTreeStateParameterAttributes; class TestAudioProcessor : public AudioProcessor { @@ -677,8 +667,11 @@ public: { TestAudioProcessor proc; - proc.state.createAndAddParameter (std::make_unique (String(), String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + proc.state.createAndAddParameter (std::make_unique ( + String(), + String(), + NormalisableRange(), + 0.0f)); expectEquals (proc.getParameters().size(), 1); } @@ -688,8 +681,11 @@ public: TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f)); expect (proc.state.getParameter (key) == param); } @@ -721,8 +717,12 @@ public: TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr, true)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f, + Attributes().withMeta (true))); expect (param->isMetaParameter()); } @@ -732,8 +732,12 @@ public: TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr, false, true)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f, + Attributes().withAutomatable (true))); expect (param->isAutomatable()); } @@ -743,8 +747,12 @@ public: TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr, false, false, true)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f, + Attributes().withDiscrete (true))); expect (param->isDiscrete()); } @@ -754,9 +762,12 @@ public: TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr, false, false, false, - AudioProcessorParameter::Category::inputMeter)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f, + Attributes().withCategory (AudioProcessorParameter::Category::inputMeter))); expect (param->category == AudioProcessorParameter::Category::inputMeter); } @@ -766,9 +777,12 @@ public: TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr, false, false, false, - AudioProcessorParameter::Category::genericParameter, true)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f, + Attributes().withBoolean (true))); expect (param->isBoolean()); } @@ -788,11 +802,17 @@ public: { TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f)); - proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f)); expectEquals (proc.getParameters().size(), 1); expect (proc.getParameters().getFirst() == param); @@ -802,8 +822,11 @@ public: { TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f)); const auto value = 0.5f; param->setValueNotifyingHost (value); @@ -820,11 +843,8 @@ public: proc.state.createAndAddParameter (std::make_unique ( key, String(), - String(), NormalisableRange (0.0f, 100.0f, 10.0f), - value, - nullptr, - nullptr)); + value)); expectEquals (proc.state.getRawParameterValue (key)->load(), value); } @@ -834,8 +854,11 @@ public: Listener listener; TestAudioProcessor proc; const auto key = "id"; - const auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + const auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f)); proc.state.addParameterListener (key, &listener); const auto value = 0.5f; @@ -891,8 +914,11 @@ public: TestAudioProcessor proc; const auto key = "id"; const auto initialValue = 0.2f; - auto param = proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - initialValue, nullptr, nullptr)); + auto param = proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + initialValue)); proc.state.state = ValueTree { "state" }; auto value = proc.state.getParameterAsValue (key); @@ -926,8 +952,11 @@ public: Listener listener; TestAudioProcessor proc; const auto key = "id"; - proc.state.createAndAddParameter (std::make_unique (key, String(), String(), NormalisableRange(), - 0.0f, nullptr, nullptr)); + proc.state.createAndAddParameter (std::make_unique ( + key, + String(), + NormalisableRange(), + 0.0f)); proc.state.addParameterListener (key, &listener); proc.state.state = ValueTree { "state" }; diff --git a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h index e1125680..4c498f9b 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h +++ b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,60 @@ namespace juce { +/** Advanced properties of an AudioProcessorValueTreeState::Parameter. + + The members here have the same meaning as the similarly-named member functions of + AudioParameterFloatAttributes. + + @see AudioParameterFloatAttributes, RangedAudioParameterAttributes +*/ +class AudioProcessorValueTreeStateParameterAttributes +{ + using This = AudioProcessorValueTreeStateParameterAttributes; + using StringFromValue = AudioParameterFloatAttributes::StringFromValue; + using ValueFromString = AudioParameterFloatAttributes::ValueFromString; + using Category = AudioParameterFloatAttributes::Category; + +public: + /** @see RangedAudioParameterAttributes::withStringFromValueFunction() */ + JUCE_NODISCARD auto withStringFromValueFunction (StringFromValue x) const { return withMember (*this, &This::attributes, attributes.withStringFromValueFunction (std::move (x))); } + /** @see RangedAudioParameterAttributes::withValueFromStringFunction() */ + JUCE_NODISCARD auto withValueFromStringFunction (ValueFromString x) const { return withMember (*this, &This::attributes, attributes.withValueFromStringFunction (std::move (x))); } + /** @see RangedAudioParameterAttributes::withLabel() */ + JUCE_NODISCARD auto withLabel (String x) const { return withMember (*this, &This::attributes, attributes.withLabel (std::move (x))); } + /** @see RangedAudioParameterAttributes::withCategory() */ + JUCE_NODISCARD auto withCategory (Category x) const { return withMember (*this, &This::attributes, attributes.withCategory (std::move (x))); } + /** @see RangedAudioParameterAttributes::withMeta() */ + JUCE_NODISCARD auto withMeta (bool x) const { return withMember (*this, &This::attributes, attributes.withMeta (std::move (x))); } + /** @see RangedAudioParameterAttributes::withAutomatable() */ + JUCE_NODISCARD auto withAutomatable (bool x) const { return withMember (*this, &This::attributes, attributes.withAutomatable (std::move (x))); } + /** @see RangedAudioParameterAttributes::withInverted() */ + JUCE_NODISCARD auto withInverted (bool x) const { return withMember (*this, &This::attributes, attributes.withInverted (std::move (x))); } + + /** Pass 'true' if this parameter has discrete steps, or 'false' if the parameter is continuous. + + Using an AudioParameterChoice or AudioParameterInt might be a better choice than setting this flag. + */ + JUCE_NODISCARD auto withDiscrete (bool x) const { return withMember (*this, &This::discrete, std::move (x)); } + + /** Pass 'true' if this parameter only has two valid states. + + Using an AudioParameterBool might be a better choice than setting this flag. + */ + JUCE_NODISCARD auto withBoolean (bool x) const { return withMember (*this, &This::boolean, std::move (x)); } + + /** @returns all attributes that might also apply to an AudioParameterFloat */ + JUCE_NODISCARD const auto& getAudioParameterFloatAttributes() const { return attributes; } + /** @returns 'true' if this parameter has discrete steps, or 'false' if the parameter is continuous. */ + JUCE_NODISCARD const auto& getDiscrete() const { return discrete; } + /** @returns 'true' if this parameter only has two valid states. */ + JUCE_NODISCARD const auto& getBoolean() const { return boolean; } + +private: + AudioParameterFloatAttributes attributes; + bool discrete = false, boolean = false; +}; + /** This class contains a ValueTree that is used to manage an AudioProcessor's entire state. @@ -398,24 +452,65 @@ public: class Parameter final : public AudioParameterFloat { public: - Parameter (const String& parameterID, + /** Constructs a parameter instance. + + Example usage: + @code + using Parameter = AudioProcessorValueTreeState::Parameter; + using Attributes = AudioProcessorValueTreeStateParameterAttributes; + + auto parameter = std::make_unique (ParameterID { "uniqueID", 1 }, + "Name", + NormalisableRange { 0.0f, 100.0f }, + 50.0f, + Attributes().withStringFromValueFunction (myStringFromValueFunction) + .withValueFromStringFunction (myValueFromStringFunction) + .withLabel ("%")); + @endcode + + @param parameterID The globally-unique identifier of this parameter + @param parameterName The user-facing name of this parameter + @param valueRange The valid range of values for this parameter + @param defaultValue The initial parameter value + @param attributes Further advanced settings to customise the behaviour of this parameter + */ + Parameter (const ParameterID& parameterID, const String& parameterName, - const String& labelText, NormalisableRange valueRange, float defaultValue, + const AudioProcessorValueTreeStateParameterAttributes& attributes = {}); + + [[deprecated ("Prefer the signature taking an Attributes argument")]] + Parameter (const ParameterID& parameterID, + const String& parameterName, + const String& labelText, + NormalisableRange valueRange, + float defaultParameterValue, std::function valueToTextFunction, std::function textToValueFunction, bool isMetaParameter = false, bool isAutomatableParameter = true, bool isDiscrete = false, AudioProcessorParameter::Category parameterCategory = AudioProcessorParameter::genericParameter, - bool isBoolean = false); + bool isBoolean = false) + : Parameter (parameterID, + parameterName, + valueRange, + defaultParameterValue, + AudioProcessorValueTreeStateParameterAttributes().withLabel (labelText) + .withStringFromValueFunction ([valueToTextFunction] (float v, int) { return valueToTextFunction (v); }) + .withValueFromStringFunction (std::move (textToValueFunction)) + .withMeta (isMetaParameter) + .withAutomatable (isAutomatableParameter) + .withDiscrete (isDiscrete) + .withCategory (parameterCategory) + .withBoolean (isBoolean)) + { + } float getDefaultValue() const override; int getNumSteps() const override; - bool isMetaParameter() const override; - bool isAutomatable() const override; bool isDiscrete() const override; bool isBoolean() const override; @@ -425,7 +520,7 @@ public: std::function onValueChanged; const float unsnappedDefault; - const bool metaParameter, automatable, discrete, boolean; + const bool discrete, boolean; std::atomic lastValue { -1.0f }; friend class AudioProcessorValueTreeState::ParameterAdapter; diff --git a/modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h b/modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h index 1a56fcf2..dcf0ff8f 100644 --- a/modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h +++ b/modules/juce_audio_processors/utilities/juce_ExtensionsVisitor.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -37,7 +37,7 @@ namespace Steinberg #endif //============================================================================== -#if (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || (defined(AUDIOCOMPONENT_NOCARBONINSTANCES) && AUDIOCOMPONENT_NOCARBONINSTANCES) +#if TARGET_OS_IPHONE struct OpaqueAudioComponentInstance; typedef struct OpaqueAudioComponentInstance* AudioComponentInstance; #else @@ -113,6 +113,21 @@ struct ExtensionsVisitor virtual AEffect* getAEffectPtr() const noexcept = 0; }; + /** Can be used to retrieve information about a plugin that provides ARA extensions. */ + struct ARAClient + { + virtual ~ARAClient() = default; + virtual void createARAFactoryAsync (std::function) const = 0; + }; + + ExtensionsVisitor() = default; + + ExtensionsVisitor (const ExtensionsVisitor&) = default; + ExtensionsVisitor (ExtensionsVisitor&&) = default; + + ExtensionsVisitor& operator= (const ExtensionsVisitor&) = default; + ExtensionsVisitor& operator= (ExtensionsVisitor&&) = default; + virtual ~ExtensionsVisitor() = default; /** Will be called if there is no platform specific information available. */ @@ -126,6 +141,9 @@ struct ExtensionsVisitor /** Called with AU-specific information. */ virtual void visitAudioUnitClient (const AudioUnitClient&) {} + + /** Called with ARA-specific information. */ + virtual void visitARAClient (const ARAClient&) {} }; } // namespace juce diff --git a/modules/juce_audio_processors/utilities/juce_FlagCache.h b/modules/juce_audio_processors/utilities/juce_FlagCache.h new file mode 100644 index 00000000..cd808dcd --- /dev/null +++ b/modules/juce_audio_processors/utilities/juce_FlagCache.h @@ -0,0 +1,182 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#if ! DOXYGEN + +namespace juce +{ + +template +class FlagCache +{ + using FlagType = uint32_t; + +public: + FlagCache() = default; + + explicit FlagCache (size_t items) + : flags (divCeil (items, groupsPerWord)) + { + std::fill (flags.begin(), flags.end(), 0); + } + + void set (size_t index, FlagType bits) + { + const auto flagIndex = index / groupsPerWord; + jassert (flagIndex < flags.size()); + const auto groupIndex = index - (flagIndex * groupsPerWord); + flags[flagIndex].fetch_or (moveToGroupPosition (bits, groupIndex), std::memory_order_acq_rel); + } + + /* Calls the supplied callback for any entries with non-zero flags, and + sets all flags to zero. + */ + template + void ifSet (Callback&& callback) + { + for (size_t flagIndex = 0; flagIndex < flags.size(); ++flagIndex) + { + const auto prevFlags = flags[flagIndex].exchange (0, std::memory_order_acq_rel); + + for (size_t group = 0; group < groupsPerWord; ++group) + { + const auto masked = moveFromGroupPosition (prevFlags, group); + + if (masked != 0) + callback ((flagIndex * groupsPerWord) + group, masked); + } + } + } + + void clear() + { + std::fill (flags.begin(), flags.end(), 0); + } + +private: + /* Given the flags for a single item, and a group index, shifts the flags + so that they are positioned at the appropriate location for that group + index. + + e.g. If the flag type is a uint32_t, and there are 2 flags per item, + then each uint32_t will hold flags for 16 items. The flags for item 0 + are the least significant two bits; the flags for item 15 are the most + significant two bits. + */ + static constexpr FlagType moveToGroupPosition (FlagType ungrouped, size_t groupIndex) + { + return (ungrouped & groupMask) << (groupIndex * bitsPerFlagGroup); + } + + /* Given a set of grouped flags for multiple items, and a group index, + extracts the flags set for an item at that group index. + + e.g. If the flag type is a uint32_t, and there are 2 flags per item, + then each uint32_t will hold flags for 16 items. Asking for groupIndex + 0 will return the least significant two bits; asking for groupIndex 15 + will return the most significant two bits. + */ + static constexpr FlagType moveFromGroupPosition (FlagType grouped, size_t groupIndex) + { + return (grouped >> (groupIndex * bitsPerFlagGroup)) & groupMask; + } + + static constexpr size_t findNextPowerOfTwoImpl (size_t n, size_t shift) + { + return shift == 32 ? n : findNextPowerOfTwoImpl (n | (n >> shift), shift * 2); + } + + static constexpr size_t findNextPowerOfTwo (size_t value) + { + return findNextPowerOfTwoImpl (value - 1, 1) + 1; + } + + static constexpr size_t divCeil (size_t a, size_t b) + { + return (a / b) + ((a % b) != 0); + } + + static constexpr size_t bitsPerFlagGroup = findNextPowerOfTwo (requiredFlagBitsPerItem); + static constexpr size_t groupsPerWord = (8 * sizeof (FlagType)) / bitsPerFlagGroup; + static constexpr FlagType groupMask = ((FlagType) 1 << requiredFlagBitsPerItem) - 1; + + std::vector> flags; +}; + +template +class FlaggedFloatCache +{ +public: + FlaggedFloatCache() = default; + + explicit FlaggedFloatCache (size_t sizeIn) + : values (sizeIn), + flags (sizeIn) + { + std::fill (values.begin(), values.end(), 0.0f); + } + + size_t size() const noexcept { return values.size(); } + + void setValue (size_t index, float value) + { + jassert (index < size()); + values[index].store (value, std::memory_order_relaxed); + } + + void setBits (size_t index, uint32_t bits) { flags.set (index, bits); } + + void setValueAndBits (size_t index, float value, uint32_t bits) + { + setValue (index, value); + setBits (index, bits); + } + + float get (size_t index) const noexcept + { + jassert (index < size()); + return values[index].load (std::memory_order_relaxed); + } + + /* Calls the supplied callback for any entries which have been modified + since the last call to this function. + */ + template + void ifSet (Callback&& callback) + { + flags.ifSet ([this, &callback] (size_t groupIndex, uint32_t bits) + { + callback (groupIndex, values[groupIndex].load (std::memory_order_relaxed), bits); + }); + } + +private: + std::vector> values; + FlagCache flags; +}; + +} // namespace juce + +#endif diff --git a/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp b/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp new file mode 100644 index 00000000..b23e6398 --- /dev/null +++ b/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.cpp @@ -0,0 +1,66 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +static void removeScaleFactorListenerFromAllPeers (ComponentPeer::ScaleFactorListener& listener) +{ + for (int i = 0; i < ComponentPeer::getNumPeers(); ++i) + ComponentPeer::getPeer (i)->removeScaleFactorListener (&listener); +} + +NativeScaleFactorNotifier::NativeScaleFactorNotifier (Component* comp, std::function onScaleChanged) + : ComponentMovementWatcher (comp), + scaleChanged (std::move (onScaleChanged)) +{ + componentPeerChanged(); +} + +NativeScaleFactorNotifier::~NativeScaleFactorNotifier() +{ + removeScaleFactorListenerFromAllPeers (*this); +} + +void NativeScaleFactorNotifier::nativeScaleFactorChanged (double newScaleFactor) +{ + NullCheckedInvocation::invoke (scaleChanged, (float) newScaleFactor); +} + +void NativeScaleFactorNotifier::componentPeerChanged() +{ + removeScaleFactorListenerFromAllPeers (*this); + + if (auto* x = getComponent()) + peer = x->getPeer(); + + if (auto* x = peer) + { + x->addScaleFactorListener (this); + nativeScaleFactorChanged (x->getPlatformScaleFactor()); + } +} + +} // namespace juce diff --git a/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h b/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h new file mode 100644 index 00000000..a755fb2d --- /dev/null +++ b/modules/juce_audio_processors/utilities/juce_NativeScaleFactorNotifier.h @@ -0,0 +1,67 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +/** + Calls a function every time the native scale factor of a component's peer changes. + + This is used in the VST and VST3 wrappers to ensure that the editor's scale is kept in sync with + the scale of its containing component. +*/ +class NativeScaleFactorNotifier : private ComponentMovementWatcher, + private ComponentPeer::ScaleFactorListener +{ +public: + /** Constructs an instance. + + While the instance is alive, it will listen for changes to the scale factor of the + comp's peer, and will call onScaleChanged whenever this scale factor changes. + + @param comp The component to observe + @param onScaleChanged A function that will be called when the backing scale factor changes + */ + NativeScaleFactorNotifier (Component* comp, std::function onScaleChanged); + ~NativeScaleFactorNotifier() override; + +private: + void nativeScaleFactorChanged (double newScaleFactor) override; + void componentPeerChanged() override; + + using ComponentMovementWatcher::componentVisibilityChanged; + void componentVisibilityChanged() override {} + + using ComponentMovementWatcher::componentMovedOrResized; + void componentMovedOrResized (bool, bool) override {} + + ComponentPeer* peer = nullptr; + std::function scaleChanged; + + JUCE_DECLARE_NON_COPYABLE (NativeScaleFactorNotifier) + JUCE_DECLARE_NON_MOVEABLE (NativeScaleFactorNotifier) +}; + +} // namespace juce diff --git a/modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp b/modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp index 24ee3c1d..73edfe01 100644 --- a/modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp +++ b/modules/juce_audio_processors/utilities/juce_ParameterAttachments.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/utilities/juce_ParameterAttachments.h b/modules/juce_audio_processors/utilities/juce_ParameterAttachments.h index 6079df66..c86cd469 100644 --- a/modules/juce_audio_processors/utilities/juce_ParameterAttachments.h +++ b/modules/juce_audio_processors/utilities/juce_ParameterAttachments.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp b/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp index 6f38cb8c..6651bddf 100644 --- a/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp +++ b/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/utilities/juce_PluginHostType.h b/modules/juce_audio_processors/utilities/juce_PluginHostType.h index a11bc52d..c222899f 100644 --- a/modules/juce_audio_processors/utilities/juce_PluginHostType.h +++ b/modules/juce_audio_processors/utilities/juce_PluginHostType.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp b/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp index 99226e49..7e2d6aca 100644 --- a/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp +++ b/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,14 +26,6 @@ namespace juce { -RangedAudioParameter::RangedAudioParameter (const String& parameterID, - const String& parameterName, - const String& parameterLabel, - Category parameterCategory) - : AudioProcessorParameterWithID (parameterID, parameterName, parameterLabel, parameterCategory) -{ -} - int RangedAudioParameter::getNumSteps() const { const auto& range = getNormalisableRange(); diff --git a/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h b/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h index 30695fea..1fad305d 100644 --- a/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h +++ b/modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,67 @@ namespace juce { +/** + @internal + + Holds common attributes of audio parameters. + + CRTP is used here because we want the Attributes types for each parameter + (Float, Bool, Choice, Int) to be distinct and extensible in the future. + i.e. the identifiers AudioParameterFloatAttributes and RangedAudioParameterAttributes + should not be interchangable because we might need to add float-specific attributes in + the future. Users should not refer directly to RangedAudioParameterAttributes. +*/ +template +class RangedAudioParameterAttributes +{ + using This = RangedAudioParameterAttributes; + +public: + using Category = AudioProcessorParameter::Category; + + using StringFromValue = std::function; + using ValueFromString = std::function; + + /** An optional lambda function that converts a non-normalised value to a string with a maximum length. This may be used by hosts to display the parameter's value. */ + JUCE_NODISCARD auto withStringFromValueFunction (StringFromValue x) const { return withMember (asDerived(), &Derived::stringFromValue, std::move (x)); } + + /** An optional lambda function that parses a string and converts it into a non-normalised value. Some hosts use this to allow users to type in parameter values. */ + JUCE_NODISCARD auto withValueFromStringFunction (ValueFromString x) const { return withMember (asDerived(), &Derived::valueFromString, std::move (x)); } + + /** See AudioProcessorParameterWithIDAttributes::withLabel() */ + JUCE_NODISCARD auto withLabel (String x) const { return withMember (asDerived(), &Derived::attributes, attributes.withLabel (std::move (x))); } + + /** See AudioProcessorParameterWithIDAttributes::withCategory() */ + JUCE_NODISCARD auto withCategory (Category x) const { return withMember (asDerived(), &Derived::attributes, attributes.withCategory (std::move (x))); } + + /** See AudioProcessorParameter::isMetaParameter() */ + JUCE_NODISCARD auto withMeta (bool x) const { return withMember (asDerived(), &Derived::attributes, attributes.withMeta (std::move (x))); } + + /** See AudioProcessorParameter::isAutomatable() */ + JUCE_NODISCARD auto withAutomatable (bool x) const { return withMember (asDerived(), &Derived::attributes, attributes.withAutomatable (std::move (x))); } + + /** See AudioProcessorParameter::isOrientationInverted() */ + JUCE_NODISCARD auto withInverted (bool x) const { return withMember (asDerived(), &Derived::attributes, attributes.withInverted (std::move (x))); } + + /** An optional lambda function that converts a non-normalised value to a string with a maximum length. This may be used by hosts to display the parameter's value. */ + JUCE_NODISCARD const auto& getStringFromValueFunction() const { return stringFromValue; } + + /** An optional lambda function that parses a string and converts it into a non-normalised value. Some hosts use this to allow users to type in parameter values. */ + JUCE_NODISCARD const auto& getValueFromStringFunction() const { return valueFromString; } + + /** Gets attributes that would also apply to an AudioProcessorParameterWithID */ + JUCE_NODISCARD const auto& getAudioProcessorParameterWithIDAttributes() const { return attributes; } + +private: + auto& asDerived() const { return *static_cast (this); } + + AudioProcessorParameterWithIDAttributes attributes; + StringFromValue stringFromValue; + ValueFromString valueFromString; +}; + +//============================================================================== /** This abstract base class is used by some AudioProcessorParameter helper classes. @@ -36,13 +97,7 @@ namespace juce class JUCE_API RangedAudioParameter : public AudioProcessorParameterWithID { public: - /** The creation of this object requires providing a name and ID which will be - constant for its lifetime. - */ - RangedAudioParameter (const String& parameterID, - const String& parameterName, - const String& parameterLabel = {}, - Category parameterCategory = AudioProcessorParameter::genericParameter); + using AudioProcessorParameterWithID::AudioProcessorParameterWithID; /** Returns the range of values that the parameter can take. */ virtual const NormalisableRange& getNormalisableRange() const = 0; diff --git a/modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h b/modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h index bb232b9a..9d70828f 100644 --- a/modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h +++ b/modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h b/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h index ffc18bd2..d5a4ea5e 100644 --- a/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h +++ b/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h b/modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h index 2d82d3a6..41135b95 100644 --- a/modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h +++ b/modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp b/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp index 78f193e2..650ad87d 100644 --- a/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp +++ b/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h b/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h index 11ec8046..d616a33b 100644 --- a/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h +++ b/modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp b/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp index a6a2177c..dfc56942 100644 --- a/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp +++ b/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_AudioAppComponent.h b/modules/juce_audio_utils/gui/juce_AudioAppComponent.h index 5d3f2d70..54b6c19a 100644 --- a/modules/juce_audio_utils/gui/juce_AudioAppComponent.h +++ b/modules/juce_audio_utils/gui/juce_AudioAppComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp b/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp index 2e8227f5..3ffc4438 100644 --- a/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp +++ b/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -1051,7 +1051,6 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager& deviceManager.addChangeListener (this); updateAllControls(); - startTimer (1000); } AudioDeviceSelectorComponent::~AudioDeviceSelectorComponent() @@ -1105,16 +1104,6 @@ void AudioDeviceSelectorComponent::resized() setSize (getWidth(), r.getY()); } -void AudioDeviceSelectorComponent::timerCallback() -{ - // TODO - // unfortunately, the AudioDeviceManager only gives us changeListenerCallbacks - // if an audio device has changed, but not if a MIDI device has changed. - // This needs to be implemented properly. Until then, we use a workaround - // where we update the whole component once per second on a timer callback. - updateAllControls(); -} - void AudioDeviceSelectorComponent::updateDeviceType() { if (auto* type = deviceManager.getAvailableDeviceTypes() [deviceTypeDropDown->getSelectedId() - 1]) diff --git a/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h b/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h index 742d51cc..8ab2e07d 100644 --- a/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h +++ b/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -38,8 +38,7 @@ namespace juce @tags{Audio} */ class JUCE_API AudioDeviceSelectorComponent : public Component, - private ChangeListener, - private Timer + private ChangeListener { public: //============================================================================== @@ -92,7 +91,6 @@ public: private: //============================================================================== - void timerCallback() override; void handleBluetoothButton(); void updateDeviceType(); void updateMidiOutput(); diff --git a/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp b/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp index 0f31f615..4f0e5a2d 100644 --- a/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp +++ b/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_AudioThumbnail.h b/modules/juce_audio_utils/gui/juce_AudioThumbnail.h index 5482c965..ca912c89 100644 --- a/modules/juce_audio_utils/gui/juce_AudioThumbnail.h +++ b/modules/juce_audio_utils/gui/juce_AudioThumbnail.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h b/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h index 6c0d5727..76d372e9 100644 --- a/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h +++ b/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp b/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp index 8685fb97..4900cc48 100644 --- a/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp +++ b/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h b/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h index 0a574314..bd8626e6 100644 --- a/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h +++ b/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp b/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp index 5bf3af77..fe12591f 100644 --- a/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp +++ b/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h b/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h index 7f4a69e0..28cd33fe 100644 --- a/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h +++ b/modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h b/modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h index 57e62897..b70e4c27 100644 --- a/modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h +++ b/modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp b/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp index 2f69beb2..64db4b60 100644 --- a/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp +++ b/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h b/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h index 0dd0424e..67ff0c5e 100644 --- a/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h +++ b/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp b/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp index 4fd86217..f6121c3c 100644 --- a/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp +++ b/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h b/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h index 57c9e712..e070fcdb 100644 --- a/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h +++ b/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp b/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp index babea008..be3ff67d 100644 --- a/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp +++ b/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h b/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h index 998ab43a..70dedb68 100644 --- a/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h +++ b/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/juce_audio_utils.cpp b/modules/juce_audio_utils/juce_audio_utils.cpp index 51425409..1afb4d11 100644 --- a/modules/juce_audio_utils/juce_audio_utils.cpp +++ b/modules/juce_audio_utils/juce_audio_utils.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/juce_audio_utils.h b/modules/juce_audio_utils/juce_audio_utils.h index 7eab5d0e..84aa0f7c 100644 --- a/modules/juce_audio_utils/juce_audio_utils.h +++ b/modules/juce_audio_utils/juce_audio_utils.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_audio_utils vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE extra audio utility classes description: Classes for audio-related GUI and miscellaneous tasks. website: http://www.juce.com/juce diff --git a/modules/juce_audio_utils/juce_audio_utils.mm b/modules/juce_audio_utils/juce_audio_utils.mm index 436d9c5e..c1c509d5 100644 --- a/modules/juce_audio_utils/juce_audio_utils.mm +++ b/modules/juce_audio_utils/juce_audio_utils.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp b/modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp index cc143151..4cbea0a0 100644 --- a/modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp +++ b/modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm b/modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm index dc81694f..2eebd944 100644 --- a/modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm +++ b/modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp b/modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp index c6fba8e2..a653858d 100644 --- a/modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp +++ b/modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp b/modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp index aee48e37..c14db813 100644 --- a/modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp +++ b/modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm b/modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm index 20301545..3642c5a1 100644 --- a/modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm +++ b/modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm b/modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm index cea8dcaf..9b5ee4e6 100644 --- a/modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm +++ b/modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm b/modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm index d1debbb0..b489af90 100644 --- a/modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm +++ b/modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,7 +27,7 @@ namespace juce { //============================================================================== -class BluetoothMidiPairingWindowClass : public ObjCClass +class API_AVAILABLE (macos (10.11)) BluetoothMidiPairingWindowClass : public ObjCClass { public: struct Callbacks @@ -117,7 +117,7 @@ private: } }; -class BluetoothMidiSelectorWindowHelper : public DeletedAtShutdown +class API_AVAILABLE (macos (10.11)) BluetoothMidiSelectorWindowHelper : public DeletedAtShutdown { public: BluetoothMidiSelectorWindowHelper (ModalComponentManager::Callback* exitCallback, diff --git a/modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp b/modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp index 9a84abd6..fa634f56 100644 --- a/modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp +++ b/modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp b/modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp index 0d50a35b..f1e00439 100644 --- a/modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp +++ b/modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp b/modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp index 5421dcc0..5a4469e8 100644 --- a/modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp +++ b/modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp b/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp index 23c6b0e3..bb1c5580 100644 --- a/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp +++ b/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -171,6 +171,8 @@ void AudioProcessorPlayer::setProcessor (AudioProcessor* const processorToPlay) if (processor == processorToPlay) return; + sampleCount = 0; + if (processorToPlay != nullptr && sampleRate > 0 && blockSize > 0) { defaultProcessorChannels = NumChannels { processorToPlay->getBusesLayout() }; @@ -233,11 +235,12 @@ void AudioProcessorPlayer::setMidiOutput (MidiOutput* midiOutputToUse) } //============================================================================== -void AudioProcessorPlayer::audioDeviceIOCallback (const float** const inputChannelData, - const int numInputChannels, - float** const outputChannelData, - const int numOutputChannels, - const int numSamples) +void AudioProcessorPlayer::audioDeviceIOCallbackWithContext (const float** const inputChannelData, + const int numInputChannels, + float** const outputChannelData, + const int numOutputChannels, + const int numSamples, + const AudioIODeviceCallbackContext& context) { const ScopedLock sl (lock); @@ -266,6 +269,49 @@ void AudioProcessorPlayer::audioDeviceIOCallback (const float** const inputChann const ScopedLock sl2 (processor->getCallbackLock()); + class PlayHead : private AudioPlayHead + { + public: + PlayHead (AudioProcessor& proc, + Optional hostTimeIn, + uint64_t sampleCountIn, + double sampleRateIn) + : processor (proc), + hostTimeNs (hostTimeIn), + sampleCount (sampleCountIn), + seconds ((double) sampleCountIn / sampleRateIn) + { + processor.setPlayHead (this); + } + + ~PlayHead() override + { + processor.setPlayHead (nullptr); + } + + private: + Optional getPosition() const override + { + PositionInfo info; + info.setHostTimeNs (hostTimeNs); + info.setTimeInSamples ((int64_t) sampleCount); + info.setTimeInSeconds (seconds); + return info; + } + + AudioProcessor& processor; + Optional hostTimeNs; + uint64_t sampleCount; + double seconds; + }; + + PlayHead playHead { *processor, + context.hostTimeNs != nullptr ? makeOptional (*context.hostTimeNs) : nullopt, + sampleCount, + sampleRate }; + + sampleCount += (uint64_t) numSamples; + if (! processor->isSuspended()) { if (processor->isUsingDoublePrecision()) diff --git a/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h b/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h index b078518a..8f14d52e 100644 --- a/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h +++ b/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -92,7 +92,7 @@ public: //============================================================================== /** @internal */ - void audioDeviceIOCallback (const float**, int, float**, int, int) override; + void audioDeviceIOCallbackWithContext (const float**, int, float**, int, int, const AudioIODeviceCallbackContext&) override; /** @internal */ void audioDeviceAboutToStart (AudioIODevice*) override; /** @internal */ @@ -137,6 +137,7 @@ private: MidiBuffer incomingMidi; MidiMessageCollector messageCollector; MidiOutput* midiOutput = nullptr; + uint64_t sampleCount = 0; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorPlayer) }; diff --git a/modules/juce_audio_utils/players/juce_SoundPlayer.cpp b/modules/juce_audio_utils/players/juce_SoundPlayer.cpp index 6b5bfbd5..3426fa3b 100644 --- a/modules/juce_audio_utils/players/juce_SoundPlayer.cpp +++ b/modules/juce_audio_utils/players/juce_SoundPlayer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_utils/players/juce_SoundPlayer.h b/modules/juce_audio_utils/players/juce_SoundPlayer.h index a985d5fa..e4c36aca 100644 --- a/modules/juce_audio_utils/players/juce_SoundPlayer.h +++ b/modules/juce_audio_utils/players/juce_SoundPlayer.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_box2d/juce_box2d.cpp b/modules/juce_box2d/juce_box2d.cpp index fdb2dd19..c73151e3 100644 --- a/modules/juce_box2d/juce_box2d.cpp +++ b/modules/juce_box2d/juce_box2d.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -42,7 +42,8 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wconversion", "-Wswitch-enum", "-Wswitch-default", "-Wunused-but-set-variable", - "-Wzero-as-null-pointer-constant") + "-Wzero-as-null-pointer-constant", + "-Wmaybe-uninitialized") #include diff --git a/modules/juce_box2d/juce_box2d.h b/modules/juce_box2d/juce_box2d.h index 2b93878f..03fd437b 100644 --- a/modules/juce_box2d/juce_box2d.h +++ b/modules/juce_box2d/juce_box2d.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_box2d vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE wrapper for the Box2D physics engine description: The Box2D physics engine and some utility classes. website: http://www.juce.com/juce @@ -59,7 +59,8 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wconversion", "-Wshadow-field", "-Wzero-as-null-pointer-constant", "-Wsign-conversion", - "-Wdeprecated") + "-Wdeprecated", + "-Wmaybe-uninitialized") #include #include diff --git a/modules/juce_box2d/utils/juce_Box2DRenderer.cpp b/modules/juce_box2d/utils/juce_Box2DRenderer.cpp index 3724f87d..baec90fd 100644 --- a/modules/juce_box2d/utils/juce_Box2DRenderer.cpp +++ b/modules/juce_box2d/utils/juce_Box2DRenderer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_box2d/utils/juce_Box2DRenderer.h b/modules/juce_box2d/utils/juce_Box2DRenderer.h index 6c5731ae..1593cf49 100644 --- a/modules/juce_box2d/utils/juce_Box2DRenderer.h +++ b/modules/juce_box2d/utils/juce_Box2DRenderer.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_core/containers/juce_AbstractFifo.cpp b/modules/juce_core/containers/juce_AbstractFifo.cpp index ec7871a6..916ece51 100644 --- a/modules/juce_core/containers/juce_AbstractFifo.cpp +++ b/modules/juce_core/containers/juce_AbstractFifo.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_AbstractFifo.h b/modules/juce_core/containers/juce_AbstractFifo.h index 0cb31ae9..9e4ddede 100644 --- a/modules/juce_core/containers/juce_AbstractFifo.h +++ b/modules/juce_core/containers/juce_AbstractFifo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_Array.h b/modules/juce_core/containers/juce_Array.h index 065496e5..05f95799 100644 --- a/modules/juce_core/containers/juce_Array.h +++ b/modules/juce_core/containers/juce_Array.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -829,9 +829,10 @@ public: If the item isn't found, no action is taken. @param valueToRemove the object to try to remove + @returns the index of the removed item, or -1 if the item isn't found @see remove, removeRange, removeIf */ - void removeFirstMatchingValue (ParameterType valueToRemove) + int removeFirstMatchingValue (ParameterType valueToRemove) { const ScopedLockType lock (getLock()); auto* e = values.begin(); @@ -841,9 +842,11 @@ public: if (valueToRemove == e[i]) { removeInternal (i); - break; + return i; } } + + return -1; } /** Removes items from the array. diff --git a/modules/juce_core/containers/juce_ArrayAllocationBase.h b/modules/juce_core/containers/juce_ArrayAllocationBase.h index 7bba949c..51de01fb 100644 --- a/modules/juce_core/containers/juce_ArrayAllocationBase.h +++ b/modules/juce_core/containers/juce_ArrayAllocationBase.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_ArrayBase.cpp b/modules/juce_core/containers/juce_ArrayBase.cpp index 998a9078..1553e05b 100644 --- a/modules/juce_core/containers/juce_ArrayBase.cpp +++ b/modules/juce_core/containers/juce_ArrayBase.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_ArrayBase.h b/modules/juce_core/containers/juce_ArrayBase.h index c6a55fe1..515bf0f2 100644 --- a/modules/juce_core/containers/juce_ArrayBase.h +++ b/modules/juce_core/containers/juce_ArrayBase.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_DynamicObject.cpp b/modules/juce_core/containers/juce_DynamicObject.cpp index e8d1289d..54488458 100644 --- a/modules/juce_core/containers/juce_DynamicObject.cpp +++ b/modules/juce_core/containers/juce_DynamicObject.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_DynamicObject.h b/modules/juce_core/containers/juce_DynamicObject.h index df68c529..e9c090dc 100644 --- a/modules/juce_core/containers/juce_DynamicObject.h +++ b/modules/juce_core/containers/juce_DynamicObject.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_ElementComparator.h b/modules/juce_core/containers/juce_ElementComparator.h index 3346730f..5bf7d5e1 100644 --- a/modules/juce_core/containers/juce_ElementComparator.h +++ b/modules/juce_core/containers/juce_ElementComparator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -35,12 +35,14 @@ template struct SortFunctionConverter { SortFunctionConverter (ElementComparator& e) : comparator (e) {} + SortFunctionConverter (const SortFunctionConverter&) = default; template bool operator() (Type a, Type b) { return comparator.compareElements (a, b) < 0; } private: ElementComparator& comparator; + SortFunctionConverter& operator= (const SortFunctionConverter&) = delete; }; diff --git a/modules/juce_core/containers/juce_HashMap.h b/modules/juce_core/containers/juce_HashMap.h index 72a55555..53414156 100644 --- a/modules/juce_core/containers/juce_HashMap.h +++ b/modules/juce_core/containers/juce_HashMap.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_HashMap_test.cpp b/modules/juce_core/containers/juce_HashMap_test.cpp index 011a0b21..a95ffa14 100644 --- a/modules/juce_core/containers/juce_HashMap_test.cpp +++ b/modules/juce_core/containers/juce_HashMap_test.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_LinkedListPointer.h b/modules/juce_core/containers/juce_LinkedListPointer.h index 1fc5c791..379e2411 100644 --- a/modules/juce_core/containers/juce_LinkedListPointer.h +++ b/modules/juce_core/containers/juce_LinkedListPointer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_ListenerList.cpp b/modules/juce_core/containers/juce_ListenerList.cpp new file mode 100644 index 00000000..a7c9dd8d --- /dev/null +++ b/modules/juce_core/containers/juce_ListenerList.cpp @@ -0,0 +1,321 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +#if JUCE_UNIT_TESTS + +class ListenerListTests : public UnitTest +{ +public: + //============================================================================== + class TestListener + { + public: + explicit TestListener (std::function cb) : callback (std::move (cb)) {} + + void doCallback() + { + ++numCalls; + callback(); + } + + int getNumCalls() const { return numCalls; } + + private: + int numCalls = 0; + std::function callback; + }; + + class TestObject + { + public: + void addListener (std::function cb) + { + listeners.push_back (std::make_unique (std::move (cb))); + listenerList.add (listeners.back().get()); + } + + void removeListener (int i) { listenerList.remove (listeners[(size_t) i].get()); } + + void callListeners() + { + ++callLevel; + listenerList.call ([] (auto& l) { l.doCallback(); }); + --callLevel; + } + + int getNumListeners() const { return (int) listeners.size(); } + + auto& getListener (int i) { return *listeners[(size_t) i]; } + + int getCallLevel() const + { + return callLevel; + } + + bool wereAllNonRemovedListenersCalled (int numCalls) const + { + return std::all_of (std::begin (listeners), + std::end (listeners), + [&] (auto& listener) + { + return (! listenerList.contains (listener.get())) || listener->getNumCalls() == numCalls; + }); + } + + private: + std::vector> listeners; + ListenerList listenerList; + int callLevel = 0; + }; + + //============================================================================== + ListenerListTests() : UnitTest ("ListenerList", UnitTestCategories::containers) {} + + void runTest() override + { + // This is a test that the pre-iterator adjustment implementation should pass too + beginTest ("All non-removed listeners should be called - removing an already called listener"); + { + TestObject test; + + for (int i = 0; i < 20; ++i) + { + test.addListener ([i, &test] + { + if (i == 5) + test.removeListener (6); + }); + } + + test.callListeners(); + expect (test.wereAllNonRemovedListenersCalled (1)); + } + + // Iterator adjustment is necessary for passing this + beginTest ("All non-removed listeners should be called - removing a yet uncalled listener"); + { + TestObject test; + + for (int i = 0; i < 20; ++i) + { + test.addListener ([i, &test] + { + if (i == 5) + test.removeListener (4); + }); + } + + test.callListeners(); + expect (test.wereAllNonRemovedListenersCalled (1)); + } + + // This test case demonstrates why we have to call --it.index instead of it.next() + beginTest ("All non-removed listeners should be called - one callback removes multiple listeners"); + { + TestObject test; + + for (int i = 0; i < 20; ++i) + { + test.addListener ([i, &test] + { + if (i == 19) + { + test.removeListener (19); + test.removeListener (0); + } + }); + } + + test.callListeners(); + expect (test.wereAllNonRemovedListenersCalled (1)); + } + + beginTest ("All non-removed listeners should be called - removing listeners randomly"); + { + auto random = getRandom(); + + for (auto run = 0; run < 10; ++run) + { + const auto numListeners = random.nextInt ({ 10, 100 }); + const auto listenersThatRemoveListeners = chooseUnique (random, + numListeners, + random.nextInt ({ 0, numListeners / 2 })); + + // The listener in position [key] should remove listeners in [value] + std::map> removals; + + for (auto i : listenersThatRemoveListeners) + { + // Random::nextInt ({1, 1}); triggers an assertion + removals[i] = chooseUnique (random, + numListeners, + random.nextInt ({ 1, std::max (2, numListeners / 10) })); + } + + TestObject test; + + for (int i = 0; i < numListeners; ++i) + { + test.addListener ([i, &removals, &test] + { + const auto iter = removals.find (i); + + if (iter == removals.end()) + return; + + for (auto j : iter->second) + { + test.removeListener (j); + } + }); + } + + test.callListeners(); + expect (test.wereAllNonRemovedListenersCalled (1)); + } + } + + // Iterator adjustment is not necessary for passing this + beginTest ("All non-removed listeners should be called - add listener during iteration"); + { + TestObject test; + const auto numStartingListeners = 20; + + for (int i = 0; i < numStartingListeners; ++i) + { + test.addListener ([i, &test] + { + if (i == 5 || i == 6) + test.addListener ([] {}); + }); + } + + test.callListeners(); + + // Only the Listeners added before the test can be expected to have been called + bool success = true; + + for (int i = 0; i < numStartingListeners; ++i) + success = success && test.getListener (i).getNumCalls() == 1; + + // Listeners added during the iteration must not be called in that iteration + for (int i = numStartingListeners; i < test.getNumListeners(); ++i) + success = success && test.getListener (i).getNumCalls() == 0; + + expect (success); + } + + beginTest ("All non-removed listeners should be called - nested ListenerList::call()"); + { + TestObject test; + + for (int i = 0; i < 20; ++i) + { + test.addListener ([i, &test] + { + const auto callLevel = test.getCallLevel(); + + if (i == 6 && callLevel == 1) + { + test.callListeners(); + } + + if (i == 5) + { + if (callLevel == 1) + test.removeListener (4); + else if (callLevel == 2) + test.removeListener (6); + } + }); + } + + test.callListeners(); + expect (test.wereAllNonRemovedListenersCalled (2)); + } + + beginTest ("All non-removed listeners should be called - random ListenerList::call()"); + { + const auto numListeners = 20; + auto random = getRandom(); + + for (int run = 0; run < 10; ++run) + { + TestObject test; + auto numCalls = 0; + + auto listenersToRemove = chooseUnique (random, numListeners, numListeners / 2); + + for (int i = 0; i < numListeners; ++i) + { + // Capturing numListeners is a warning on MacOS, not capturing it is an error on Windows + test.addListener ([&] + { + const auto callLevel = test.getCallLevel(); + + if (callLevel < 4 && random.nextFloat() < 0.05f) + { + ++numCalls; + test.callListeners(); + } + + if (random.nextFloat() < 0.5f) + { + const auto listenerToRemove = random.nextInt ({ 0, numListeners }); + + if (listenersToRemove.erase (listenerToRemove) > 0) + test.removeListener (listenerToRemove); + } + }); + } + + while (listenersToRemove.size() > 0) + { + test.callListeners(); + ++numCalls; + } + + expect (test.wereAllNonRemovedListenersCalled (numCalls)); + } + } + } + +private: + static std::set chooseUnique (Random& random, int max, int numChosen) + { + std::set result; + + while ((int) result.size() < numChosen) + result.insert (random.nextInt ({ 0, max })); + + return result; + } +}; + +static ListenerListTests listenerListTests; + +#endif + +} // namespace juce diff --git a/modules/juce_core/containers/juce_ListenerList.h b/modules/juce_core/containers/juce_ListenerList.h index bcfce075..595e3779 100644 --- a/modules/juce_core/containers/juce_ListenerList.h +++ b/modules/juce_core/containers/juce_ListenerList.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -47,10 +47,11 @@ namespace juce listeners.call ([] (MyListenerType& l) { l.myCallbackMethod (1234, true); }); @endcode - If you add or remove listeners from the list during one of the callbacks - i.e. while - it's in the middle of iterating the listeners, then it's guaranteed that no listeners - will be mistakenly called after they've been removed, but it may mean that some of the - listeners could be called more than once, or not at all, depending on the list's order. + It is guaranteed that every Listener is called during an iteration if it's inside the + ListenerList before the iteration starts and isn't removed until its end. This guarantee + holds even if some Listeners are removed or new ones are added during the iteration. + + Listeners added during an iteration are guaranteed to be not called in that iteration. Sometimes, there's a chance that invoking one of the callbacks might result in the list itself being deleted while it's still iterating - to survive this situation, you can @@ -73,7 +74,13 @@ public: ListenerList() = default; /** Destructor. */ - ~ListenerList() = default; + ~ListenerList() + { + WrappedIterator::forEach (activeIterators, [&] (auto& iter) + { + iter.invalidate(); + }); + } //============================================================================== /** Adds a listener to the list. @@ -95,7 +102,16 @@ public: void remove (ListenerClass* listenerToRemove) { jassert (listenerToRemove != nullptr); // Listeners can't be null pointers! - listeners.removeFirstMatchingValue (listenerToRemove); + + typename ArrayType::ScopedLockType lock (listeners.getLock()); + + const auto index = listeners.removeFirstMatchingValue (listenerToRemove); + + WrappedIterator::forEach (activeIterators, [&] (auto& iter) + { + if (0 <= index && index < iter.get().index) + --iter.get().index; + }); } /** Returns the number of registered listeners. */ @@ -120,8 +136,8 @@ public: { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next();) - callback (*iter.getListener()); + for (WrappedIterator iter (*this, activeIterators); iter.get().next();) + callback (*iter.get().getListener()); } /** Calls a member function with 1 parameter, on all but the specified listener in the list. @@ -132,9 +148,9 @@ public: { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next();) + for (WrappedIterator iter (*this, activeIterators); iter.get().next();) { - auto* l = iter.getListener(); + auto* l = iter.get().getListener(); if (l != listenerToExclude) callback (*l); @@ -149,8 +165,10 @@ public: { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next (bailOutChecker);) - callback (*iter.getListener()); + for (WrappedIterator iter (*this, activeIterators); iter.get().next (bailOutChecker);) + { + callback (*iter.get().getListener()); + } } /** Calls a member function, with 1 parameter, on all but the specified listener in the list @@ -164,9 +182,9 @@ public: { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next (bailOutChecker);) + for (WrappedIterator iter (*this, activeIterators); iter.get().next (bailOutChecker);) { - auto* l = iter.getListener(); + auto* l = iter.get().getListener(); if (l != listenerToExclude) callback (*l); @@ -187,15 +205,12 @@ public: //============================================================================== /** Iterates the listeners in a ListenerList. */ - template struct Iterator { - Iterator (const ListType& listToIterate) noexcept + explicit Iterator (const ListenerList& listToIterate) noexcept : list (listToIterate), index (listToIterate.size()) {} - ~Iterator() = default; - //============================================================================== bool next() noexcept { @@ -211,28 +226,28 @@ public: return index >= 0; } + template bool next (const BailOutCheckerType& bailOutChecker) noexcept { return (! bailOutChecker.shouldBailOut()) && next(); } - typename ListType::ListenerType* getListener() const noexcept + ListenerClass* getListener() const noexcept { return list.getListeners().getUnchecked (index); } - //============================================================================== private: - const ListType& list; + const ListenerList& list; int index; + friend ListenerList; + JUCE_DECLARE_NON_COPYABLE (Iterator) }; //============================================================================== #ifndef DOXYGEN - // There are now lambda-based call functions that can be used to replace these old method-based versions. - // We'll eventually deprecate these old ones, so please begin moving your code to use lambdas! void call (void (ListenerClass::*callbackFunction) ()) { call ([=] (ListenerClass& l) { (l.*callbackFunction)(); }); @@ -262,7 +277,7 @@ public: { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next();) + for (Iterator iter (*this); iter.next();) (iter.getListener()->*callbackFunction) (static_cast::type> (args)...); } @@ -273,7 +288,7 @@ public: { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next();) + for (Iterator iter (*this); iter.next();) if (iter.getListener() != listenerToExclude) (iter.getListener()->*callbackFunction) (static_cast::type> (args)...); } @@ -285,7 +300,7 @@ public: { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next (bailOutChecker);) + for (Iterator iter (*this); iter.next (bailOutChecker);) (iter.getListener()->*callbackFunction) (static_cast::type> (args)...); } @@ -297,15 +312,49 @@ public: { typename ArrayType::ScopedLockType lock (listeners.getLock()); - for (Iterator iter (*this); iter.next (bailOutChecker);) + for (Iterator iter (*this); iter.next (bailOutChecker);) if (iter.getListener() != listenerToExclude) (iter.getListener()->*callbackFunction) (static_cast::type> (args)...); } #endif private: + class WrappedIterator + { + public: + WrappedIterator (const ListenerList& listToIterate, WrappedIterator*& listHeadIn) + : it (listToIterate), listHead (listHeadIn), next (listHead) + { + listHead = this; + } + + ~WrappedIterator() + { + if (valid) + listHead = next; + } + + auto& get() noexcept { return it; } + + template + static void forEach (WrappedIterator* wrapped, Callback&& cb) + { + for (auto* p = wrapped; p != nullptr; p = p->next) + cb (*p); + } + + void invalidate() noexcept { valid = false; } + + private: + Iterator it; + WrappedIterator*& listHead; + WrappedIterator* next = nullptr; + bool valid = true; + }; + //============================================================================== ArrayType listeners; + WrappedIterator* activeIterators = nullptr; JUCE_DECLARE_NON_COPYABLE (ListenerList) }; diff --git a/modules/juce_core/containers/juce_NamedValueSet.cpp b/modules/juce_core/containers/juce_NamedValueSet.cpp index 78c84ae4..079a3c07 100644 --- a/modules/juce_core/containers/juce_NamedValueSet.cpp +++ b/modules/juce_core/containers/juce_NamedValueSet.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_NamedValueSet.h b/modules/juce_core/containers/juce_NamedValueSet.h index 6fb6efae..78bb1cda 100644 --- a/modules/juce_core/containers/juce_NamedValueSet.h +++ b/modules/juce_core/containers/juce_NamedValueSet.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_Optional.h b/modules/juce_core/containers/juce_Optional.h new file mode 100644 index 00000000..6e2333ce --- /dev/null +++ b/modules/juce_core/containers/juce_Optional.h @@ -0,0 +1,401 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +namespace detail +{ +namespace adlSwap +{ +using std::swap; + +template +constexpr auto isNothrowSwappable = noexcept (swap (std::declval(), std::declval())); +} // namespace adlSwap +} // namespace detail + +/** A type representing the null state of an Optional. + Similar to std::nullopt_t. +*/ +struct Nullopt +{ + explicit constexpr Nullopt (int) {} +}; + +/** An object that can be used when constructing and comparing Optional instances. + Similar to std::nullopt. +*/ +constexpr Nullopt nullopt { 0 }; + +// Without this, our tests can emit "unreachable code" warnings during +// link time code generation. +JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4702) + +/** + A simple optional type. + + Has similar (not necessarily identical!) semantics to std::optional. + + This is intended to stand-in for std::optional while JUCE's minimum + supported language standard is lower than C++17. When the minimum language + standard moves to C++17, this class will probably be deprecated, in much + the same way that juce::ScopedPointer was deprecated in favour of + std::unique_ptr after C++11. + + This isn't really intended to be used by JUCE clients. Instead, it's to be + used internally in JUCE code, with an API close-enough to std::optional + that the types can be swapped with fairly minor disruption at some point in + the future, but *without breaking any public APIs*. + + @tags{Core} +*/ +template +class Optional +{ + template + struct NotConstructibleFromSimilarType + { + static constexpr auto value = ! std::is_constructible&>::value + && ! std::is_constructible&>::value + && ! std::is_constructible&&>::value + && ! std::is_constructible&&>::value + && ! std::is_convertible&, T>::value + && ! std::is_convertible&, T>::value + && ! std::is_convertible&&, T>::value + && ! std::is_convertible&&, T>::value; + }; + + template + using OptionalCopyConstructorEnabled = std::enable_if_t::value && NotConstructibleFromSimilarType::value>; + + template + using OptionalMoveConstructorEnabled = std::enable_if_t::value && NotConstructibleFromSimilarType::value>; + + template + static auto notAssignableFromSimilarType = NotConstructibleFromSimilarType::value + && ! std::is_assignable&>::value + && ! std::is_assignable&>::value + && ! std::is_assignable&&>::value + && ! std::is_assignable&&>::value; + + template + using OptionalCopyAssignmentEnabled = std::enable_if_t::value + && std::is_assignable::value + && NotConstructibleFromSimilarType::value>; + + template + using OptionalMoveAssignmentEnabled = std::enable_if_t::value + && std::is_nothrow_assignable::value + && NotConstructibleFromSimilarType::value>; + +public: + Optional() : placeholder() {} + + Optional (Nullopt) noexcept : placeholder() {} + + template ::value + && ! std::is_same, Optional>::value>> + Optional (U&& value) noexcept (noexcept (Value (std::forward (value)))) + : storage (std::forward (value)), valid (true) + { + } + + Optional (Optional&& other) noexcept (noexcept (std::declval().constructFrom (other))) + : placeholder() + { + constructFrom (other); + } + + Optional (const Optional& other) + : placeholder(), valid (other.valid) + { + if (valid) + new (&storage) Value (*other); + } + + template > + Optional (Optional&& other) noexcept (noexcept (std::declval().constructFrom (other))) + : placeholder() + { + constructFrom (other); + } + + template > + Optional (const Optional& other) + : placeholder(), valid (other.hasValue()) + { + if (valid) + new (&storage) Value (*other); + } + + Optional& operator= (Nullopt) noexcept + { + reset(); + return *this; + } + + template ::value + && std::is_nothrow_move_assignable::value>> + Optional& operator= (Optional&& other) noexcept (noexcept (std::declval().assign (std::declval()))) + { + assign (other); + return *this; + } + + template , Optional>::value + && std::is_constructible::value + && std::is_assignable::value + && (! std::is_scalar::value || ! std::is_same, Value>::value)>> + Optional& operator= (U&& value) + { + if (valid) + **this = std::forward (value); + else + new (&storage) Value (std::forward (value)); + + valid = true; + return *this; + } + + /** Maintains the strong exception safety guarantee. */ + Optional& operator= (const Optional& other) + { + auto copy = other; + assign (copy); + return *this; + } + + template > + Optional& operator= (Optional&& other) noexcept (noexcept (std::declval().assign (other))) + { + assign (other); + return *this; + } + + /** Maintains the strong exception safety guarantee. */ + template > + Optional& operator= (const Optional& other) + { + auto copy = other; + assign (copy); + return *this; + } + + ~Optional() noexcept + { + reset(); + } + + Value* operator->() noexcept { return reinterpret_cast< Value*> (&storage); } + const Value* operator->() const noexcept { return reinterpret_cast (&storage); } + + Value& operator*() noexcept { return *operator->(); } + const Value& operator*() const noexcept { return *operator->(); } + + explicit operator bool() const noexcept { return valid; } + bool hasValue() const noexcept { return valid; } + + void reset() + { + if (std::exchange (valid, false)) + operator*().~Value(); + } + + /** Like std::optional::value_or */ + template + Value orFallback (U&& fallback) const { return *this ? **this : std::forward (fallback); } + + template + Value& emplace (Args&&... args) + { + reset(); + new (&storage) Value (std::forward (args)...); + valid = true; + return **this; + } + + void swap (Optional& other) noexcept (std::is_nothrow_move_constructible::value + && detail::adlSwap::isNothrowSwappable) + { + if (hasValue() && other.hasValue()) + { + using std::swap; + swap (**this, *other); + } + else if (hasValue() || other.hasValue()) + { + (hasValue() ? other : *this).constructFrom (hasValue() ? *this : other); + } + } + +private: + template + void constructFrom (Optional& other) noexcept (noexcept (Value (std::move (*other)))) + { + if (! other.hasValue()) + return; + + new (&storage) Value (std::move (*other)); + valid = true; + other.reset(); + } + + template + void assign (Optional& other) noexcept (noexcept (std::declval() = std::move (*other)) && noexcept (std::declval().constructFrom (other))) + { + if (valid) + { + if (other.hasValue()) + { + **this = std::move (*other); + other.reset(); + } + else + { + reset(); + } + } + else + { + constructFrom (other); + } + } + + union + { + char placeholder; + Value storage; + }; + bool valid = false; +}; + +JUCE_END_IGNORE_WARNINGS_MSVC + +template +Optional> makeOptional (Value&& v) +{ + return std::forward (v); +} + +template +bool operator== (const Optional& lhs, const Optional& rhs) +{ + if (lhs.hasValue() != rhs.hasValue()) return false; + if (! lhs.hasValue()) return true; + return *lhs == *rhs; +} + +template +bool operator!= (const Optional& lhs, const Optional& rhs) +{ + if (lhs.hasValue() != rhs.hasValue()) return true; + if (! lhs.hasValue()) return false; + return *lhs != *rhs; +} + +template +bool operator< (const Optional& lhs, const Optional& rhs) +{ + if (! rhs.hasValue()) return false; + if (! lhs.hasValue()) return true; + return *lhs < *rhs; +} + +template +bool operator<= (const Optional& lhs, const Optional& rhs) +{ + if (! lhs.hasValue()) return true; + if (! rhs.hasValue()) return false; + return *lhs <= *rhs; +} + +template +bool operator> (const Optional& lhs, const Optional& rhs) +{ + if (! lhs.hasValue()) return false; + if (! rhs.hasValue()) return true; + return *lhs > *rhs; +} + +template +bool operator>= (const Optional& lhs, const Optional& rhs) +{ + if (! rhs.hasValue()) return true; + if (! lhs.hasValue()) return false; + return *lhs >= *rhs; +} + +template +bool operator== (const Optional& opt, Nullopt) noexcept { return ! opt.hasValue(); } +template +bool operator== (Nullopt, const Optional& opt) noexcept { return ! opt.hasValue(); } +template +bool operator!= (const Optional& opt, Nullopt) noexcept { return opt.hasValue(); } +template +bool operator!= (Nullopt, const Optional& opt) noexcept { return opt.hasValue(); } +template +bool operator< (const Optional&, Nullopt) noexcept { return false; } +template +bool operator< (Nullopt, const Optional& opt) noexcept { return opt.hasValue(); } +template +bool operator<= (const Optional& opt, Nullopt) noexcept { return ! opt.hasValue(); } +template +bool operator<= (Nullopt, const Optional&) noexcept { return true; } +template +bool operator> (const Optional& opt, Nullopt) noexcept { return opt.hasValue(); } +template +bool operator> (Nullopt, const Optional&) noexcept { return false; } +template +bool operator>= (const Optional&, Nullopt) noexcept { return true; } +template +bool operator>= (Nullopt, const Optional& opt) noexcept { return ! opt.hasValue(); } + +template +bool operator== (const Optional& opt, const U& value) { return opt.hasValue() ? *opt == value : false; } +template +bool operator== (const T& value, const Optional& opt) { return opt.hasValue() ? value == *opt : false; } +template +bool operator!= (const Optional& opt, const U& value) { return opt.hasValue() ? *opt != value : true; } +template +bool operator!= (const T& value, const Optional& opt) { return opt.hasValue() ? value != *opt : true; } +template +bool operator< (const Optional& opt, const U& value) { return opt.hasValue() ? *opt < value : true; } +template +bool operator< (const T& value, const Optional& opt) { return opt.hasValue() ? value < *opt : false; } +template +bool operator<= (const Optional& opt, const U& value) { return opt.hasValue() ? *opt <= value : true; } +template +bool operator<= (const T& value, const Optional& opt) { return opt.hasValue() ? value <= *opt : false; } +template +bool operator> (const Optional& opt, const U& value) { return opt.hasValue() ? *opt > value : false; } +template +bool operator> (const T& value, const Optional& opt) { return opt.hasValue() ? value > *opt : true; } +template +bool operator>= (const Optional& opt, const U& value) { return opt.hasValue() ? *opt >= value : false; } +template +bool operator>= (const T& value, const Optional& opt) { return opt.hasValue() ? value >= *opt : true; } + +} // namespace juce diff --git a/modules/juce_core/containers/juce_Optional_test.cpp b/modules/juce_core/containers/juce_Optional_test.cpp new file mode 100644 index 00000000..cc2b7994 --- /dev/null +++ b/modules/juce_core/containers/juce_Optional_test.cpp @@ -0,0 +1,627 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +/* Not nested, so that ADL works for the swap function. */ +struct ThrowOnMoveOrSwap +{ + ThrowOnMoveOrSwap() = default; + ThrowOnMoveOrSwap (ThrowOnMoveOrSwap&&) { throw std::bad_alloc{}; } +}; +static void swap (ThrowOnMoveOrSwap&, ThrowOnMoveOrSwap&) { throw std::bad_alloc{}; } + +class OptionalUnitTest : public UnitTest +{ +public: + OptionalUnitTest() : UnitTest ("Optional", UnitTestCategories::containers) {} + + void runTest() override + { + beginTest ("Default-constructed optional is invalid"); + { + Optional o; + expect (! o.hasValue()); + } + + beginTest ("Constructing from Nullopt is invalid"); + { + Optional o (nullopt); + expect (! o.hasValue()); + } + + beginTest ("Optional constructed from value is valid"); + { + Optional o = 5; + expect (o.hasValue()); + expectEquals (*o, 5); + } + + using Ptr = std::shared_ptr; + const auto makePtr = [] { return std::make_shared(); }; + + beginTest ("Constructing from a moved optional calls appropriate member functions"); + { + auto ptr = makePtr(); + Optional original (ptr); + expect (ptr.use_count() == 2); + auto other = std::move (original); + expect (! original.hasValue()); + expect (other.hasValue()); + expect (ptr.use_count() == 2); + } + + beginTest ("Moving an empty optional to a populated one destroys the instance"); + { + auto ptr = makePtr(); + Optional original (ptr); + expect (ptr.use_count() == 2); + original = Optional(); + expect (ptr.use_count() == 1); + } + + beginTest ("Copying an empty optional to a populated one destroys the instance"); + { + auto ptr = makePtr(); + Optional original (ptr); + expect (ptr.use_count() == 2); + Optional empty; + original = empty; + expect (ptr.use_count() == 1); + } + + beginTest ("Moving a populated optional calls appropriate member functions"); + { + auto a = makePtr(); + auto b = makePtr(); + + Optional aOpt (a); + Optional bOpt (b); + + expect (a.use_count() == 2); + expect (b.use_count() == 2); + + aOpt = std::move (bOpt); + + expect (aOpt.hasValue()); + expect (! bOpt.hasValue()); + + expect (a.use_count() == 1); + expect (b.use_count() == 2); + } + + beginTest ("Copying a populated optional calls appropriate member functions"); + { + auto a = makePtr(); + auto b = makePtr(); + + Optional aOpt (a); + Optional bOpt (b); + + expect (a.use_count() == 2); + expect (b.use_count() == 2); + + aOpt = bOpt; + + expect (aOpt.hasValue()); + expect (bOpt.hasValue()); + + expect (a.use_count() == 1); + expect (b.use_count() == 3); + } + + beginTest ("Moving an empty optional to an empty one does nothing"); + { + Optional original; + original = Optional(); + expect (! original.hasValue()); + } + + beginTest ("Copying an empty optional to an empty one does nothing"); + { + Optional original; + Optional empty; + original = empty; + expect (! original.hasValue()); + expect (! empty.hasValue()); + } + + beginTest ("Moving a populated optional calls appropriate member functions"); + { + auto a = makePtr(); + + Optional aOpt (a); + Optional empty; + + expect (a.use_count() == 2); + + empty = std::move (aOpt); + + expect (empty.hasValue()); + expect (! aOpt.hasValue()); + + expect (a.use_count() == 2); + } + + beginTest ("Copying a populated optional calls appropriate member functions"); + { + auto a = makePtr(); + + Optional aOpt (a); + Optional empty; + + expect (a.use_count() == 2); + + empty = aOpt; + + expect (aOpt.hasValue()); + expect (empty.hasValue()); + + expect (a.use_count() == 3); + } + + struct ThrowOnCopy + { + ThrowOnCopy() = default; + + // Put into an invalid state and throw + ThrowOnCopy (const ThrowOnCopy&) + { + value = -100; + throw std::bad_alloc{}; + } + + // Put into an invalid state and throw + ThrowOnCopy& operator= (const ThrowOnCopy&) + { + value = -100; + throw std::bad_alloc{}; + } + + ThrowOnCopy (ThrowOnCopy&&) noexcept = default; + ThrowOnCopy& operator= (ThrowOnCopy&&) noexcept = default; + + ~ThrowOnCopy() = default; + + int value = 0; + }; + + beginTest ("Strong exception safety is maintained when forwarding over empty object"); + { + bool threw = false; + Optional a; + + try + { + ThrowOnCopy t; + a = t; + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (! a.hasValue()); // If construction failed, this object should still be well-formed but empty + } + + beginTest ("Weak exception safety is maintained when forwarding over populated object"); + { + bool threw = false; + Optional a = ThrowOnCopy(); + a->value = 5; + + try + { + ThrowOnCopy t; + a = t; + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (a.hasValue()); + expect (a->value == -100); // If we assign to an extant object, it's up to that object to provide an exception guarantee + } + + beginTest ("Strong exception safety is maintained when copying over empty object"); + { + bool threw = false; + Optional a; + + try + { + Optional t = ThrowOnCopy{}; + a = t; + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (! a.hasValue()); + } + + beginTest ("Strong exception safety is maintained when copying over populated object"); + { + bool threw = false; + Optional a = ThrowOnCopy(); + a->value = 5; + + try + { + Optional t = ThrowOnCopy{}; + a = t; + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (a.hasValue()); + expect (a->value == 5); + } + + beginTest ("Assigning from nullopt clears the instance"); + { + auto ptr = makePtr(); + Optional a (ptr); + expect (ptr.use_count() == 2); + a = nullopt; + expect (ptr.use_count() == 1); + } + + struct Foo {}; + struct Bar : Foo {}; + + beginTest ("Can be constructed from compatible type"); + { + Optional> opt { std::make_shared() }; + } + + beginTest ("Can be assigned from compatible type"); + { + Optional> opt; + opt = std::make_shared(); + } + + beginTest ("Can copy from compatible type"); + { + auto ptr = std::make_shared(); + Optional> bar (ptr); + Optional> foo (bar); + expect (ptr.use_count() == 3); + } + + beginTest ("Can move from compatible type"); + { + auto ptr = std::make_shared(); + Optional> foo (Optional> { ptr }); + expect (ptr.use_count() == 2); + } + + beginTest ("Can copy assign from compatible type"); + { + auto ptr = std::make_shared(); + Optional> bar (ptr); + Optional> foo; + foo = bar; + expect (ptr.use_count() == 3); + } + + beginTest ("Can move assign from compatible type"); + { + auto ptr = std::make_shared(); + Optional> foo; + foo = Optional> (ptr); + expect (ptr.use_count() == 2); + } + + beginTest ("An exception thrown during emplace leaves the optional without a value"); + { + Optional opt { ThrowOnCopy{} }; + bool threw = false; + + try + { + ThrowOnCopy t; + opt.emplace (t); + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (! opt.hasValue()); + } + + beginTest ("Swap does nothing to two empty optionals"); + { + Optional a, b; + expect (! a.hasValue()); + expect (! b.hasValue()); + + a.swap (b); + + expect (! a.hasValue()); + expect (! b.hasValue()); + } + + beginTest ("Swap transfers ownership if one optional contains a value"); + { + { + Ptr ptr = makePtr(); + Optional a, b = ptr; + expect (! a.hasValue()); + expect (b.hasValue()); + expect (ptr.use_count() == 2); + + a.swap (b); + + expect (a.hasValue()); + expect (! b.hasValue()); + expect (ptr.use_count() == 2); + } + + { + auto ptr = makePtr(); + Optional a = ptr, b; + expect (a.hasValue()); + expect (! b.hasValue()); + expect (ptr.use_count() == 2); + + a.swap (b); + + expect (! a.hasValue()); + expect (b.hasValue()); + expect (ptr.use_count() == 2); + } + } + + beginTest ("Swap calls std::swap to swap two populated optionals"); + { + auto x = makePtr(), y = makePtr(); + Optional a = x, b = y; + expect (a.hasValue()); + expect (b.hasValue()); + expect (x.use_count() == 2); + expect (y.use_count() == 2); + expect (*a == x); + expect (*b == y); + + a.swap (b); + + expect (a.hasValue()); + expect (b.hasValue()); + expect (x.use_count() == 2); + expect (y.use_count() == 2); + expect (*a == y); + expect (*b == x); + } + + beginTest ("An exception thrown during a swap leaves both objects in the previous populated state"); + { + { + Optional a, b; + a.emplace(); + + expect (a.hasValue()); + expect (! b.hasValue()); + + bool threw = false; + + try + { + a.swap (b); + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (a.hasValue()); + expect (! b.hasValue()); + } + + { + Optional a, b; + b.emplace(); + + expect (! a.hasValue()); + expect (b.hasValue()); + + bool threw = false; + + try + { + a.swap (b); + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (! a.hasValue()); + expect (b.hasValue()); + } + + { + Optional a, b; + a.emplace(); + b.emplace(); + + expect (a.hasValue()); + expect (b.hasValue()); + + bool threw = false; + + try + { + a.swap (b); + } + catch (const std::bad_alloc&) + { + threw = true; + } + + expect (threw); + expect (a.hasValue()); + expect (b.hasValue()); + } + } + + beginTest ("Relational tests"); + { + expect (Optional (1) == Optional (1)); + expect (Optional() == Optional()); + expect (! (Optional (1) == Optional())); + expect (! (Optional() == Optional (1))); + expect (! (Optional (1) == Optional (2))); + + expect (Optional (1) != Optional (2)); + expect (! (Optional() != Optional())); + expect (Optional (1) != Optional()); + expect (Optional() != Optional (1)); + expect (! (Optional (1) != Optional (1))); + + expect (Optional() < Optional (1)); + expect (! (Optional (1) < Optional())); + expect (! (Optional() < Optional())); + expect (Optional (1) < Optional (2)); + + expect (Optional() <= Optional (1)); + expect (! (Optional (1) <= Optional())); + expect (Optional() <= Optional()); + expect (Optional (1) <= Optional (2)); + + expect (! (Optional() > Optional (1))); + expect (Optional (1) > Optional()); + expect (! (Optional() > Optional())); + expect (! (Optional (1) > Optional (2))); + + expect (! (Optional() >= Optional (1))); + expect (Optional (1) >= Optional()); + expect (Optional() >= Optional()); + expect (! (Optional (1) >= Optional (2))); + + expect (Optional() == nullopt); + expect (! (Optional (1) == nullopt)); + expect (nullopt == Optional()); + expect (! (nullopt == Optional (1))); + + expect (! (Optional() != nullopt)); + expect (Optional (1) != nullopt); + expect (! (nullopt != Optional())); + expect (nullopt != Optional (1)); + + expect (! (Optional() < nullopt)); + expect (! (Optional (1) < nullopt)); + + expect (! (nullopt < Optional())); + expect (nullopt < Optional (1)); + + expect (Optional() <= nullopt); + expect (! (Optional (1) <= nullopt)); + + expect (nullopt <= Optional()); + expect (nullopt <= Optional (1)); + + expect (! (Optional() > nullopt)); + expect (Optional (1) > nullopt); + + expect (! (nullopt > Optional())); + expect (! (nullopt > Optional (1))); + + expect (Optional() >= nullopt); + expect (Optional (1) >= nullopt); + + expect (nullopt >= Optional()); + expect (! (nullopt >= Optional (1))); + + expect (! (Optional() == 5)); + expect (! (Optional (1) == 5)); + expect (Optional (1) == 1); + expect (! (5 == Optional())); + expect (! (5 == Optional (1))); + expect (1 == Optional (1)); + + expect (Optional() != 5); + expect (Optional (1) != 5); + expect (! (Optional (1) != 1)); + expect (5 != Optional()); + expect (5 != Optional (1)); + expect (! (1 != Optional (1))); + + expect (Optional() < 5); + expect (Optional (1) < 5); + expect (! (Optional (1) < 1)); + expect (! (Optional (1) < 0)); + + expect (! (5 < Optional())); + expect (! (5 < Optional (1))); + expect (! (1 < Optional (1))); + expect (0 < Optional (1)); + + expect (Optional() <= 5); + expect (Optional (1) <= 5); + expect (Optional (1) <= 1); + expect (! (Optional (1) <= 0)); + + expect (! (5 <= Optional())); + expect (! (5 <= Optional (1))); + expect (1 <= Optional (1)); + expect (0 <= Optional (1)); + + expect (! (Optional() > 5)); + expect (! (Optional (1) > 5)); + expect (! (Optional (1) > 1)); + expect (Optional (1) > 0); + + expect (5 > Optional()); + expect (5 > Optional (1)); + expect (! (1 > Optional (1))); + expect (! (0 > Optional (1))); + + expect (! (Optional() >= 5)); + expect (! (Optional (1) >= 5)); + expect (Optional (1) >= 1); + expect (Optional (1) >= 0); + + expect (5 >= Optional()); + expect (5 >= Optional (1)); + expect (1 >= Optional (1)); + expect (! (0 >= Optional (1))); + } + } +}; + +static OptionalUnitTest optionalUnitTest; + +} // namespace juce diff --git a/modules/juce_core/containers/juce_OwnedArray.cpp b/modules/juce_core/containers/juce_OwnedArray.cpp index 0897a147..e452a561 100644 --- a/modules/juce_core/containers/juce_OwnedArray.cpp +++ b/modules/juce_core/containers/juce_OwnedArray.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_OwnedArray.h b/modules/juce_core/containers/juce_OwnedArray.h index 85c2c9c4..5bc789ed 100644 --- a/modules/juce_core/containers/juce_OwnedArray.h +++ b/modules/juce_core/containers/juce_OwnedArray.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_PropertySet.cpp b/modules/juce_core/containers/juce_PropertySet.cpp index d00b63c8..ea87aab9 100644 --- a/modules/juce_core/containers/juce_PropertySet.cpp +++ b/modules/juce_core/containers/juce_PropertySet.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_PropertySet.h b/modules/juce_core/containers/juce_PropertySet.h index 9fd9d222..bb9c0b42 100644 --- a/modules/juce_core/containers/juce_PropertySet.h +++ b/modules/juce_core/containers/juce_PropertySet.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_ReferenceCountedArray.cpp b/modules/juce_core/containers/juce_ReferenceCountedArray.cpp index ee285711..313dbd9a 100644 --- a/modules/juce_core/containers/juce_ReferenceCountedArray.cpp +++ b/modules/juce_core/containers/juce_ReferenceCountedArray.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_ReferenceCountedArray.h b/modules/juce_core/containers/juce_ReferenceCountedArray.h index f6e90900..c281a1c4 100644 --- a/modules/juce_core/containers/juce_ReferenceCountedArray.h +++ b/modules/juce_core/containers/juce_ReferenceCountedArray.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_ScopedValueSetter.h b/modules/juce_core/containers/juce_ScopedValueSetter.h index f1b0ae10..9c1324ce 100644 --- a/modules/juce_core/containers/juce_ScopedValueSetter.h +++ b/modules/juce_core/containers/juce_ScopedValueSetter.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h b/modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h index 2963161e..84e03709 100644 --- a/modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h +++ b/modules/juce_core/containers/juce_SingleThreadedAbstractFifo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_SortedSet.h b/modules/juce_core/containers/juce_SortedSet.h index 6fe5c3c2..ee0fb6da 100644 --- a/modules/juce_core/containers/juce_SortedSet.h +++ b/modules/juce_core/containers/juce_SortedSet.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_SparseSet.cpp b/modules/juce_core/containers/juce_SparseSet.cpp index 0e5a7ea6..cddd96d9 100644 --- a/modules/juce_core/containers/juce_SparseSet.cpp +++ b/modules/juce_core/containers/juce_SparseSet.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_SparseSet.h b/modules/juce_core/containers/juce_SparseSet.h index 4045af7f..0dcff925 100644 --- a/modules/juce_core/containers/juce_SparseSet.h +++ b/modules/juce_core/containers/juce_SparseSet.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_Variant.cpp b/modules/juce_core/containers/juce_Variant.cpp index e714dec7..2321da3d 100644 --- a/modules/juce_core/containers/juce_Variant.cpp +++ b/modules/juce_core/containers/juce_Variant.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/containers/juce_Variant.h b/modules/juce_core/containers/juce_Variant.h index d06d9aa6..d83df094 100644 --- a/modules/juce_core/containers/juce_Variant.h +++ b/modules/juce_core/containers/juce_Variant.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_AndroidDocument.h b/modules/juce_core/files/juce_AndroidDocument.h new file mode 100644 index 00000000..883ca7f2 --- /dev/null +++ b/modules/juce_core/files/juce_AndroidDocument.h @@ -0,0 +1,476 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2020 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +//============================================================================== +/** + Some information about a document. + + Each instance represents some information about the document at the point when the instance + was created. + + Instance information is not updated automatically. If you think some file information may + have changed, create a new instance. + + @tags{Core} +*/ +class AndroidDocumentInfo +{ +public: + AndroidDocumentInfo() = default; + + /** True if this file really exists. */ + bool exists() const { return isJuceFlagSet (flagExists); } + + /** True if this is a directory rather than a file. */ + bool isDirectory() const; + + /** True if this is a file rather than a directory. */ + bool isFile() const { return type.isNotEmpty() && ! isDirectory(); } + + /** True if this process has permission to read this file. + + If this returns true, and the AndroidDocument refers to a file rather than a directory, + then AndroidDocument::createInputStream should work on this document. + */ + bool canRead() const { return isJuceFlagSet (flagHasReadPermission) && type.isNotEmpty(); } + + /** True if this is a document that can be written, or a directory that can be modified. + + If this returns true, and the AndroidDocument refers to a file rather than a directory, + then AndroidDocument::createOutputStream should work on this document. + */ + bool canWrite() const + { + return isJuceFlagSet (flagHasWritePermission) + && type.isNotEmpty() + && (isNativeFlagSet (flagSupportsWrite) + || isNativeFlagSet (flagSupportsDelete) + || isNativeFlagSet (flagDirSupportsCreate)); + } + + /** True if this document can be removed completely from the filesystem. */ + bool canDelete() const { return isNativeFlagSet (flagSupportsDelete); } + + /** True if this is a directory and adding child documents is supported. */ + bool canCreateChildren() const { return isNativeFlagSet (flagDirSupportsCreate); } + + /** True if this document can be renamed. */ + bool canRename() const { return isNativeFlagSet (flagSupportsRename); } + + /** True if this document can be copied. */ + bool canCopy() const { return isNativeFlagSet (flagSupportsCopy); } + + /** True if this document can be moved. */ + bool canMove() const { return isNativeFlagSet (flagSupportsMove); } + + /** True if this document isn't a physical file on storage. */ + bool isVirtual() const { return isNativeFlagSet (flagVirtualDocument); } + + /** The user-facing name. + + This may or may not contain a file extension. For files identified by a URL, the MIME type + is stored separately. + */ + String getName() const { return name; } + + /** The MIME type of this document. */ + String getType() const { return isDirectory() ? String{} : type; } + + /** Timestamp when a document was last modified, in milliseconds since January 1, 1970 00:00:00.0 UTC. + + Use isLastModifiedValid() to determine whether or not the result of this + function is valid. + */ + int64 getLastModified() const { return isJuceFlagSet (flagValidModified) ? lastModified : 0; } + + /** True if the filesystem provided a modification time. */ + bool isLastModifiedValid() const { return isJuceFlagSet (flagValidModified); } + + /** The size of the document in bytes, if known. + + Use isSizeInBytesValid() to determine whether or not the result of this + function is valid. + */ + int64 getSizeInBytes() const { return isJuceFlagSet (flagValidSize) ? sizeInBytes : 0; } + + /** True if the filesystem provided a size in bytes. */ + bool isSizeInBytesValid() const { return isJuceFlagSet (flagValidSize); } + + /** @internal */ + class Args; + +private: + explicit AndroidDocumentInfo (Args); + + bool isNativeFlagSet (int flag) const { return (nativeFlags & flag) != 0; } + bool isJuceFlagSet (int flag) const { return (juceFlags & flag) != 0; } + + /* Native Android flags that might be set in the COLUMN_FLAGS for a particular document */ + enum + { + flagSupportsWrite = 0x0002, + flagSupportsDelete = 0x0004, + flagDirSupportsCreate = 0x0008, + flagSupportsRename = 0x0040, + flagSupportsCopy = 0x0080, + flagSupportsMove = 0x0100, + flagVirtualDocument = 0x0200, + }; + + /* Flags for other binary properties that aren't exposed in COLUMN_FLAGS */ + enum + { + flagExists = 1 << 0, + flagValidModified = 1 << 1, + flagValidSize = 1 << 2, + flagHasReadPermission = 1 << 3, + flagHasWritePermission = 1 << 4, + }; + + String name; + String type; + int64 lastModified = 0; + int64 sizeInBytes = 0; + int nativeFlags = 0, juceFlags = 0; +}; + +//============================================================================== +/** + Represents a permission granted to an application to read and/or write to a particular document + or tree. + + This class also contains static methods to request, revoke, and query the permissions of your + app. These functions are no-ops on all platforms other than Android. + + @tags{Core} +*/ +class AndroidDocumentPermission +{ +public: + /** The url of the document with persisted permissions. */ + URL getUrl() const { return url; } + + /** The time when the permissions were persisted, in milliseconds since January 1, 1970 00:00:00.0 UTC. */ + int64 getPersistedTime() const { return time; } + + /** True if the permission allows read access. */ + bool isReadPermission() const { return read; } + + /** True if the permission allows write access. */ + bool isWritePermission() const { return write; } + + /** Gives your app access to a particular document or tree, even after the device is rebooted. + + If you want to persist access to a folder selected through a native file chooser, make sure + to pass the exact URL returned by the file picker. Do NOT call AndroidDocument::fromTree + and then pass the result of getUrl to this function, as the resulting URL may differ from + the result of the file picker. + */ + static void takePersistentReadWriteAccess (const URL&); + + /** Revokes persistent access to a document or tree. */ + static void releasePersistentReadWriteAccess (const URL&); + + /** Returns all of the permissions that have previously been granted to the app, via + takePersistentReadWriteAccess(); + */ + static std::vector getPersistedPermissions(); + +private: + URL url; + int64 time = 0; + bool read = false, write = false; +}; + +//============================================================================== +/** + Provides access to a document on Android devices. + + In this context, a 'document' may be a file or a directory. + + The main purpose of this class is to provide access to files in shared storage on Android. + On newer Android versions, such files cannot be accessed directly by a file path, and must + instead be read and modified using a new URI-based DocumentsContract API. + + Example use-cases: + + - After showing the system open dialog to allow the user to open a file, pass the FileChooser's + URL result to AndroidDocument::fromDocument. Then, you can use getInfo() to retrieve + information about the file, and createInputStream to read from the file. Other functions allow + moving, copying, and deleting the file. + + - Similarly to the 'open' use-case, you may use createOutputStream to write to a file, normally + located using the system save dialog. + + - To allow reading or writing to a tree of files in shared storage, you can show the system + open dialog in 'selects directories' mode, and pass the resulting URL to + AndroidDocument::fromTree. Then, you can iterate the files in the directory, query them, + and create new files. This is a good way to store multiple files that the user can access from + other apps, and that will be persistent after uninstalling and reinstalling your app. + + Note that you probably do *not* need this class if your app only needs to access files in its + own internal sandbox. juce::File instances should work as expected in that case. + + AndroidDocument is a bit like the DocumentFile class from the androidx extension library, + in that it represents a single document, and is implemented using DocumentsContract functions. + + @tags{Core} +*/ +class AndroidDocument +{ +public: + /** Create a null document. */ + AndroidDocument(); + + /** Create an AndroidDocument representing a file or directory at a particular path. + + This is provided for use on older API versions (lower than 19), or on other platforms, so + that the same AndroidDocument API can be used regardless of the runtime platform version. + + If the runtime platform version is 19 or higher, and you wish to work with a URI obtained + from a native file picker, use fromDocument() or fromTree() instead. + + If this function fails, hasValue() will return false on the returned document. + */ + static AndroidDocument fromFile (const File& filePath); + + /** Create an AndroidDocument representing a single document. + + The argument should be a URL representing a document. Such URLs are returned by the system + file-picker when it is not in folder-selection mode. If you pass a tree URL, this function + will fail. + + This function may fail on Android devices with API level 18 or lower, and on non-Android + platforms. If this function fails, hasValue() will return false on the returned document. + If calling this function fails, you may want to retry creating an AndroidDocument + with fromFile(), passing the result of URL::getLocalFile(). + */ + static AndroidDocument fromDocument (const URL& documentUrl); + + /** Create an AndroidDocument representing the root of a tree of files. + + The argument should be a URL representing a tree. Such URLs are returned by the system + file-picker when it is in folder-selection mode. If you pass a URL referring to a document + inside a tree, this will return a document referring to the root of the tree. If you pass + a URL referring to a single file, this will fail. + + When targeting platform version 30 or later, access to the filesystem via file paths is + heavily restricted, and access to shared storage must use a new URI-based system instead. + At time of writing, apps uploaded to the Play Store must target API 30 or higher. + If you want read/write access to a shared folder, you must: + + - Use a native FileChooser in canSelectDirectories mode, to allow the user to select a + folder that your app can access. Your app will only have access to the contents of this + directory; it cannot escape to the filesystem root. The system will not allow the user + to grant access to certain locations, including filesystem roots and the Download folder. + - Pass the URI that the user selected to fromTree(), and use the resulting AndroidDocument + to read/write to the file system. + + This function may fail on Android devices with API level 20 or lower, and on non-Android + platforms. If this function fails, hasValue() will return false on the returned document. + */ + static AndroidDocument fromTree (const URL& treeUrl); + + AndroidDocument (const AndroidDocument&); + AndroidDocument (AndroidDocument&&) noexcept; + + AndroidDocument& operator= (const AndroidDocument&); + AndroidDocument& operator= (AndroidDocument&&) noexcept; + + ~AndroidDocument(); + + /** True if the URLs of the two documents match. */ + bool operator== (const AndroidDocument&) const; + + /** False if the URLs of the two documents match. */ + bool operator!= (const AndroidDocument&) const; + + /** Attempts to delete this document, and returns true on success. */ + bool deleteDocument() const; + + /** Renames the document, and returns true on success. + + This may cause the document's URI and metadata to change, so ensure to invalidate any + cached information about the document (URLs, AndroidDocumentInfo instances) after calling + this function. + */ + bool renameTo (const String& newDisplayName); + + /** Attempts to create a new nested document with a particular type and name. + + The type should be a standard MIME type string, e.g. "image/png", "text/plain". + + The file name doesn't need to contain an extension, as this information is passed via the + type argument. If this document is File-based rather than URL-based, then an appropriate + file extension will be chosen based on the MIME type. + + On failure, the returned AndroidDocument may be invalid, and will return false from hasValue(). + */ + AndroidDocument createChildDocumentWithTypeAndName (const String& type, const String& name) const; + + /** Attempts to create a new nested directory with a particular name. + + On failure, the returned AndroidDocument may be invalid, and will return false from hasValue(). + */ + AndroidDocument createChildDirectory (const String& name) const; + + /** True if this object actually refers to a document. + + If this function returns false, you *must not* call any function on this instance other + than the special member functions to copy, move, and/or destruct the instance. + */ + bool hasValue() const { return pimpl != nullptr; } + + /** Like hasValue(), but allows declaring AndroidDocument instances directly in 'if' statements. */ + explicit operator bool() const { return hasValue(); } + + /** Creates a stream for reading from this document. */ + std::unique_ptr createInputStream() const; + + /** Creates a stream for writing to this document. */ + std::unique_ptr createOutputStream() const; + + /** Returns the content URL describing this document. */ + URL getUrl() const; + + /** Fetches information about this document. */ + AndroidDocumentInfo getInfo() const; + + /** Experimental: Attempts to copy this document to a new parent, and returns an AndroidDocument + representing the copy. + + On failure, the returned AndroidDocument may be invalid, and will return false from hasValue(). + + This function may fail if the document doesn't allow copying, and when using URI-based + documents on devices with API level 23 or lower. On failure, the returned AndroidDocument + will return false from hasValue(). In testing, copying was not supported on the Android + emulator for API 24, 30, or 31, so there's a good chance this function won't work on real + devices. + + @see AndroidDocumentInfo::canCopy + */ + AndroidDocument copyDocumentToParentDocument (const AndroidDocument& target) const; + + /** Experimental: Attempts to move this document from one parent to another, and returns true on + success. + + This may cause the document's URI and metadata to change, so ensure to invalidate any + cached information about the document (URLs, AndroidDocumentInfo instances) after calling + this function. + + This function may fail if the document doesn't allow moving, and when using URI-based + documents on devices with API level 23 or lower. + */ + bool moveDocumentFromParentToParent (const AndroidDocument& currentParent, + const AndroidDocument& newParent); + + /** @internal */ + struct NativeInfo; + + /** @internal */ + NativeInfo getNativeInfo() const; + +private: + struct Utils; + class Pimpl; + + explicit AndroidDocument (std::unique_ptr); + + void swap (AndroidDocument& other) noexcept { std::swap (other.pimpl, pimpl); } + + std::unique_ptr pimpl; +}; + +//============================================================================== +/** + An iterator that visits child documents in a directory. + + Instances of this iterator can be created by calling makeRecursive() or + makeNonRecursive(). The results of these functions can additionally be used + in standard algorithms, and in range-for loops: + + @code + AndroidDocument findFileWithName (const AndroidDocument& parent, const String& name) + { + for (const auto& child : AndroidDocumentIterator::makeNonRecursive (parent)) + if (child.getInfo().getName() == name) + return child; + + return AndroidDocument(); + } + + std::vector findAllChildrenRecursive (const AndroidDocument& parent) + { + std::vector children; + std::copy (AndroidDocumentIterator::makeRecursive (doc), + AndroidDocumentIterator(), + std::back_inserter (children)); + return children; + } + @endcode + + @tags{Core} +*/ +class AndroidDocumentIterator final +{ +public: + using difference_type = std::ptrdiff_t; + using pointer = void; + using iterator_category = std::input_iterator_tag; + + /** Create an iterator that will visit each item in this directory. */ + static AndroidDocumentIterator makeNonRecursive (const AndroidDocument&); + + /** Create an iterator that will visit each item in this directory, and all nested directories. */ + static AndroidDocumentIterator makeRecursive (const AndroidDocument&); + + /** Creates an end/sentinel iterator. */ + AndroidDocumentIterator() = default; + + bool operator== (const AndroidDocumentIterator& other) const noexcept { return pimpl == nullptr && other.pimpl == nullptr; } + bool operator!= (const AndroidDocumentIterator& other) const noexcept { return ! operator== (other); } + + /** Returns the document to which this iterator points. */ + AndroidDocument operator*() const; + + /** Moves this iterator to the next position. */ + AndroidDocumentIterator& operator++(); + + /** Allows this iterator to be used directly in a range-for. */ + AndroidDocumentIterator begin() const { return *this; } + + /** Allows this iterator to be used directly in a range-for. */ + AndroidDocumentIterator end() const { return AndroidDocumentIterator{}; } + +private: + struct Utils; + struct Pimpl; + + explicit AndroidDocumentIterator (std::unique_ptr); + + std::shared_ptr pimpl; +}; + +} // namespace juce diff --git a/modules/juce_core/files/juce_DirectoryIterator.cpp b/modules/juce_core/files/juce_DirectoryIterator.cpp index ea72ed7e..425f5bd5 100644 --- a/modules/juce_core/files/juce_DirectoryIterator.cpp +++ b/modules/juce_core/files/juce_DirectoryIterator.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_DirectoryIterator.h b/modules/juce_core/files/juce_DirectoryIterator.h index 27a7aea9..b0102108 100644 --- a/modules/juce_core/files/juce_DirectoryIterator.h +++ b/modules/juce_core/files/juce_DirectoryIterator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_File.cpp b/modules/juce_core/files/juce_File.cpp index 85fd0b7d..20561f39 100644 --- a/modules/juce_core/files/juce_File.cpp +++ b/modules/juce_core/files/juce_File.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -1146,11 +1146,18 @@ public: expect (home.getChildFile ("./../xyz") == home.getParentDirectory().getChildFile ("xyz")); expect (home.getChildFile ("a1/a2/a3/./../../a4") == home.getChildFile ("a1/a4")); + expect (! File().hasReadAccess()); + expect (! File().hasWriteAccess()); + + expect (! tempFile.hasReadAccess()); + { FileOutputStream fo (tempFile); fo.write ("0123456789", 10); } + expect (tempFile.hasReadAccess()); + expect (tempFile.exists()); expect (tempFile.getSize() == 10); expect (std::abs ((int) (tempFile.getLastModificationTime().toMilliseconds() - Time::getCurrentTime().toMilliseconds())) < 3000); diff --git a/modules/juce_core/files/juce_File.h b/modules/juce_core/files/juce_File.h index a6f9f71a..f81ec27f 100644 --- a/modules/juce_core/files/juce_File.h +++ b/modules/juce_core/files/juce_File.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -20,17 +20,13 @@ ============================================================================== */ -#if ! defined (DOXYGEN) && (JUCE_MAC || JUCE_IOS) - #if __LP64__ - using OSType = unsigned int; - #else - using OSType = unsigned long; - #endif -#endif - namespace juce { +#if ! DOXYGEN && (JUCE_MAC || JUCE_IOS) + using OSType = unsigned int; +#endif + //============================================================================== /** Represents a local file or directory. @@ -346,6 +342,12 @@ public: */ bool hasWriteAccess() const; + /** Checks whether a file can be read. + + @returns true if it's possible to read this file. + */ + bool hasReadAccess() const; + /** Changes the write-permission of a file or directory. @param shouldBeReadOnly whether to add or remove write-permission @@ -381,21 +383,21 @@ public: //============================================================================== /** Returns the last modification time of this file. - @returns the time, or an invalid time if the file doesn't exist. + @returns the time, or the Unix Epoch if the file doesn't exist. @see setLastModificationTime, getLastAccessTime, getCreationTime */ Time getLastModificationTime() const; /** Returns the last time this file was accessed. - @returns the time, or an invalid time if the file doesn't exist. + @returns the time, or the Unix Epoch if the file doesn't exist. @see setLastAccessTime, getLastModificationTime, getCreationTime */ Time getLastAccessTime() const; /** Returns the time that this file was created. - @returns the time, or an invalid time if the file doesn't exist. + @returns the time, or the Unix Epoch if the file doesn't exist. @see getLastModificationTime, getLastAccessTime */ Time getCreationTime() const; diff --git a/modules/juce_core/files/juce_FileFilter.cpp b/modules/juce_core/files/juce_FileFilter.cpp index 5b9f48d2..f41ed340 100644 --- a/modules/juce_core/files/juce_FileFilter.cpp +++ b/modules/juce_core/files/juce_FileFilter.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_FileFilter.h b/modules/juce_core/files/juce_FileFilter.h index a58fad41..d84fd395 100644 --- a/modules/juce_core/files/juce_FileFilter.h +++ b/modules/juce_core/files/juce_FileFilter.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_FileInputStream.cpp b/modules/juce_core/files/juce_FileInputStream.cpp index f37d9d5f..8a40a47d 100644 --- a/modules/juce_core/files/juce_FileInputStream.cpp +++ b/modules/juce_core/files/juce_FileInputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_FileInputStream.h b/modules/juce_core/files/juce_FileInputStream.h index f764fb2e..3b75534e 100644 --- a/modules/juce_core/files/juce_FileInputStream.h +++ b/modules/juce_core/files/juce_FileInputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_FileOutputStream.cpp b/modules/juce_core/files/juce_FileOutputStream.cpp index b520be60..21d95f7c 100644 --- a/modules/juce_core/files/juce_FileOutputStream.cpp +++ b/modules/juce_core/files/juce_FileOutputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_FileOutputStream.h b/modules/juce_core/files/juce_FileOutputStream.h index 21814c92..3d560142 100644 --- a/modules/juce_core/files/juce_FileOutputStream.h +++ b/modules/juce_core/files/juce_FileOutputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_FileSearchPath.cpp b/modules/juce_core/files/juce_FileSearchPath.cpp index c5e92508..1cd0af2e 100644 --- a/modules/juce_core/files/juce_FileSearchPath.cpp +++ b/modules/juce_core/files/juce_FileSearchPath.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_FileSearchPath.h b/modules/juce_core/files/juce_FileSearchPath.h index 4ed1e97f..144419d0 100644 --- a/modules/juce_core/files/juce_FileSearchPath.h +++ b/modules/juce_core/files/juce_FileSearchPath.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_MemoryMappedFile.h b/modules/juce_core/files/juce_MemoryMappedFile.h index 02771199..97a39de8 100644 --- a/modules/juce_core/files/juce_MemoryMappedFile.h +++ b/modules/juce_core/files/juce_MemoryMappedFile.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_RangedDirectoryIterator.cpp b/modules/juce_core/files/juce_RangedDirectoryIterator.cpp index fa5796cb..a073755a 100644 --- a/modules/juce_core/files/juce_RangedDirectoryIterator.cpp +++ b/modules/juce_core/files/juce_RangedDirectoryIterator.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_RangedDirectoryIterator.h b/modules/juce_core/files/juce_RangedDirectoryIterator.h index db34e893..c36bc35d 100644 --- a/modules/juce_core/files/juce_RangedDirectoryIterator.h +++ b/modules/juce_core/files/juce_RangedDirectoryIterator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_TemporaryFile.cpp b/modules/juce_core/files/juce_TemporaryFile.cpp index eda1edcd..c50f2381 100644 --- a/modules/juce_core/files/juce_TemporaryFile.cpp +++ b/modules/juce_core/files/juce_TemporaryFile.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_TemporaryFile.h b/modules/juce_core/files/juce_TemporaryFile.h index bc3aebe2..4e0e085c 100644 --- a/modules/juce_core/files/juce_TemporaryFile.h +++ b/modules/juce_core/files/juce_TemporaryFile.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_WildcardFileFilter.cpp b/modules/juce_core/files/juce_WildcardFileFilter.cpp index 74f69d67..d747e5e6 100644 --- a/modules/juce_core/files/juce_WildcardFileFilter.cpp +++ b/modules/juce_core/files/juce_WildcardFileFilter.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/files/juce_WildcardFileFilter.h b/modules/juce_core/files/juce_WildcardFileFilter.h index 1e1b6766..2c41a2df 100644 --- a/modules/juce_core/files/juce_WildcardFileFilter.h +++ b/modules/juce_core/files/juce_WildcardFileFilter.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_gui_basics/native/juce_common_MimeTypes.cpp b/modules/juce_core/files/juce_common_MimeTypes.cpp similarity index 94% rename from modules/juce_gui_basics/native/juce_common_MimeTypes.cpp rename to modules/juce_core/files/juce_common_MimeTypes.cpp index 0474ec34..65660074 100644 --- a/modules/juce_gui_basics/native/juce_common_MimeTypes.cpp +++ b/modules/juce_core/files/juce_common_MimeTypes.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -33,17 +33,34 @@ struct MimeTypeTableEntry static MimeTypeTableEntry table[641]; }; -static StringArray getMimeTypesForFileExtension (const String& fileExtension) +static StringArray getMatches (const String& toMatch, + const char* MimeTypeTableEntry::* matchField, + const char* MimeTypeTableEntry::* returnField) { StringArray result; for (auto type : MimeTypeTableEntry::table) - if (fileExtension == type.fileExtension) - result.add (type.mimeType); + if (toMatch == type.*matchField) + result.add (type.*returnField); return result; } +namespace MimeTypeTable +{ + +StringArray getMimeTypesForFileExtension (const String& fileExtension) +{ + return getMatches (fileExtension, &MimeTypeTableEntry::fileExtension, &MimeTypeTableEntry::mimeType); +} + +StringArray getFileExtensionsForMimeType (const String& mimeType) +{ + return getMatches (mimeType, &MimeTypeTableEntry::mimeType, &MimeTypeTableEntry::fileExtension); +} + +} // namespace MimeTypeTable + //============================================================================== MimeTypeTableEntry MimeTypeTableEntry::table[641] = { diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_1.cpp b/modules/juce_core/files/juce_common_MimeTypes.h similarity index 73% rename from modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_1.cpp rename to modules/juce_core/files/juce_common_MimeTypes.h index 77fd6207..1d79b41b 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_1.cpp +++ b/modules/juce_core/files/juce_common_MimeTypes.h @@ -23,4 +23,20 @@ ============================================================================== */ -#include "RTAS/juce_RTAS_Wrapper.cpp" +#pragma once + +namespace juce +{ + +namespace MimeTypeTable +{ + +/* @internal */ +StringArray getMimeTypesForFileExtension (const String& fileExtension); + +/* @internal */ +StringArray getFileExtensionsForMimeType (const String& mimeType); + +} // namespace MimeTypeTable + +} // namespace juce diff --git a/modules/juce_core/javascript/juce_JSON.cpp b/modules/juce_core/javascript/juce_JSON.cpp index 071fb00d..c7d96633 100644 --- a/modules/juce_core/javascript/juce_JSON.cpp +++ b/modules/juce_core/javascript/juce_JSON.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/javascript/juce_JSON.h b/modules/juce_core/javascript/juce_JSON.h index 21a48158..68538c9c 100644 --- a/modules/juce_core/javascript/juce_JSON.h +++ b/modules/juce_core/javascript/juce_JSON.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/javascript/juce_Javascript.cpp b/modules/juce_core/javascript/juce_Javascript.cpp index 58729990..3ad6c775 100644 --- a/modules/juce_core/javascript/juce_Javascript.cpp +++ b/modules/juce_core/javascript/juce_Javascript.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/javascript/juce_Javascript.h b/modules/juce_core/javascript/juce_Javascript.h index f52d95d7..e9d4e20c 100644 --- a/modules/juce_core/javascript/juce_Javascript.h +++ b/modules/juce_core/javascript/juce_Javascript.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/juce_core.cpp b/modules/juce_core/juce_core.cpp index 5ffbd6b4..067a189a 100644 --- a/modules/juce_core/juce_core.cpp +++ b/modules/juce_core/juce_core.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -128,6 +128,7 @@ //============================================================================== #include "containers/juce_AbstractFifo.cpp" #include "containers/juce_ArrayBase.cpp" +#include "containers/juce_ListenerList.cpp" #include "containers/juce_NamedValueSet.cpp" #include "containers/juce_OwnedArray.cpp" #include "containers/juce_PropertySet.cpp" @@ -248,6 +249,9 @@ #endif +#include "files/juce_common_MimeTypes.h" +#include "files/juce_common_MimeTypes.cpp" +#include "native/juce_android_AndroidDocument.cpp" #include "threads/juce_HighResolutionTimer.cpp" #include "threads/juce_WaitableEvent.cpp" #include "network/juce_URL.cpp" @@ -261,6 +265,8 @@ //============================================================================== #if JUCE_UNIT_TESTS #include "containers/juce_HashMap_test.cpp" + + #include "containers/juce_Optional_test.cpp" #endif //============================================================================== diff --git a/modules/juce_core/juce_core.h b/modules/juce_core/juce_core.h index 41a29220..ffc254e2 100644 --- a/modules/juce_core/juce_core.h +++ b/modules/juce_core/juce_core.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -32,7 +32,7 @@ ID: juce_core vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE core classes description: The essential set of basic JUCE classes, as required by all the other JUCE modules. Includes text, container, memory, threading and i/o functionality. website: http://www.juce.com/juce @@ -244,6 +244,7 @@ JUCE_END_IGNORE_WARNINGS_MSVC #include "memory/juce_ReferenceCountedObject.h" #include "memory/juce_ScopedPointer.h" #include "memory/juce_OptionalScopedPointer.h" +#include "containers/juce_Optional.h" #include "containers/juce_ScopedValueSetter.h" #include "memory/juce_Singleton.h" #include "memory/juce_WeakReference.h" @@ -342,6 +343,7 @@ JUCE_END_IGNORE_WARNINGS_MSVC #include "memory/juce_SharedResourcePointer.h" #include "memory/juce_AllocationHooks.h" #include "memory/juce_Reservoir.h" +#include "files/juce_AndroidDocument.h" #if JUCE_CORE_INCLUDE_OBJC_HELPERS && (JUCE_MAC || JUCE_IOS) #include "native/juce_mac_ObjCHelpers.h" diff --git a/modules/juce_core/juce_core.mm b/modules/juce_core/juce_core.mm index c8100ed2..3bff03f1 100644 --- a/modules/juce_core/juce_core.mm +++ b/modules/juce_core/juce_core.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/logging/juce_FileLogger.cpp b/modules/juce_core/logging/juce_FileLogger.cpp index 85f27977..31b80261 100644 --- a/modules/juce_core/logging/juce_FileLogger.cpp +++ b/modules/juce_core/logging/juce_FileLogger.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/logging/juce_FileLogger.h b/modules/juce_core/logging/juce_FileLogger.h index 5add0939..30c34736 100644 --- a/modules/juce_core/logging/juce_FileLogger.h +++ b/modules/juce_core/logging/juce_FileLogger.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/logging/juce_Logger.cpp b/modules/juce_core/logging/juce_Logger.cpp index 73f8c252..3871c5cb 100644 --- a/modules/juce_core/logging/juce_Logger.cpp +++ b/modules/juce_core/logging/juce_Logger.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/logging/juce_Logger.h b/modules/juce_core/logging/juce_Logger.h index a7170bfd..a0950a7f 100644 --- a/modules/juce_core/logging/juce_Logger.h +++ b/modules/juce_core/logging/juce_Logger.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/maths/juce_BigInteger.cpp b/modules/juce_core/maths/juce_BigInteger.cpp index 0e27ea91..226ddccc 100644 --- a/modules/juce_core/maths/juce_BigInteger.cpp +++ b/modules/juce_core/maths/juce_BigInteger.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/maths/juce_BigInteger.h b/modules/juce_core/maths/juce_BigInteger.h index d616a391..43051381 100644 --- a/modules/juce_core/maths/juce_BigInteger.h +++ b/modules/juce_core/maths/juce_BigInteger.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/maths/juce_Expression.cpp b/modules/juce_core/maths/juce_Expression.cpp index 6c3a21ca..f4dd5e45 100644 --- a/modules/juce_core/maths/juce_Expression.cpp +++ b/modules/juce_core/maths/juce_Expression.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/maths/juce_Expression.h b/modules/juce_core/maths/juce_Expression.h index f79aed79..a6fc4f9d 100644 --- a/modules/juce_core/maths/juce_Expression.h +++ b/modules/juce_core/maths/juce_Expression.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/maths/juce_MathsFunctions.h b/modules/juce_core/maths/juce_MathsFunctions.h index 4ead2726..166c3a70 100644 --- a/modules/juce_core/maths/juce_MathsFunctions.h +++ b/modules/juce_core/maths/juce_MathsFunctions.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/maths/juce_NormalisableRange.h b/modules/juce_core/maths/juce_NormalisableRange.h index 1375bb39..2909a5dc 100644 --- a/modules/juce_core/maths/juce_NormalisableRange.h +++ b/modules/juce_core/maths/juce_NormalisableRange.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/maths/juce_Random.cpp b/modules/juce_core/maths/juce_Random.cpp index dc14a53e..df9b2665 100644 --- a/modules/juce_core/maths/juce_Random.cpp +++ b/modules/juce_core/maths/juce_Random.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/maths/juce_Random.h b/modules/juce_core/maths/juce_Random.h index ff25e60d..73920ed5 100644 --- a/modules/juce_core/maths/juce_Random.h +++ b/modules/juce_core/maths/juce_Random.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/maths/juce_Range.h b/modules/juce_core/maths/juce_Range.h index de5a3f78..9ea8e319 100644 --- a/modules/juce_core/maths/juce_Range.h +++ b/modules/juce_core/maths/juce_Range.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/maths/juce_StatisticsAccumulator.h b/modules/juce_core/maths/juce_StatisticsAccumulator.h index 99463fe8..a69b7003 100644 --- a/modules/juce_core/maths/juce_StatisticsAccumulator.h +++ b/modules/juce_core/maths/juce_StatisticsAccumulator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_AllocationHooks.cpp b/modules/juce_core/memory/juce_AllocationHooks.cpp index d9466c62..b8fa4d2b 100644 --- a/modules/juce_core/memory/juce_AllocationHooks.cpp +++ b/modules/juce_core/memory/juce_AllocationHooks.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_AllocationHooks.h b/modules/juce_core/memory/juce_AllocationHooks.h index 9dec58f0..f2a904bc 100644 --- a/modules/juce_core/memory/juce_AllocationHooks.h +++ b/modules/juce_core/memory/juce_AllocationHooks.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_Atomic.h b/modules/juce_core/memory/juce_Atomic.h index bf1d0315..fd8f1ac7 100644 --- a/modules/juce_core/memory/juce_Atomic.h +++ b/modules/juce_core/memory/juce_Atomic.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_ByteOrder.h b/modules/juce_core/memory/juce_ByteOrder.h index d1295b38..ef05ca28 100644 --- a/modules/juce_core/memory/juce_ByteOrder.h +++ b/modules/juce_core/memory/juce_ByteOrder.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_ContainerDeletePolicy.h b/modules/juce_core/memory/juce_ContainerDeletePolicy.h index ab945842..1e3fcd2e 100644 --- a/modules/juce_core/memory/juce_ContainerDeletePolicy.h +++ b/modules/juce_core/memory/juce_ContainerDeletePolicy.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_HeapBlock.h b/modules/juce_core/memory/juce_HeapBlock.h index e43e8d1b..66a669ec 100644 --- a/modules/juce_core/memory/juce_HeapBlock.h +++ b/modules/juce_core/memory/juce_HeapBlock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h b/modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h index 06140abd..0bc2b534 100644 --- a/modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h +++ b/modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_LeakedObjectDetector.h b/modules/juce_core/memory/juce_LeakedObjectDetector.h index f14c7008..808b069a 100644 --- a/modules/juce_core/memory/juce_LeakedObjectDetector.h +++ b/modules/juce_core/memory/juce_LeakedObjectDetector.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_Memory.h b/modules/juce_core/memory/juce_Memory.h index 2a5fb187..eeac405a 100644 --- a/modules/juce_core/memory/juce_Memory.h +++ b/modules/juce_core/memory/juce_Memory.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_MemoryBlock.cpp b/modules/juce_core/memory/juce_MemoryBlock.cpp index 89be16ae..908c9b00 100644 --- a/modules/juce_core/memory/juce_MemoryBlock.cpp +++ b/modules/juce_core/memory/juce_MemoryBlock.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_MemoryBlock.h b/modules/juce_core/memory/juce_MemoryBlock.h index d42f8440..0a2d1fd9 100644 --- a/modules/juce_core/memory/juce_MemoryBlock.h +++ b/modules/juce_core/memory/juce_MemoryBlock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_OptionalScopedPointer.h b/modules/juce_core/memory/juce_OptionalScopedPointer.h index 74ceb47c..96ddf4d8 100644 --- a/modules/juce_core/memory/juce_OptionalScopedPointer.h +++ b/modules/juce_core/memory/juce_OptionalScopedPointer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_ReferenceCountedObject.h b/modules/juce_core/memory/juce_ReferenceCountedObject.h index 12c7aef8..3e6f9fd2 100644 --- a/modules/juce_core/memory/juce_ReferenceCountedObject.h +++ b/modules/juce_core/memory/juce_ReferenceCountedObject.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_Reservoir.h b/modules/juce_core/memory/juce_Reservoir.h index 614c62c1..3829f73e 100644 --- a/modules/juce_core/memory/juce_Reservoir.h +++ b/modules/juce_core/memory/juce_Reservoir.h @@ -2,19 +2,16 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE diff --git a/modules/juce_core/memory/juce_ScopedPointer.h b/modules/juce_core/memory/juce_ScopedPointer.h index 8d60f6d4..269dddb0 100644 --- a/modules/juce_core/memory/juce_ScopedPointer.h +++ b/modules/juce_core/memory/juce_ScopedPointer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_SharedResourcePointer.h b/modules/juce_core/memory/juce_SharedResourcePointer.h index 4f23168d..2f9a526b 100644 --- a/modules/juce_core/memory/juce_SharedResourcePointer.h +++ b/modules/juce_core/memory/juce_SharedResourcePointer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/memory/juce_Singleton.h b/modules/juce_core/memory/juce_Singleton.h index 629e8568..697b3312 100644 --- a/modules/juce_core/memory/juce_Singleton.h +++ b/modules/juce_core/memory/juce_Singleton.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -184,7 +184,7 @@ struct SingletonHolder : private MutexType // (inherited so we can use the empt #define JUCE_DECLARE_SINGLETON(Classname, doNotRecreateAfterDeletion) \ \ static juce::SingletonHolder singletonHolder; \ - friend decltype (singletonHolder); \ + friend juce::SingletonHolder; \ \ static Classname* JUCE_CALLTYPE getInstance() { return singletonHolder.get(); } \ static Classname* JUCE_CALLTYPE getInstanceWithoutCreating() noexcept { return singletonHolder.instance; } \ diff --git a/modules/juce_core/memory/juce_WeakReference.h b/modules/juce_core/memory/juce_WeakReference.h index 64fae8d8..fbb3cecd 100644 --- a/modules/juce_core/memory/juce_WeakReference.h +++ b/modules/juce_core/memory/juce_WeakReference.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/misc/juce_ConsoleApplication.cpp b/modules/juce_core/misc/juce_ConsoleApplication.cpp index 389131a3..7b6e172a 100644 --- a/modules/juce_core/misc/juce_ConsoleApplication.cpp +++ b/modules/juce_core/misc/juce_ConsoleApplication.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/misc/juce_ConsoleApplication.h b/modules/juce_core/misc/juce_ConsoleApplication.h index ae7b1b26..b98d1cfb 100644 --- a/modules/juce_core/misc/juce_ConsoleApplication.h +++ b/modules/juce_core/misc/juce_ConsoleApplication.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/misc/juce_Functional.h b/modules/juce_core/misc/juce_Functional.h index c84bdaf5..6ed1729a 100644 --- a/modules/juce_core/misc/juce_Functional.h +++ b/modules/juce_core/misc/juce_Functional.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -36,6 +36,9 @@ namespace detail template struct EqualityComparableToNullptr() != nullptr)>> : std::true_type {}; + + template + constexpr bool shouldCheckAgainstNullptr = EqualityComparableToNullptr::value; } // namespace detail #endif @@ -51,15 +54,19 @@ namespace detail struct NullCheckedInvocation { template ::value, int> = 0> + std::enable_if_t, int> = 0> static void invoke (Callable&& fn, Args&&... args) { + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Waddress") + if (fn != nullptr) fn (std::forward (args)...); + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE } template ::value, int> = 0> + std::enable_if_t, int> = 0> static void invoke (Callable&& fn, Args&&... args) { fn (std::forward (args)...); @@ -69,4 +76,20 @@ struct NullCheckedInvocation static void invoke (std::nullptr_t, Args&&...) {} }; +/** Can be used to disable template constructors that would otherwise cause ambiguity with + compiler-generated copy and move constructors. + + Adapted from https://ericniebler.com/2013/08/07/universal-references-and-the-copy-constructo/ +*/ +template +using DisableIfSameOrDerived = typename std::enable_if_t>::value>; + +/** Copies an object, sets one of the copy's members to the specified value, and then returns the copy. */ +template +Object withMember (Object copy, Member OtherObject::* member, Member&& value) +{ + copy.*member = std::forward (value); + return copy; +} + } // namespace juce diff --git a/modules/juce_core/misc/juce_Result.cpp b/modules/juce_core/misc/juce_Result.cpp index f15b4aa3..1a09286e 100644 --- a/modules/juce_core/misc/juce_Result.cpp +++ b/modules/juce_core/misc/juce_Result.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/misc/juce_Result.h b/modules/juce_core/misc/juce_Result.h index 52cbb542..f424d40d 100644 --- a/modules/juce_core/misc/juce_Result.h +++ b/modules/juce_core/misc/juce_Result.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/misc/juce_RuntimePermissions.cpp b/modules/juce_core/misc/juce_RuntimePermissions.cpp index 99b186dc..d8517e78 100644 --- a/modules/juce_core/misc/juce_RuntimePermissions.cpp +++ b/modules/juce_core/misc/juce_RuntimePermissions.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/misc/juce_RuntimePermissions.h b/modules/juce_core/misc/juce_RuntimePermissions.h index caf08032..c09e2547 100644 --- a/modules/juce_core/misc/juce_RuntimePermissions.h +++ b/modules/juce_core/misc/juce_RuntimePermissions.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/misc/juce_Uuid.cpp b/modules/juce_core/misc/juce_Uuid.cpp index 5883039e..40f57588 100644 --- a/modules/juce_core/misc/juce_Uuid.cpp +++ b/modules/juce_core/misc/juce_Uuid.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/misc/juce_Uuid.h b/modules/juce_core/misc/juce_Uuid.h index 99cddd19..e8b25dd9 100644 --- a/modules/juce_core/misc/juce_Uuid.h +++ b/modules/juce_core/misc/juce_Uuid.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/misc/juce_WindowsRegistry.h b/modules/juce_core/misc/juce_WindowsRegistry.h index 121bf617..564c8a60 100644 --- a/modules/juce_core/misc/juce_WindowsRegistry.h +++ b/modules/juce_core/misc/juce_WindowsRegistry.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/java/app/com/rmsl/juce/FragmentOverlay.java b/modules/juce_core/native/java/app/com/rmsl/juce/FragmentOverlay.java index 92091730..57fb183d 100644 --- a/modules/juce_core/native/java/app/com/rmsl/juce/FragmentOverlay.java +++ b/modules/juce_core/native/java/app/com/rmsl/juce/FragmentOverlay.java @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/java/app/com/rmsl/juce/JuceHTTPStream.java b/modules/juce_core/native/java/app/com/rmsl/juce/JuceHTTPStream.java index 261c779f..95302b31 100644 --- a/modules/juce_core/native/java/app/com/rmsl/juce/JuceHTTPStream.java +++ b/modules/juce_core/native/java/app/com/rmsl/juce/JuceHTTPStream.java @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/java/app/com/rmsl/juce/JuceInvocationHandler.java b/modules/juce_core/native/java/app/com/rmsl/juce/JuceInvocationHandler.java index 2fdb26db..1f37d432 100644 --- a/modules/juce_core/native/java/app/com/rmsl/juce/JuceInvocationHandler.java +++ b/modules/juce_core/native/java/app/com/rmsl/juce/JuceInvocationHandler.java @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/javacore/app/com/rmsl/juce/JuceApp.java b/modules/juce_core/native/javacore/app/com/rmsl/juce/JuceApp.java index c48e27e9..6374eb24 100644 --- a/modules/juce_core/native/javacore/app/com/rmsl/juce/JuceApp.java +++ b/modules/juce_core/native/javacore/app/com/rmsl/juce/JuceApp.java @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/javacore/init/com/rmsl/juce/Java.java b/modules/juce_core/native/javacore/init/com/rmsl/juce/Java.java index 896d6bd9..444c93ab 100644 --- a/modules/juce_core/native/javacore/init/com/rmsl/juce/Java.java +++ b/modules/juce_core/native/javacore/init/com/rmsl/juce/Java.java @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_BasicNativeHeaders.h b/modules/juce_core/native/juce_BasicNativeHeaders.h index acf7d041..c45ac6e3 100644 --- a/modules/juce_core/native/juce_BasicNativeHeaders.h +++ b/modules/juce_core/native/juce_BasicNativeHeaders.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -154,6 +154,8 @@ #include #include #include + #include + #include #if ! JUCE_CXX17_IS_AVAILABLE #pragma push_macro ("WIN_NOEXCEPT") diff --git a/modules/juce_core/native/juce_android_AndroidDocument.cpp b/modules/juce_core/native/juce_android_AndroidDocument.cpp new file mode 100644 index 00000000..5b09605f --- /dev/null +++ b/modules/juce_core/native/juce_android_AndroidDocument.cpp @@ -0,0 +1,1085 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2020 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +/* This is mainly used to pass implementation information from AndroidDocument to + AndroidDocumentIterator. This needs to be defined in a .cpp because it uses the internal + GlobalRef type. + + To preserve encapsulation, this struct should only contain information that would normally be + public, were internal types not in use. +*/ +struct AndroidDocument::NativeInfo +{ + #if JUCE_ANDROID + GlobalRef uri; + #endif +}; + +//============================================================================== +struct AndroidDocumentDetail +{ + ~AndroidDocumentDetail() = delete; // This struct is a single-file namespace + + struct Opt + { + Opt() = default; + + explicit Opt (int64 v) : value (v), valid (true) {} + + int64 value = 0; + bool valid = false; + }; + + static constexpr auto dirMime = "vnd.android.document/directory"; + + #if JUCE_ANDROID + /* + A very basic type that acts a bit like an iterator, in that it can be incremented, and read-from. + + Instances of this type can be passed to the constructor of AndroidDirectoryIterator to provide + stdlib-like iterator facilities. + */ + template + class AndroidIteratorEngine + { + public: + AndroidIteratorEngine (Columns columnsIn, jobject uri) + : columns (std::move (columnsIn)), + cursor { LocalRef { getEnv()->CallObjectMethod (AndroidContentUriResolver::getContentResolver().get(), + ContentResolver.query, + uri, + columns.getColumnNames().get(), + nullptr, + nullptr, + nullptr) } } + { + // Creating the cursor may throw if the document doesn't exist. + // In that case, cursor will still be null. + jniCheckHasExceptionOccurredAndClear(); + } + + auto read() const { return columns.readFromCursor (cursor.get()); } + + bool increment() + { + if (cursor.get() == nullptr) + return false; + + return getEnv()->CallBooleanMethod (cursor.get(), AndroidCursor.moveToNext); + } + + private: + Columns columns; + GlobalRef cursor; + }; + + template + static LocalRef makeStringArray (std::index_sequence, Args&&... args) + { + auto* env = getEnv(); + LocalRef array { env->NewObjectArray (sizeof... (args), JavaString, nullptr) }; + + int unused[] { (env->SetObjectArrayElement (array.get(), Ix, args.get()), 0)... }; + ignoreUnused (unused); + + return array; + } + + template + static LocalRef makeStringArray (Args&&... args) + { + return makeStringArray (std::make_index_sequence(), std::forward (args)...); + } + + static URL uriToUrl (jobject uri) + { + return URL (juceString ((jstring) getEnv()->CallObjectMethod (uri, AndroidUri.toString))); + } + + struct Columns + { + GlobalRef treeUri; + GlobalRefImpl idColumn; + + auto getColumnNames() const + { + return makeStringArray (idColumn); + } + + auto readFromCursor (jobject cursor) const + { + auto* env = getEnv(); + const auto idColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, idColumn.get()); + + const auto documentUri = [&] + { + if (idColumnIndex < 0) + return LocalRef{}; + + LocalRef documentId { (jstring) env->CallObjectMethod (cursor, AndroidCursor.getString, idColumnIndex) }; + return LocalRef { getEnv()->CallStaticObjectMethod (DocumentsContract21, + DocumentsContract21.buildDocumentUriUsingTree, + treeUri.get(), + documentId.get()) }; + }(); + + return AndroidDocument::fromDocument (uriToUrl (documentUri)); + } + }; + + using DocumentsContractIteratorEngine = AndroidIteratorEngine; + + static DocumentsContractIteratorEngine makeDocumentsContractIteratorEngine (const GlobalRef& uri) + { + const LocalRef documentId { getEnv()->CallStaticObjectMethod (DocumentsContract19, + DocumentsContract19.getDocumentId, + uri.get()) }; + const LocalRef childrenUri { getEnv()->CallStaticObjectMethod (DocumentsContract21, + DocumentsContract21.buildChildDocumentsUriUsingTree, + uri.get(), + documentId.get()) }; + + return DocumentsContractIteratorEngine { Columns { GlobalRef { uri }, + GlobalRefImpl { javaString("document_id") } }, + childrenUri.get() }; + } + + class RecursiveEngine + { + public: + explicit RecursiveEngine (GlobalRef uri) + : engine (makeDocumentsContractIteratorEngine (uri)) {} + + AndroidDocument read() const + { + return subIterator != nullptr ? subIterator->read() : engine.read(); + } + + bool increment() + { + if (directory && subIterator == nullptr) + subIterator = std::make_unique (engine.read().getNativeInfo().uri); + + if (subIterator != nullptr) + { + if (subIterator->increment()) + return true; + + subIterator = nullptr; + } + + if (! engine.increment()) + return false; + + directory = engine.read().getInfo().isDirectory(); + return true; + } + + private: + DocumentsContractIteratorEngine engine; + std::unique_ptr subIterator; + bool directory = false; + }; + + enum { FLAG_GRANT_READ_URI_PERMISSION = 1, FLAG_GRANT_WRITE_URI_PERMISSION = 2 }; + + static void setPermissions (const URL& url, jmethodID func) + { + if (getAndroidSDKVersion() < 19) + return; + + const auto javaUri = urlToUri (url); + + if (const auto resolver = AndroidContentUriResolver::getContentResolver()) + { + const jint flags = FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION; + getEnv()->CallVoidMethod (resolver, func, javaUri.get(), flags); + jniCheckHasExceptionOccurredAndClear(); + } + } + #endif + + struct DirectoryIteratorEngine + { + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996) + DirectoryIteratorEngine (const File& dir, bool recursive) + : iterator (dir, recursive, "*", File::findFilesAndDirectories) {} + JUCE_END_IGNORE_WARNINGS_MSVC + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + auto read() const { return AndroidDocument::fromFile (iterator.getFile()); } + bool increment() { return iterator.next(); } + DirectoryIterator iterator; + }; + +}; + +//============================================================================== +class AndroidDocumentInfo::Args +{ +public: + using Detail = AndroidDocumentDetail; + + Args withName (String x) const { return with (&Args::name, std::move (x)); } + Args withType (String x) const { return with (&Args::type, std::move (x)); } + Args withFlags (int x) const { return with (&Args::flags, x); } + Args withSize (Detail::Opt x) const { return with (&Args::sizeInBytes, x); } + Args withModified (Detail::Opt x) const { return with (&Args::lastModified, x); } + Args withReadPermission (bool x) const { return with (&Args::readPermission, x); } + Args withWritePermission (bool x) const { return with (&Args::writePermission, x); } + + String name; + String type; + Detail::Opt sizeInBytes, lastModified; + int flags = 0; + bool readPermission = false, writePermission = false; + + static int getFlagsForFile (const File& file) + { + int flags = 0; + + if (file.hasReadAccess()) + flags |= AndroidDocumentInfo::flagSupportsCopy; + + if (file.hasWriteAccess()) + flags |= AndroidDocumentInfo::flagSupportsWrite + | AndroidDocumentInfo::flagDirSupportsCreate + | AndroidDocumentInfo::flagSupportsMove + | AndroidDocumentInfo::flagSupportsRename + | AndroidDocumentInfo::flagSupportsDelete; + + return flags; + } + + AndroidDocumentInfo build() const + { + return AndroidDocumentInfo (*this); + } + +private: + template + Args with (Value Args::* member, Value v) const + { + auto copy = *this; + copy.*member = std::move (v); + return copy; + } +}; + +AndroidDocumentInfo::AndroidDocumentInfo (Args args) + : name (args.name), + type (args.type), + lastModified (args.lastModified.value), + sizeInBytes (args.sizeInBytes.value), + nativeFlags (args.flags), + juceFlags (flagExists + | (args.lastModified.valid ? flagValidModified : 0) + | (args.sizeInBytes.valid ? flagValidSize : 0) + | (args.readPermission ? flagHasReadPermission : 0) + | (args.writePermission ? flagHasWritePermission : 0)) +{ +} + +bool AndroidDocumentInfo::isDirectory() const { return type == AndroidDocumentDetail::dirMime; } + +//============================================================================== +class AndroidDocument::Pimpl +{ +public: + Pimpl() = default; + Pimpl (const Pimpl&) = default; + Pimpl (Pimpl&&) noexcept = default; + Pimpl& operator= (const Pimpl&) = default; + Pimpl& operator= (Pimpl&&) noexcept = default; + + virtual ~Pimpl() = default; + virtual std::unique_ptr clone() const = 0; + virtual bool deleteDocument() const = 0; + virtual std::unique_ptr createInputStream() const = 0; + virtual std::unique_ptr createOutputStream() const = 0; + virtual AndroidDocumentInfo getInfo() const = 0; + virtual URL getUrl() const = 0; + virtual NativeInfo getNativeInfo() const = 0; + + virtual std::unique_ptr copyDocumentToParentDocument (const Pimpl&) const + { + // This function is not supported on the current platform. + jassertfalse; + return {}; + } + + virtual std::unique_ptr moveDocumentFromParentToParent (const Pimpl&, const Pimpl&) const + { + // This function is not supported on the current platform. + jassertfalse; + return {}; + } + + virtual std::unique_ptr renameTo (const String&) const + { + // This function is not supported on the current platform. + jassertfalse; + return {}; + } + + virtual std::unique_ptr createChildDocumentWithTypeAndName (const String&, const String&) const + { + // This function is not supported on the current platform. + jassertfalse; + return {}; + } + + File getFile() const { return getUrl().getLocalFile(); } + + static const Pimpl& getPimpl (const AndroidDocument& doc) { return *doc.pimpl; } +}; + +//============================================================================== +struct AndroidDocument::Utils +{ + using Detail = AndroidDocumentDetail; + + ~Utils() = delete; // This stuct is a single-file namespace + + #if JUCE_ANDROID + template struct VersionTag { int version; }; + + class MimeConverter + { + public: + String getMimeTypeFromExtension (const String& str) const + { + const auto javaStr = javaString (str); + return juceString ((jstring) getEnv()->CallObjectMethod (map.get(), + AndroidMimeTypeMap.getMimeTypeFromExtension, + javaStr.get())); + } + + String getExtensionFromMimeType (const String& str) const + { + const auto javaStr = javaString (str); + return juceString ((jstring) getEnv()->CallObjectMethod (map.get(), + AndroidMimeTypeMap.getExtensionFromMimeType, + javaStr.get())); + } + + private: + GlobalRef map { LocalRef { getEnv()->CallStaticObjectMethod (AndroidMimeTypeMap, + AndroidMimeTypeMap.getSingleton) } }; + }; + + class AndroidDocumentPimplApi19 : public Pimpl + { + public: + AndroidDocumentPimplApi19() = default; + + explicit AndroidDocumentPimplApi19 (const URL& uriIn) + : AndroidDocumentPimplApi19 (urlToUri (uriIn)) {} + + explicit AndroidDocumentPimplApi19 (const LocalRef& uriIn) + : uri (uriIn) {} + + std::unique_ptr clone() const override { return std::make_unique (*this); } + + bool deleteDocument() const override + { + if (const auto resolver = AndroidContentUriResolver::getContentResolver()) + { + return getEnv()->CallStaticBooleanMethod (DocumentsContract19, + DocumentsContract19.deleteDocument, + resolver.get(), + uri.get()); + } + + return false; + } + + std::unique_ptr createInputStream() const override + { + return makeStream (AndroidStreamHelpers::StreamKind::input); + } + + std::unique_ptr createOutputStream() const override + { + return makeStream (AndroidStreamHelpers::StreamKind::output); + } + + AndroidDocumentInfo getInfo() const override + { + struct Columns + { + auto getColumnNames() const + { + return Detail::makeStringArray (flagsColumn, nameColumn, mimeColumn, idColumn, modifiedColumn, sizeColumn); + } + + auto readFromCursor (jobject cursor) const + { + auto* env = getEnv(); + + const auto flagsColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, flagsColumn.get()); + const auto nameColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, nameColumn.get()); + const auto mimeColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, mimeColumn.get()); + const auto idColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, idColumn.get()); + const auto modColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, modifiedColumn.get()); + const auto sizeColumnIndex = env->CallIntMethod (cursor, AndroidCursor.getColumnIndex, sizeColumn.get()); + + const auto indices = { flagsColumnIndex, nameColumnIndex, mimeColumnIndex, idColumnIndex, modColumnIndex, sizeColumnIndex }; + + if (std::any_of (indices.begin(), indices.end(), [] (auto index) { return index < 0; })) + return AndroidDocumentInfo::Args{}; + + const LocalRef nameString { (jstring) env->CallObjectMethod (cursor, AndroidCursor.getString, nameColumnIndex) }; + const LocalRef mimeString { (jstring) env->CallObjectMethod (cursor, AndroidCursor.getString, mimeColumnIndex) }; + + const auto readOpt = [&] (int column) -> Detail::Opt + { + const auto missing = env->CallBooleanMethod (cursor, AndroidCursor.isNull, column); + + if (missing) + return {}; + + return Detail::Opt { env->CallLongMethod (cursor, AndroidCursor.getLong, column) }; + }; + + return AndroidDocumentInfo::Args{}.withName (juceString (nameString.get())) + .withType (juceString (mimeString.get())) + .withFlags (env->CallIntMethod (cursor, AndroidCursor.getInt, flagsColumnIndex)) + .withModified (readOpt (modColumnIndex)) + .withSize (readOpt (sizeColumnIndex)); + } + + GlobalRefImpl flagsColumn { javaString ("flags") }; + GlobalRefImpl nameColumn { javaString ("_display_name") }; + GlobalRefImpl mimeColumn { javaString ("mime_type") }; + GlobalRefImpl idColumn { javaString ("document_id") }; + GlobalRefImpl modifiedColumn { javaString ("last_modified") }; + GlobalRefImpl sizeColumn { javaString ("_size") }; + }; + + Detail::AndroidIteratorEngine iterator { Columns{}, uri }; + + if (! iterator.increment()) + return AndroidDocumentInfo{}; + + auto* env = getEnv(); + auto ctx = getAppContext(); + + const auto hasPermission = [&] (auto permission) + { + return env->CallIntMethod (ctx, AndroidContext.checkCallingOrSelfUriPermission, uri.get(), permission) == 0; + }; + + return iterator.read() + .withReadPermission (hasPermission (Detail::FLAG_GRANT_READ_URI_PERMISSION)) + .withWritePermission (hasPermission (Detail::FLAG_GRANT_WRITE_URI_PERMISSION)) + .build(); + } + + URL getUrl() const override + { + return Detail::uriToUrl (uri); + } + + NativeInfo getNativeInfo() const override { return { uri }; } + + private: + template + std::unique_ptr makeStream (AndroidStreamHelpers::StreamKind kind) const + { + auto stream = AndroidStreamHelpers::createStream (uri, kind); + + return stream.get() != nullptr ? std::make_unique (std::move (stream)) + : nullptr; + } + + GlobalRef uri; + }; + + //============================================================================== + class AndroidDocumentPimplApi21 : public AndroidDocumentPimplApi19 + { + public: + using AndroidDocumentPimplApi19::AndroidDocumentPimplApi19; + + std::unique_ptr clone() const override { return std::make_unique (*this); } + + std::unique_ptr createChildDocumentWithTypeAndName (const String& type, const String& name) const override + { + return Utils::createPimplForSdk (LocalRef { getEnv()->CallStaticObjectMethod (DocumentsContract21, + DocumentsContract21.createDocument, + AndroidContentUriResolver::getContentResolver().get(), + getNativeInfo().uri.get(), + javaString (type).get(), + javaString (name).get()) }); + } + + std::unique_ptr renameTo (const String& name) const override + { + if (const auto resolver = AndroidContentUriResolver::getContentResolver()) + { + return Utils::createPimplForSdk (LocalRef { getEnv()->CallStaticObjectMethod (DocumentsContract21, + DocumentsContract21.renameDocument, + resolver.get(), + getNativeInfo().uri.get(), + javaString (name).get()) }); + } + + return nullptr; + } + }; + + //============================================================================== + class AndroidDocumentPimplApi24 final : public AndroidDocumentPimplApi21 + { + public: + using AndroidDocumentPimplApi21::AndroidDocumentPimplApi21; + + std::unique_ptr clone() const override { return std::make_unique (*this); } + + std::unique_ptr copyDocumentToParentDocument (const Pimpl& target) const override + { + if (target.getNativeInfo().uri == nullptr) + { + // Cannot copy to a non-URI-based AndroidDocument + return {}; + } + + return Utils::createPimplForSdk (LocalRef { getEnv()->CallStaticObjectMethod (DocumentsContract24, + DocumentsContract24.copyDocument, + AndroidContentUriResolver::getContentResolver().get(), + getNativeInfo().uri.get(), + target.getNativeInfo().uri.get()) }); + } + + std::unique_ptr moveDocumentFromParentToParent (const Pimpl& currentParent, const Pimpl& newParent) const override + { + if (currentParent.getNativeInfo().uri == nullptr || newParent.getNativeInfo().uri == nullptr) + { + // Cannot move document between non-URI-based AndroidDocuments + return {}; + } + + return Utils::createPimplForSdk (LocalRef { getEnv()->CallStaticObjectMethod (DocumentsContract24, + DocumentsContract24.moveDocument, + AndroidContentUriResolver::getContentResolver().get(), + getNativeInfo().uri.get(), + currentParent.getNativeInfo().uri.get(), + newParent.getNativeInfo().uri.get()) }); + } + }; + + static std::unique_ptr createPimplForSdk (const LocalRef& uri) + { + if (jniCheckHasExceptionOccurredAndClear()) + return nullptr; + + return createPimplForSdkImpl (uri, + VersionTag { 24 }, + VersionTag { 21 }, + VersionTag { 19 }); + } + + static std::unique_ptr createPimplForSdkImpl (const LocalRef&) + { + // Failed to find a suitable implementation for this platform + jassertfalse; + return nullptr; + } + + template + static std::unique_ptr createPimplForSdkImpl (const LocalRef& uri, + VersionTag head, + VersionTag... tail) + { + if (head.version <= getAndroidSDKVersion()) + return std::make_unique (uri); + + return createPimplForSdkImpl (uri, tail...); + } + + #else + class MimeConverter + { + public: + static String getMimeTypeFromExtension (const String& str) + { + return MimeTypeTable::getMimeTypesForFileExtension (str)[0]; + } + + static String getExtensionFromMimeType (const String& str) + { + return MimeTypeTable::getFileExtensionsForMimeType (str)[0]; + } + }; + #endif + + //============================================================================== + class AndroidDocumentPimplFile final : public Pimpl + { + public: + explicit AndroidDocumentPimplFile (const File& f) + : file (f) + { + } + + std::unique_ptr clone() const override { return std::make_unique (*this); } + + bool deleteDocument() const override + { + return file.deleteRecursively (false); + } + + std::unique_ptr renameTo (const String& name) const override + { + const auto target = file.getSiblingFile (name); + + return file.moveFileTo (target) ? std::make_unique (target) + : nullptr; + } + + std::unique_ptr createInputStream() const override { return file.createInputStream(); } + + std::unique_ptr createOutputStream() const override + { + auto result = file.createOutputStream(); + result->setPosition (0); + result->truncate(); + return result; + } + + std::unique_ptr copyDocumentToParentDocument (const Pimpl& target) const override + { + const auto parent = target.getFile(); + + if (parent == File()) + return nullptr; + + const auto actual = parent.getChildFile (file.getFileName()); + + if (actual.exists()) + return nullptr; + + const auto success = file.isDirectory() ? file.copyDirectoryTo (actual) + : file.copyFileTo (actual); + + return success ? std::make_unique (actual) + : nullptr; + } + + std::unique_ptr createChildDocumentWithTypeAndName (const String& type, + const String& name) const override + { + const auto extension = mimeConverter.getExtensionFromMimeType (type); + const auto target = file.getChildFile (extension.isNotEmpty() ? name + "." + extension : name); + + if (! target.exists() && (type == Detail::dirMime ? target.createDirectory() : target.create())) + return std::make_unique (target); + + return nullptr; + } + + std::unique_ptr moveDocumentFromParentToParent (const Pimpl& currentParentPimpl, + const Pimpl& newParentPimpl) const override + { + const auto currentParent = currentParentPimpl.getFile(); + const auto newParent = newParentPimpl.getFile(); + + if (! file.isAChildOf (currentParent) || newParent == File()) + return nullptr; + + const auto target = newParent.getChildFile (file.getFileName()); + + if (target.exists() || ! file.moveFileTo (target)) + return nullptr; + + return std::make_unique (target); + } + + AndroidDocumentInfo getInfo() const override + { + if (! file.exists()) + return AndroidDocumentInfo{}; + + const auto size = file.getSize(); + const auto extension = file.getFileExtension().removeCharacters (".").toLowerCase(); + const auto type = file.isDirectory() ? Detail::dirMime + : mimeConverter.getMimeTypeFromExtension (extension); + + return AndroidDocumentInfo::Args{}.withName (file.getFileName()) + .withType (type.isNotEmpty() ? type : "application/octet-stream") + .withFlags (AndroidDocumentInfo::Args::getFlagsForFile (file)) + .withModified (Detail::Opt { file.getLastModificationTime().toMilliseconds() }) + .withSize (size != 0 ? Detail::Opt { size } : Detail::Opt{}) + .withReadPermission (file.hasReadAccess()) + .withWritePermission (file.hasWriteAccess()) + .build(); + } + + URL getUrl() const override { return URL (file); } + + NativeInfo getNativeInfo() const override { return {}; } + + private: + File file; + MimeConverter mimeConverter; + }; +}; + +//============================================================================== +void AndroidDocumentPermission::takePersistentReadWriteAccess (const URL& url) +{ + #if JUCE_ANDROID + AndroidDocumentDetail::setPermissions (url, ContentResolver19.takePersistableUriPermission); + #else + ignoreUnused (url); + #endif +} + +void AndroidDocumentPermission::releasePersistentReadWriteAccess (const URL& url) +{ + #if JUCE_ANDROID + AndroidDocumentDetail::setPermissions (url, ContentResolver19.releasePersistableUriPermission); + #else + ignoreUnused (url); + #endif +} + +std::vector AndroidDocumentPermission::getPersistedPermissions() +{ + #if ! JUCE_ANDROID + return {}; + #else + if (getAndroidSDKVersion() < 19) + return {}; + + auto* env = getEnv(); + const LocalRef permissions { env->CallObjectMethod (AndroidContentUriResolver::getContentResolver().get(), + ContentResolver19.getPersistedUriPermissions) }; + + if (permissions == nullptr) + return {}; + + std::vector result; + const auto size = env->CallIntMethod (permissions, JavaList.size); + + for (auto i = (decltype (size)) 0; i < size; ++i) + { + const LocalRef uriPermission { env->CallObjectMethod (permissions, JavaList.get, i) }; + + AndroidDocumentPermission permission; + permission.time = env->CallLongMethod (uriPermission, AndroidUriPermission.getPersistedTime); + permission.read = env->CallBooleanMethod (uriPermission, AndroidUriPermission.isReadPermission); + permission.write = env->CallBooleanMethod (uriPermission, AndroidUriPermission.isWritePermission); + permission.url = AndroidDocumentDetail::uriToUrl (env->CallObjectMethod (uriPermission, AndroidUriPermission.getUri)); + + result.push_back (std::move (permission)); + } + + return result; + #endif +} + +//============================================================================== +AndroidDocument::AndroidDocument() = default; + +AndroidDocument AndroidDocument::fromFile (const File& filePath) +{ + #if JUCE_ANDROID + const LocalRef info { getEnv()->CallObjectMethod (getAppContext(), AndroidContext.getApplicationInfo) }; + const auto targetSdkVersion = getEnv()->GetIntField (info.get(), AndroidApplicationInfo.targetSdkVersion); + + // At the current API level, plain file paths may not work for accessing files in shared + // locations. It's recommended to use fromDocument() or fromTree() instead when targeting this + // API level. + jassert (__ANDROID_API_Q__ <= targetSdkVersion); + #endif + + return AndroidDocument { filePath != File() ? std::make_unique (filePath) + : nullptr }; +} + +AndroidDocument AndroidDocument::fromDocument (const URL& documentUrl) +{ + #if JUCE_ANDROID + if (getAndroidSDKVersion() < 19) + { + // This function is unsupported on this platform. + jassertfalse; + return AndroidDocument{}; + } + + const auto javaUri = urlToUri (documentUrl); + + if (! getEnv()->CallStaticBooleanMethod (DocumentsContract19, + DocumentsContract19.isDocumentUri, + getAppContext().get(), + javaUri.get())) + { + return AndroidDocument{}; + } + + return AndroidDocument { Utils::createPimplForSdk (javaUri) }; + #else + ignoreUnused (documentUrl); + return AndroidDocument{}; + #endif +} + +AndroidDocument AndroidDocument::fromTree (const URL& treeUrl) +{ + #if JUCE_ANDROID + if (getAndroidSDKVersion() < 21) + { + // This function is unsupported on this platform. + jassertfalse; + return AndroidDocument{}; + } + + const auto javaUri = urlToUri (treeUrl); + LocalRef treeDocumentId { getEnv()->CallStaticObjectMethod (DocumentsContract21, + DocumentsContract21.getTreeDocumentId, + javaUri.get()) }; + + jniCheckHasExceptionOccurredAndClear(); + + if (treeDocumentId == nullptr) + { + jassertfalse; + return AndroidDocument{}; + } + + LocalRef documentUri { getEnv()->CallStaticObjectMethod (DocumentsContract21, + DocumentsContract21.buildDocumentUriUsingTree, + javaUri.get(), + treeDocumentId.get()) }; + + return AndroidDocument { Utils::createPimplForSdk (documentUri) }; + #else + ignoreUnused (treeUrl); + return AndroidDocument{}; + #endif +} + +AndroidDocument::AndroidDocument (const AndroidDocument& other) + : AndroidDocument (other.pimpl != nullptr ? other.pimpl->clone() : nullptr) {} + +AndroidDocument::AndroidDocument (std::unique_ptr pimplIn) + : pimpl (std::move (pimplIn)) {} + +AndroidDocument::AndroidDocument (AndroidDocument&&) noexcept = default; + +AndroidDocument& AndroidDocument::operator= (const AndroidDocument& other) +{ + AndroidDocument { other }.swap (*this); + return *this; +} + +AndroidDocument& AndroidDocument::operator= (AndroidDocument&&) noexcept = default; + +AndroidDocument::~AndroidDocument() = default; + +bool AndroidDocument::deleteDocument() const { return pimpl->deleteDocument(); } + +bool AndroidDocument::renameTo (const String& newDisplayName) +{ + jassert (hasValue()); + + auto renamed = pimpl->renameTo (newDisplayName); + + if (renamed == nullptr) + return false; + + pimpl = std::move (renamed); + return true; +} + +AndroidDocument AndroidDocument::copyDocumentToParentDocument (const AndroidDocument& target) const +{ + jassert (hasValue() && target.hasValue()); + return AndroidDocument { pimpl->copyDocumentToParentDocument (*target.pimpl) }; +} + +AndroidDocument AndroidDocument::createChildDocumentWithTypeAndName (const String& type, + const String& name) const +{ + jassert (hasValue()); + return AndroidDocument { pimpl->createChildDocumentWithTypeAndName (type, name) }; +} + +AndroidDocument AndroidDocument::createChildDirectory (const String& name) const +{ + return createChildDocumentWithTypeAndName (AndroidDocumentDetail::dirMime, name); +} + +bool AndroidDocument::moveDocumentFromParentToParent (const AndroidDocument& currentParent, + const AndroidDocument& newParent) +{ + jassert (hasValue() && currentParent.hasValue() && newParent.hasValue()); + auto moved = pimpl->moveDocumentFromParentToParent (*currentParent.pimpl, *newParent.pimpl); + + if (moved == nullptr) + return false; + + pimpl = std::move (moved); + return true; +} + +std::unique_ptr AndroidDocument::createInputStream() const +{ + jassert (hasValue()); + return pimpl->createInputStream(); +} + +std::unique_ptr AndroidDocument::createOutputStream() const +{ + jassert (hasValue()); + return pimpl->createOutputStream(); +} + +URL AndroidDocument::getUrl() const +{ + jassert (hasValue()); + return pimpl->getUrl(); +} + +AndroidDocumentInfo AndroidDocument::getInfo() const +{ + jassert (hasValue()); + return pimpl->getInfo(); +} + +bool AndroidDocument::operator== (const AndroidDocument& other) const +{ + return getUrl() == other.getUrl(); +} + +bool AndroidDocument::operator!= (const AndroidDocument& other) const +{ + return ! operator== (other); +} + +AndroidDocument::NativeInfo AndroidDocument::getNativeInfo() const +{ + jassert (hasValue()); + return pimpl->getNativeInfo(); +} + +//============================================================================== +struct AndroidDocumentIterator::Pimpl +{ + virtual ~Pimpl() = default; + virtual AndroidDocument read() const = 0; + virtual bool increment() = 0; +}; + +struct AndroidDocumentIterator::Utils +{ + using Detail = AndroidDocumentDetail; + + ~Utils() = delete; // This struct is a single-file namespace + + template + struct TemplatePimpl final : public Pimpl, public Engine + { + template + TemplatePimpl (Args&&... args) : Engine (std::forward (args)...) {} + + AndroidDocument read() const override { return Engine::read(); } + bool increment() override { return Engine::increment(); } + }; + + template + static AndroidDocumentIterator makeWithEngineInplace (Args&&... args) + { + return AndroidDocumentIterator { std::make_unique> (std::forward (args)...) }; + } + + template + static AndroidDocumentIterator makeWithEngine (Engine engine) + { + return AndroidDocumentIterator { std::make_unique> (std::move (engine)) }; + } + + static void increment (AndroidDocumentIterator& it) + { + if (it.pimpl == nullptr || ! it.pimpl->increment()) + it.pimpl = nullptr; + } +}; + +//============================================================================== +AndroidDocumentIterator AndroidDocumentIterator::makeNonRecursive (const AndroidDocument& dir) +{ + if (! dir.hasValue()) + return {}; + + using Detail = AndroidDocumentDetail; + + #if JUCE_ANDROID + if (21 <= getAndroidSDKVersion()) + { + if (auto uri = dir.getNativeInfo().uri) + return Utils::makeWithEngine (Detail::makeDocumentsContractIteratorEngine (uri)); + } + #endif + + return Utils::makeWithEngineInplace (dir.getUrl().getLocalFile(), false); +} + +AndroidDocumentIterator AndroidDocumentIterator::makeRecursive (const AndroidDocument& dir) +{ + if (! dir.hasValue()) + return {}; + + using Detail = AndroidDocumentDetail; + + #if JUCE_ANDROID + if (21 <= getAndroidSDKVersion()) + { + if (auto uri = dir.getNativeInfo().uri) + return Utils::makeWithEngine (Detail::RecursiveEngine { uri }); + } + #endif + + return Utils::makeWithEngineInplace (dir.getUrl().getLocalFile(), true); +} + +AndroidDocumentIterator::AndroidDocumentIterator (std::unique_ptr engine) + : pimpl (std::move (engine)) +{ + Utils::increment (*this); +} + +AndroidDocument AndroidDocumentIterator::operator*() const { return pimpl->read(); } + +AndroidDocumentIterator& AndroidDocumentIterator::operator++() +{ + Utils::increment (*this); + return *this; +} + +} // namespace juce diff --git a/modules/juce_core/native/juce_android_Files.cpp b/modules/juce_core/native/juce_android_Files.cpp index ef99443f..1c45ce97 100644 --- a/modules/juce_core/native/juce_android_Files.cpp +++ b/modules/juce_core/native/juce_android_Files.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -33,18 +33,30 @@ DECLARE_JNI_CLASS (MediaScannerConnection, "android/media/MediaScannerConnection #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (query, "query", "(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;") \ - METHOD (openInputStream, "openInputStream", "(Landroid/net/Uri;)Ljava/io/InputStream;") \ - METHOD (openOutputStream, "openOutputStream", "(Landroid/net/Uri;)Ljava/io/OutputStream;") + METHOD (query, "query", "(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;") \ + METHOD (openInputStream, "openInputStream", "(Landroid/net/Uri;)Ljava/io/InputStream;") \ + METHOD (openOutputStream, "openOutputStream", "(Landroid/net/Uri;)Ljava/io/OutputStream;") DECLARE_JNI_CLASS (ContentResolver, "android/content/ContentResolver") #undef JNI_CLASS_MEMBERS +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (takePersistableUriPermission, "takePersistableUriPermission", "(Landroid/net/Uri;I)V") \ + METHOD (releasePersistableUriPermission, "releasePersistableUriPermission", "(Landroid/net/Uri;I)V") \ + METHOD (getPersistedUriPermissions, "getPersistedUriPermissions", "()Ljava/util/List;") + +DECLARE_JNI_CLASS (ContentResolver19, "android/content/ContentResolver") +#undef JNI_CLASS_MEMBERS + #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (moveToFirst, "moveToFirst", "()Z") \ + METHOD (moveToNext, "moveToNext", "()Z") \ METHOD (getColumnIndex, "getColumnIndex", "(Ljava/lang/String;)I") \ METHOD (getString, "getString", "(I)Ljava/lang/String;") \ - METHOD (close, "close", "()V") \ + METHOD (isNull, "isNull", "(I)Z") \ + METHOD (getInt, "getInt", "(I)I") \ + METHOD (getLong, "getLong", "(I)J") \ + METHOD (close, "close", "()V") DECLARE_JNI_CLASS (AndroidCursor, "android/database/Cursor") #undef JNI_CLASS_MEMBERS @@ -65,14 +77,73 @@ DECLARE_JNI_CLASS (AndroidEnvironment, "android/os/Environment") DECLARE_JNI_CLASS (AndroidOutputStream, "java/io/OutputStream") #undef JNI_CLASS_MEMBERS +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (close, "close", "()V") \ + METHOD (read, "read", "([B)I") + +DECLARE_JNI_CLASS (AndroidInputStream, "java/io/InputStream") +#undef JNI_CLASS_MEMBERS + #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ FIELD (publicSourceDir, "publicSourceDir", "Ljava/lang/String;") \ - FIELD (dataDir, "dataDir", "Ljava/lang/String;") + FIELD (dataDir, "dataDir", "Ljava/lang/String;") \ + FIELD (targetSdkVersion, "targetSdkVersion", "I") DECLARE_JNI_CLASS (AndroidApplicationInfo, "android/content/pm/ApplicationInfo") #undef JNI_CLASS_MEMBERS -//============================================================================== +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + STATICMETHOD (buildChildDocumentsUri, "buildChildDocumentsUri", "(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildDocumentUri, "buildDocumentUri", "(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildRecentDocumentsUri, "buildRecentDocumentsUri", "(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildRootUri, "buildRootUri", "(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildRootsUri, "buildRootsUri", "(Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildSearchDocumentsUri, "buildSearchDocumentsUri", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (deleteDocument, "deleteDocument", "(Landroid/content/ContentResolver;Landroid/net/Uri;)Z") \ + STATICMETHOD (getDocumentId, "getDocumentId", "(Landroid/net/Uri;)Ljava/lang/String;") \ + STATICMETHOD (getRootId, "getRootId", "(Landroid/net/Uri;)Ljava/lang/String;") \ + STATICMETHOD (isDocumentUri, "isDocumentUri", "(Landroid/content/Context;Landroid/net/Uri;)Z") + +DECLARE_JNI_CLASS_WITH_MIN_SDK (DocumentsContract19, "android/provider/DocumentsContract", 19) +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + STATICMETHOD (buildChildDocumentsUriUsingTree, "buildChildDocumentsUriUsingTree", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildDocumentUriUsingTree, "buildDocumentUriUsingTree", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (buildTreeDocumentUri, "buildTreeDocumentUri", "(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (createDocument, "createDocument", "(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;") \ + STATICMETHOD (getTreeDocumentId, "getTreeDocumentId", "(Landroid/net/Uri;)Ljava/lang/String;") \ + STATICMETHOD (renameDocument, "renameDocument", "(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;") + +DECLARE_JNI_CLASS_WITH_MIN_SDK (DocumentsContract21, "android/provider/DocumentsContract", 21) +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + STATICMETHOD (copyDocument, "copyDocument", "(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;)Landroid/net/Uri;") \ + STATICMETHOD (moveDocument, "moveDocument", "(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;Landroid/net/Uri;)Landroid/net/Uri;") \ + STATICMETHOD (removeDocument, "removeDocument", "(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;)Z") + +DECLARE_JNI_CLASS_WITH_MIN_SDK (DocumentsContract24, "android/provider/DocumentsContract", 24) +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + STATICMETHOD (getSingleton, "getSingleton", "()Landroid/webkit/MimeTypeMap;") \ + METHOD (getExtensionFromMimeType, "getExtensionFromMimeType", "(Ljava/lang/String;)Ljava/lang/String;") \ + METHOD (getMimeTypeFromExtension, "getMimeTypeFromExtension", "(Ljava/lang/String;)Ljava/lang/String;") + +DECLARE_JNI_CLASS (AndroidMimeTypeMap, "android/webkit/MimeTypeMap") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getPersistedTime, "getPersistedTime", "()J") \ + METHOD (getUri, "getUri", "()Landroid/net/Uri;") \ + METHOD (isReadPermission, "isReadPermission", "()Z") \ + METHOD (isWritePermission, "isWritePermission", "()Z") + +DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidUriPermission, "android/content/UriPermission", 19) +#undef JNI_CLASS_MEMBERS + + //============================================================================== static File juceFile (LocalRef obj) { auto* env = getEnv(); @@ -118,21 +189,9 @@ static LocalRef urlToUri (const URL& url) struct AndroidContentUriResolver { public: - static LocalRef getStreamForContentUri (const URL& url, bool inputStream) + static LocalRef getContentResolver() { - // only use this method for content URIs - jassert (url.getScheme() == "content"); - auto* env = getEnv(); - - LocalRef contentResolver (env->CallObjectMethod (getAppContext().get(), AndroidContext.getContentResolver)); - - if (contentResolver) - return LocalRef ((env->CallObjectMethod (contentResolver.get(), - inputStream ? ContentResolver.openInputStream - : ContentResolver.openOutputStream, - urlToUri (url).get()))); - - return LocalRef(); + return LocalRef (getEnv()->CallObjectMethod (getAppContext().get(), AndroidContext.getContentResolver)); } static File getLocalFileFromContentUri (const URL& url) @@ -160,18 +219,15 @@ public: auto downloadId = tokens[1]; if (type.equalsIgnoreCase ("raw")) - { return File (downloadId); - } - else if (type.equalsIgnoreCase ("downloads")) + + if (type.equalsIgnoreCase ("downloads")) { auto subDownloadPath = url.getSubPath().fromFirstOccurrenceOf ("tree/downloads", false, false); return File (getWellKnownFolder ("DIRECTORY_DOWNLOADS").getFullPathName() + "/" + subDownloadPath); } - else - { - return getLocalFileFromContentUri (URL ("content://downloads/public_downloads/" + documentId)); - } + + return getLocalFileFromContentUri (URL ("content://downloads/public_downloads/" + documentId)); } else if (authority == "com.android.providers.media.documents" && documentId.isNotEmpty()) { @@ -192,7 +248,7 @@ public: { auto uri = urlToUri (url); auto* env = getEnv(); - LocalRef contentResolver (env->CallObjectMethod (getAppContext().get(), AndroidContext.getContentResolver)); + const auto contentResolver = getContentResolver(); if (contentResolver == nullptr) return {}; @@ -216,7 +272,7 @@ private: { auto uri = urlToUri (url); auto* env = getEnv(); - LocalRef contentResolver (env->CallObjectMethod (getAppContext().get(), AndroidContext.getContentResolver)); + const auto contentResolver = getContentResolver(); if (contentResolver) { @@ -285,8 +341,7 @@ private: static File getPrimaryStorageDirectory() { - auto* env = getEnv(); - return juceFile (LocalRef (env->CallStaticObjectMethod (AndroidEnvironment, AndroidEnvironment.getExternalStorageDirectory))); + return juceFile (LocalRef (getEnv()->CallStaticObjectMethod (AndroidEnvironment, AndroidEnvironment.getExternalStorageDirectory))); } static Array getSecondaryStorageDirectories() @@ -433,10 +488,8 @@ private: //============================================================================== struct AndroidContentUriOutputStream : public OutputStream { - AndroidContentUriOutputStream (LocalRef&& outputStream) - : stream (outputStream) - { - } + explicit AndroidContentUriOutputStream (LocalRef&& streamIn) + : stream (std::move (streamIn)) {} ~AndroidContentUriOutputStream() override { @@ -479,12 +532,79 @@ struct AndroidContentUriOutputStream : public OutputStream int64 pos = 0; }; -OutputStream* juce_CreateContentURIOutputStream (const URL& url) +//============================================================================== +class CachedByteArray { - auto stream = AndroidContentUriResolver::getStreamForContentUri (url, false); +public: + CachedByteArray() = default; - return (stream.get() != nullptr ? new AndroidContentUriOutputStream (std::move (stream)) : nullptr); -} + explicit CachedByteArray (jsize sizeIn) + : byteArray { LocalRef { getEnv()->NewByteArray (sizeIn) } }, + size (sizeIn) {} + + jbyteArray getNativeArray() const { return byteArray.get(); } + jsize getSize() const { return size; } + +private: + GlobalRefImpl byteArray; + jsize size = 0; +}; + +//============================================================================== +struct AndroidContentUriInputStream : public InputStream +{ + explicit AndroidContentUriInputStream (LocalRef&& streamIn) + : stream (std::move (streamIn)) {} + + ~AndroidContentUriInputStream() override + { + getEnv()->CallVoidMethod (stream.get(), AndroidInputStream.close); + } + + int64 getTotalLength() override { return -1; } + + bool isExhausted() override { return exhausted; } + + int read (void* destBuffer, int maxBytesToRead) override + { + auto* env = getEnv(); + + if ((jsize) maxBytesToRead > byteArray.getSize()) + byteArray = CachedByteArray { (jsize) maxBytesToRead }; + + const auto result = env->CallIntMethod (stream.get(), AndroidInputStream.read, byteArray.getNativeArray()); + + if (result != -1) + { + pos += result; + + auto* rawBytes = env->GetByteArrayElements (byteArray.getNativeArray(), nullptr); + std::memcpy (destBuffer, rawBytes, static_cast (result)); + env->ReleaseByteArrayElements (byteArray.getNativeArray(), rawBytes, 0); + } + else + { + exhausted = true; + } + + return result; + } + + bool setPosition (int64 newPos) override + { + return (newPos == pos); + } + + int64 getPosition() override + { + return pos; + } + + CachedByteArray byteArray; + GlobalRef stream; + int64 pos = 0; + bool exhausted = false; +}; //============================================================================== class MediaScannerConnectionClient : public AndroidInterfaceImplementer diff --git a/modules/juce_core/native/juce_android_JNIHelpers.cpp b/modules/juce_core/native/juce_android_JNIHelpers.cpp index 53734691..3d68d0f9 100644 --- a/modules/juce_core/native/juce_android_JNIHelpers.cpp +++ b/modules/juce_core/native/juce_android_JNIHelpers.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -414,34 +414,51 @@ jobject ActivityLifecycleCallbacks::invoke (jobject proxy, jobject method, jobje { auto* env = getEnv(); - auto methodName = juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName)); - - auto activity = env->GetArrayLength (args) > 0 ? env->GetObjectArrayElement (args, 0) : (jobject) nullptr; - auto bundle = env->GetArrayLength (args) > 1 ? env->GetObjectArrayElement (args, 1) : (jobject) nullptr; - - if (methodName == "onActivityPreCreated") { onActivityPreCreated (activity, bundle); return nullptr; } - else if (methodName == "onActivityPreDestroyed") { onActivityPreDestroyed (activity); return nullptr; } - else if (methodName == "onActivityPrePaused") { onActivityPrePaused (activity); return nullptr; } - else if (methodName == "onActivityPreResumed") { onActivityPreResumed (activity); return nullptr; } - else if (methodName == "onActivityPreSaveInstanceState") { onActivityPreSaveInstanceState (activity, bundle); return nullptr; } - else if (methodName == "onActivityPreStarted") { onActivityPreStarted (activity); return nullptr; } - else if (methodName == "onActivityPreStopped") { onActivityPreStopped (activity); return nullptr; } - else if (methodName == "onActivityCreated") { onActivityCreated (activity, bundle); return nullptr; } - else if (methodName == "onActivityDestroyed") { onActivityDestroyed (activity); return nullptr; } - else if (methodName == "onActivityPaused") { onActivityPaused (activity); return nullptr; } - else if (methodName == "onActivityResumed") { onActivityResumed (activity); return nullptr; } - else if (methodName == "onActivitySaveInstanceState") { onActivitySaveInstanceState (activity, bundle); return nullptr; } - else if (methodName == "onActivityStarted") { onActivityStarted (activity); return nullptr; } - else if (methodName == "onActivityStopped") { onActivityStopped (activity); return nullptr; } - else if (methodName == "onActivityPostCreated") { onActivityPostCreated (activity, bundle); return nullptr; } - else if (methodName == "onActivityPostDestroyed") { onActivityPostDestroyed (activity); return nullptr; } - else if (methodName == "onActivityPostPaused") { onActivityPostPaused (activity); return nullptr; } - else if (methodName == "onActivityPostResumed") { onActivityPostResumed (activity); return nullptr; } - else if (methodName == "onActivityPostSaveInstanceState") { onActivityPostSaveInstanceState (activity, bundle); return nullptr; } - else if (methodName == "onActivityPostStarted") { onActivityPostStarted (activity); return nullptr; } - else if (methodName == "onActivityPostStopped") { onActivityPostStopped (activity); return nullptr; } - - return AndroidInterfaceImplementer::invoke (proxy, method, args); + struct Comparator + { + bool operator() (const char* a, const char* b) const + { + return CharPointer_ASCII { a }.compare (CharPointer_ASCII { b }) < 0; + } + }; + + static const std::map entries + { + { "onActivityConfigurationChanged", [] (auto& t, auto activity, auto ) { t.onActivityConfigurationChanged (activity); } }, + { "onActivityCreated", [] (auto& t, auto activity, auto bundle) { t.onActivityCreated (activity, bundle); } }, + { "onActivityDestroyed", [] (auto& t, auto activity, auto ) { t.onActivityDestroyed (activity); } }, + { "onActivityPaused", [] (auto& t, auto activity, auto ) { t.onActivityPaused (activity); } }, + { "onActivityPostCreated", [] (auto& t, auto activity, auto bundle) { t.onActivityPostCreated (activity, bundle); } }, + { "onActivityPostDestroyed", [] (auto& t, auto activity, auto ) { t.onActivityPostDestroyed (activity); } }, + { "onActivityPostPaused", [] (auto& t, auto activity, auto ) { t.onActivityPostPaused (activity); } }, + { "onActivityPostResumed", [] (auto& t, auto activity, auto ) { t.onActivityPostResumed (activity); } }, + { "onActivityPostSaveInstanceState", [] (auto& t, auto activity, auto bundle) { t.onActivityPostSaveInstanceState (activity, bundle); } }, + { "onActivityPostStarted", [] (auto& t, auto activity, auto ) { t.onActivityPostStarted (activity); } }, + { "onActivityPostStopped", [] (auto& t, auto activity, auto ) { t.onActivityPostStopped (activity); } }, + { "onActivityPreCreated", [] (auto& t, auto activity, auto bundle) { t.onActivityPreCreated (activity, bundle); } }, + { "onActivityPreDestroyed", [] (auto& t, auto activity, auto ) { t.onActivityPreDestroyed (activity); } }, + { "onActivityPrePaused", [] (auto& t, auto activity, auto ) { t.onActivityPrePaused (activity); } }, + { "onActivityPreResumed", [] (auto& t, auto activity, auto ) { t.onActivityPreResumed (activity); } }, + { "onActivityPreSaveInstanceState", [] (auto& t, auto activity, auto bundle) { t.onActivityPreSaveInstanceState (activity, bundle); } }, + { "onActivityPreStarted", [] (auto& t, auto activity, auto ) { t.onActivityPreStarted (activity); } }, + { "onActivityPreStopped", [] (auto& t, auto activity, auto ) { t.onActivityPreStopped (activity); } }, + { "onActivityResumed", [] (auto& t, auto activity, auto ) { t.onActivityResumed (activity); } }, + { "onActivitySaveInstanceState", [] (auto& t, auto activity, auto bundle) { t.onActivitySaveInstanceState (activity, bundle); } }, + { "onActivityStarted", [] (auto& t, auto activity, auto ) { t.onActivityStarted (activity); } }, + { "onActivityStopped", [] (auto& t, auto activity, auto ) { t.onActivityStopped (activity); } }, + }; + + const auto methodName = juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName)); + const auto iter = entries.find (methodName.toRawUTF8()); + + if (iter == entries.end()) + return AndroidInterfaceImplementer::invoke (proxy, method, args); + + const auto activity = env->GetArrayLength (args) > 0 ? env->GetObjectArrayElement (args, 0) : (jobject) nullptr; + const auto bundle = env->GetArrayLength (args) > 1 ? env->GetObjectArrayElement (args, 1) : (jobject) nullptr; + (iter->second) (*this, activity, bundle); + + return nullptr; } //============================================================================== diff --git a/modules/juce_core/native/juce_android_JNIHelpers.h b/modules/juce_core/native/juce_android_JNIHelpers.h index 4131d326..441d9f79 100644 --- a/modules/juce_core/native/juce_android_JNIHelpers.h +++ b/modules/juce_core/native/juce_android_JNIHelpers.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -31,11 +31,11 @@ template class LocalRef { public: - explicit inline LocalRef() noexcept : obj (nullptr) {} - explicit inline LocalRef (JavaType o) noexcept : obj (o) {} - inline LocalRef (const LocalRef& other) noexcept : obj (retain (other.obj)) {} - inline LocalRef (LocalRef&& other) noexcept : obj (nullptr) { std::swap (obj, other.obj); } - ~LocalRef() { clear(); } + LocalRef() noexcept : obj (nullptr) {} + explicit LocalRef (JavaType o) noexcept : obj (o) {} + LocalRef (const LocalRef& other) noexcept : obj (retain (other.obj)) {} + LocalRef (LocalRef&& other) noexcept : obj (nullptr) { std::swap (obj, other.obj); } + ~LocalRef() { clear(); } void clear() { @@ -61,8 +61,8 @@ public: return *this; } - inline operator JavaType() const noexcept { return obj; } - inline JavaType get() const noexcept { return obj; } + operator JavaType() const noexcept { return obj; } + JavaType get() const noexcept { return obj; } private: JavaType obj; @@ -74,19 +74,19 @@ private: }; //============================================================================== -class GlobalRef +template +class GlobalRefImpl { public: - inline GlobalRef() noexcept : obj (nullptr) {} - inline explicit GlobalRef (const LocalRef& o) : obj (retain (o.get(), getEnv())) {} - inline explicit GlobalRef (const LocalRef& o, JNIEnv* env) : obj (retain (o.get(), env)) {} - inline GlobalRef (const GlobalRef& other) : obj (retain (other.obj, getEnv())) {} - inline GlobalRef (GlobalRef && other) noexcept : obj (nullptr) { std::swap (other.obj, obj); } - ~GlobalRef() { clear(); } - - - inline void clear() { if (obj != nullptr) clear (getEnv()); } - inline void clear (JNIEnv* env) + GlobalRefImpl() noexcept : obj (nullptr) {} + explicit GlobalRefImpl (const LocalRef& o) : obj (retain (o.get(), getEnv())) {} + GlobalRefImpl (const LocalRef& o, JNIEnv* env) : obj (retain (o.get(), env)) {} + GlobalRefImpl (const GlobalRefImpl& other) : obj (retain (other.obj, getEnv())) {} + GlobalRefImpl (GlobalRefImpl&& other) noexcept : obj (nullptr) { std::swap (other.obj, obj); } + ~GlobalRefImpl() { clear(); } + + void clear() { if (obj != nullptr) clear (getEnv()); } + void clear (JNIEnv* env) { if (obj != nullptr) { @@ -95,15 +95,15 @@ public: } } - inline GlobalRef& operator= (const GlobalRef& other) + GlobalRefImpl& operator= (const GlobalRefImpl& other) { - jobject newObj = retain (other.obj, getEnv()); + JavaType newObj = retain (other.obj, getEnv()); clear(); obj = newObj; return *this; } - inline GlobalRef& operator= (GlobalRef&& other) + GlobalRefImpl& operator= (GlobalRefImpl&& other) { clear(); std::swap (obj, other.obj); @@ -112,8 +112,8 @@ public: } //============================================================================== - inline operator jobject() const noexcept { return obj; } - inline jobject get() const noexcept { return obj; } + operator JavaType() const noexcept { return obj; } + JavaType get() const noexcept { return obj; } //============================================================================== #define DECLARE_CALL_TYPE_METHOD(returnType, typeName) \ @@ -147,14 +147,20 @@ public: private: //============================================================================== - jobject obj = nullptr; + JavaType obj = nullptr; - static jobject retain (jobject obj, JNIEnv* env) + static JavaType retain (JavaType obj, JNIEnv* env) { - return obj == nullptr ? nullptr : env->NewGlobalRef (obj); + return obj != nullptr ? static_cast (env->NewGlobalRef (obj)) + : nullptr; } }; +class GlobalRef : public GlobalRefImpl +{ +public: + using GlobalRefImpl::GlobalRefImpl; +}; //============================================================================== extern LocalRef getAppContext() noexcept; @@ -166,15 +172,15 @@ struct SystemJavaClassComparator; class JNIClassBase { public: - explicit JNIClassBase (const char* classPath, int minSDK, const void* byteCode, size_t byteCodeSize); + JNIClassBase (const char* classPath, int minSDK, const void* byteCode, size_t byteCodeSize); virtual ~JNIClassBase(); - inline operator jclass() const noexcept { return classRef; } + operator jclass() const noexcept { return classRef; } static void initialiseAllClasses (JNIEnv*); static void releaseAllClasses (JNIEnv*); - inline const char* getClassPath() const noexcept { return classPath; } + const char* getClassPath() const noexcept { return classPath; } protected: virtual void initialiseFields (JNIEnv*) = 0; @@ -252,6 +258,7 @@ private: METHOD (getApplicationContext, "getApplicationContext", "()Landroid/content/Context;") \ METHOD (getApplicationInfo, "getApplicationInfo", "()Landroid/content/pm/ApplicationInfo;") \ METHOD (checkCallingOrSelfPermission, "checkCallingOrSelfPermission", "(Ljava/lang/String;)I") \ + METHOD (checkCallingOrSelfUriPermission, "checkCallingOrSelfUriPermission", "(Landroid/net/Uri;I)I") \ METHOD (getCacheDir, "getCacheDir", "()Ljava/io/File;") DECLARE_JNI_CLASS (AndroidContext, "android/content/Context") @@ -392,6 +399,7 @@ DECLARE_JNI_CLASS (AndroidHandlerThread, "android/os/HandlerThread") METHOD (getAction, "getAction", "()Ljava/lang/String;") \ METHOD (getCategories, "getCategories", "()Ljava/util/Set;") \ METHOD (getData, "getData", "()Landroid/net/Uri;") \ + METHOD (getClipData, "getClipData", "()Landroid/content/ClipData;") \ METHOD (getExtras, "getExtras", "()Landroid/os/Bundle;") \ METHOD (getIntExtra, "getIntExtra", "(Ljava/lang/String;I)I") \ METHOD (getStringExtra, "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;") \ @@ -400,6 +408,7 @@ DECLARE_JNI_CLASS (AndroidHandlerThread, "android/os/HandlerThread") METHOD (putExtraString, "putExtra", "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;") \ METHOD (putExtraStrings, "putExtra", "(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/Intent;") \ METHOD (putExtraParcelable, "putExtra", "(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;") \ + METHOD (putExtraBool, "putExtra", "(Ljava/lang/String;Z)Landroid/content/Intent;") \ METHOD (putParcelableArrayListExtra, "putParcelableArrayListExtra", "(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;") \ METHOD (setAction, "setAction", "(Ljava/lang/String;)Landroid/content/Intent;") \ METHOD (setFlags, "setFlags", "(I)Landroid/content/Intent;") \ @@ -596,6 +605,9 @@ DECLARE_JNI_CLASS (JavaBoolean, "java/lang/Boolean") #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (get, "get", "([B)Ljava/nio/ByteBuffer;") \ METHOD (remaining, "remaining", "()I") \ + METHOD (hasArray, "hasArray", "()Z") \ + METHOD (array, "array", "()[B") \ + METHOD (setOrder, "order", "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;") \ STATICMETHOD (wrap, "wrap", "([B)Ljava/nio/ByteBuffer;") DECLARE_JNI_CLASS (JavaByteBuffer, "java/nio/ByteBuffer") @@ -837,15 +849,12 @@ namespace { auto* env = getEnv(); - LocalRef exception (env->ExceptionOccurred()); - - if (exception != nullptr) - { - env->ExceptionClear(); - return true; - } - - return false; + const auto result = env->ExceptionCheck(); + #if JUCE_DEBUG + env->ExceptionDescribe(); + #endif + env->ExceptionClear(); + return result; } } @@ -917,6 +926,8 @@ public: virtual void onActivityPostStarted (jobject /*activity*/) {} virtual void onActivityPostStopped (jobject /*activity*/) {} + virtual void onActivityConfigurationChanged (jobject /*activity*/) {} + private: jobject invoke (jobject, jobject, jobjectArray) override; }; diff --git a/modules/juce_core/native/juce_android_Misc.cpp b/modules/juce_core/native/juce_android_Misc.cpp index 21bc90ce..7afd5c67 100644 --- a/modules/juce_core/native/juce_android_Misc.cpp +++ b/modules/juce_core/native/juce_android_Misc.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_android_Network.cpp b/modules/juce_core/native/juce_android_Network.cpp index cdc67e62..e9e11022 100644 --- a/modules/juce_core/native/juce_android_Network.cpp +++ b/modules/juce_core/native/juce_android_Network.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -198,14 +198,6 @@ DECLARE_JNI_CLASS (StringBuffer, "java/lang/StringBuffer") DECLARE_JNI_CLASS_WITH_BYTECODE (HTTPStream, "com/rmsl/juce/JuceHTTPStream", 16, javaJuceHttpStream, sizeof(javaJuceHttpStream)) #undef JNI_CLASS_MEMBERS -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (close, "close", "()V") \ - METHOD (read, "read", "([BII)I") \ - -DECLARE_JNI_CLASS (AndroidInputStream, "java/io/InputStream") -#undef JNI_CLASS_MEMBERS - //============================================================================== #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (acquire, "acquire", "()V") \ @@ -246,6 +238,7 @@ static LocalRef getMulticastLock() return multicastLock; } +JUCE_API void JUCE_CALLTYPE acquireMulticastLock(); JUCE_API void JUCE_CALLTYPE acquireMulticastLock() { auto multicastLock = getMulticastLock(); @@ -254,6 +247,7 @@ JUCE_API void JUCE_CALLTYPE acquireMulticastLock() getEnv()->CallVoidMethod (multicastLock.get(), AndroidMulticastLock.acquire); } +JUCE_API void JUCE_CALLTYPE releaseMulticastLock(); JUCE_API void JUCE_CALLTYPE releaseMulticastLock() { auto multicastLock = getMulticastLock(); @@ -318,6 +312,25 @@ String URL::getFileName() const return toString (false).fromLastOccurrenceOf ("/", false, true); } +struct AndroidStreamHelpers +{ + enum class StreamKind { output, input }; + + static LocalRef createStream (const GlobalRef& uri, StreamKind kind) + { + auto* env = getEnv(); + auto contentResolver = AndroidContentUriResolver::getContentResolver(); + + if (contentResolver == nullptr) + return {}; + + return LocalRef (env->CallObjectMethod (contentResolver.get(), + kind == StreamKind::input ? ContentResolver.openInputStream + : ContentResolver.openOutputStream, + uri.get())); + } +}; + //============================================================================== class WebInputStream::Pimpl { @@ -363,7 +376,8 @@ public: if (isContentURL) { - auto inputStream = AndroidContentUriResolver::getStreamForContentUri (url, true); + GlobalRef urlRef { urlToUri (url) }; + auto inputStream = AndroidStreamHelpers::createStream (urlRef, AndroidStreamHelpers::StreamKind::input); if (inputStream != nullptr) { diff --git a/modules/juce_core/native/juce_android_RuntimePermissions.cpp b/modules/juce_core/native/juce_android_RuntimePermissions.cpp index 6d7f18fc..1bbc073b 100644 --- a/modules/juce_core/native/juce_android_RuntimePermissions.cpp +++ b/modules/juce_core/native/juce_android_RuntimePermissions.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_android_SystemStats.cpp b/modules/juce_core/native/juce_android_SystemStats.cpp index e9038a0e..8c3e416d 100644 --- a/modules/juce_core/native/juce_android_SystemStats.cpp +++ b/modules/juce_core/native/juce_android_SystemStats.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_android_Threads.cpp b/modules/juce_core/native/juce_android_Threads.cpp index f9ba13b0..71d76de0 100644 --- a/modules/juce_core/native/juce_android_Threads.cpp +++ b/modules/juce_core/native/juce_android_Threads.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -56,7 +56,7 @@ JNIEnv* getEnv() noexcept return nullptr; } -void JNICALL juce_JavainitialiseJUCE (JNIEnv* env, jobject /*jclass*/, jobject context) +static void JNICALL juce_JavainitialiseJUCE (JNIEnv* env, jobject /*jclass*/, jobject context) { Thread::initialiseJUCE (env, context); } diff --git a/modules/juce_core/native/juce_curl_Network.cpp b/modules/juce_core/native/juce_curl_Network.cpp index bbff6ca3..47d5e81a 100644 --- a/modules/juce_core/native/juce_curl_Network.cpp +++ b/modules/juce_core/native/juce_curl_Network.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_intel_SharedCode.h b/modules/juce_core/native/juce_intel_SharedCode.h index b59515d8..17f47d24 100644 --- a/modules/juce_core/native/juce_intel_SharedCode.h +++ b/modules/juce_core/native/juce_intel_SharedCode.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_linux_CommonFile.cpp b/modules/juce_core/native/juce_linux_CommonFile.cpp index 13d37c0e..6e4bf5b7 100644 --- a/modules/juce_core/native/juce_linux_CommonFile.cpp +++ b/modules/juce_core/native/juce_linux_CommonFile.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_linux_Files.cpp b/modules/juce_core/native/juce_linux_Files.cpp index 22f989ac..f661e4ab 100644 --- a/modules/juce_core/native/juce_linux_Files.cpp +++ b/modules/juce_core/native/juce_linux_Files.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_linux_Network.cpp b/modules/juce_core/native/juce_linux_Network.cpp index 7c084fcc..6de7e2d2 100644 --- a/modules/juce_core/native/juce_linux_Network.cpp +++ b/modules/juce_core/native/juce_linux_Network.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_linux_SystemStats.cpp b/modules/juce_core/native/juce_linux_SystemStats.cpp index d3663497..84abf88e 100644 --- a/modules/juce_core/native/juce_linux_SystemStats.cpp +++ b/modules/juce_core/native/juce_linux_SystemStats.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_linux_Threads.cpp b/modules/juce_core/native/juce_linux_Threads.cpp index 7c4c8896..9f9c07b7 100644 --- a/modules/juce_core/native/juce_linux_Threads.cpp +++ b/modules/juce_core/native/juce_linux_Threads.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_mac_CFHelpers.h b/modules/juce_core/native/juce_mac_CFHelpers.h index e9a5adfd..edeca6df 100644 --- a/modules/juce_core/native/juce_mac_CFHelpers.h +++ b/modules/juce_core/native/juce_mac_CFHelpers.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_mac_Files.mm b/modules/juce_core/native/juce_mac_Files.mm index eff20c84..aefa7631 100644 --- a/modules/juce_core/native/juce_mac_Files.mm +++ b/modules/juce_core/native/juce_mac_Files.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -528,8 +528,9 @@ void File::addToDock() const File File::getContainerForSecurityApplicationGroupIdentifier (const String& appGroup) { - if (auto* url = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier: juceStringToNS (appGroup)]) - return File (nsStringToJuce ([url path])); + if (@available (macOS 10.8, *)) + if (auto* url = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier: juceStringToNS (appGroup)]) + return File (nsStringToJuce ([url path])); return File(); } diff --git a/modules/juce_core/native/juce_mac_Network.mm b/modules/juce_core/native/juce_mac_Network.mm index 58b1799e..51939b48 100644 --- a/modules/juce_core/native/juce_mac_Network.mm +++ b/modules/juce_core/native/juce_mac_Network.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -393,7 +393,7 @@ JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif //============================================================================== -class URLConnectionState : public URLConnectionStateBase +class API_AVAILABLE (macos (10.9)) URLConnectionState : public URLConnectionStateBase { public: URLConnectionState (NSURLRequest* req, const int maxRedirects) diff --git a/modules/juce_core/native/juce_mac_ObjCHelpers.h b/modules/juce_core/native/juce_mac_ObjCHelpers.h index b3b59c70..55cb01a2 100644 --- a/modules/juce_core/native/juce_mac_ObjCHelpers.h +++ b/modules/juce_core/native/juce_mac_ObjCHelpers.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -164,7 +164,7 @@ inline var nsDictionaryToVar (NSDictionary* dictionary) DynamicObject::Ptr dynamicObject (new DynamicObject()); for (NSString* key in dictionary) - dynamicObject->setProperty (nsStringToJuce (key), nsObjectToVar (dictionary[key])); + dynamicObject->setProperty (nsStringToJuce (key), nsObjectToVar ([dictionary objectForKey: key])); return var (dynamicObject.get()); } @@ -306,6 +306,9 @@ public: bool operator== (const ObjCObjectHandle& other) const { return item == other.item; } bool operator!= (const ObjCObjectHandle& other) const { return ! (*this == other); } + bool operator== (std::nullptr_t) const { return item == nullptr; } + bool operator!= (std::nullptr_t) const { return ! (*this == nullptr); } + private: void swap (ObjCObjectHandle& other) noexcept { std::swap (other.item, item); } @@ -499,7 +502,7 @@ public: bool operator!= (const void* ptr) const { return ((const void*) block != ptr); } ~ObjCBlock() { if (block != nullptr) [block release]; } - operator BlockType() { return block; } + operator BlockType() const { return block; } private: BlockType block; diff --git a/modules/juce_core/native/juce_mac_Strings.mm b/modules/juce_core/native/juce_mac_Strings.mm index fff2c7c1..1963f7d8 100644 --- a/modules/juce_core/native/juce_mac_Strings.mm +++ b/modules/juce_core/native/juce_mac_Strings.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_mac_SystemStats.mm b/modules/juce_core/native/juce_mac_SystemStats.mm index b32ff165..f3b25cad 100644 --- a/modules/juce_core/native/juce_mac_SystemStats.mm +++ b/modules/juce_core/native/juce_mac_SystemStats.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_mac_Threads.mm b/modules/juce_core/native/juce_mac_Threads.mm index 63255fc1..9a88832a 100644 --- a/modules/juce_core/native/juce_mac_Threads.mm +++ b/modules/juce_core/native/juce_mac_Threads.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_posix_IPAddress.h b/modules/juce_core/native/juce_posix_IPAddress.h index 79717461..992d469c 100644 --- a/modules/juce_core/native/juce_posix_IPAddress.h +++ b/modules/juce_core/native/juce_posix_IPAddress.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_posix_NamedPipe.cpp b/modules/juce_core/native/juce_posix_NamedPipe.cpp index 0e6e6783..dde81fab 100644 --- a/modules/juce_core/native/juce_posix_NamedPipe.cpp +++ b/modules/juce_core/native/juce_posix_NamedPipe.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -246,18 +246,23 @@ private: void NamedPipe::close() { - ScopedWriteLock sl (lock); - - if (pimpl != nullptr) { - pimpl->stopReadOperation = true; + const ScopedReadLock sl (lock); + + if (pimpl != nullptr) + { + pimpl->stopReadOperation = true; - const char buffer[] { 0 }; - const auto done = ::write (pimpl->pipeIn.get(), buffer, numElementsInArray (buffer)); - ignoreUnused (done); + const char buffer[] { 0 }; + const auto done = ::write (pimpl->pipeIn.get(), buffer, numElementsInArray (buffer)); + ignoreUnused (done); + } } - pimpl.reset(); + { + const ScopedWriteLock sl (lock); + pimpl.reset(); + } } bool NamedPipe::openInternal (const String& pipeName, bool createPipe, bool mustNotExist) diff --git a/modules/juce_core/native/juce_posix_SharedCode.h b/modules/juce_core/native/juce_posix_SharedCode.h index dbf06043..700e191e 100644 --- a/modules/juce_core/native/juce_posix_SharedCode.h +++ b/modules/juce_core/native/juce_posix_SharedCode.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -288,6 +288,12 @@ bool File::hasWriteAccess() const return false; } +bool File::hasReadAccess() const +{ + return fullPath.isNotEmpty() + && access (fullPath.toUTF8(), R_OK) == 0; +} + static bool setFileModeFlags (const String& fullPath, mode_t flags, bool shouldSet) noexcept { juce_statStruct info; diff --git a/modules/juce_core/native/juce_wasm_SystemStats.cpp b/modules/juce_core/native/juce_wasm_SystemStats.cpp index 118f9d81..733d494f 100644 --- a/modules/juce_core/native/juce_wasm_SystemStats.cpp +++ b/modules/juce_core/native/juce_wasm_SystemStats.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_win32_ComSmartPtr.h b/modules/juce_core/native/juce_win32_ComSmartPtr.h index b1f4bcb9..ce5f1415 100644 --- a/modules/juce_core/native/juce_win32_ComSmartPtr.h +++ b/modules/juce_core/native/juce_win32_ComSmartPtr.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_win32_Files.cpp b/modules/juce_core/native/juce_win32_Files.cpp index b8ab52ca..7d93f26a 100644 --- a/modules/juce_core/native/juce_win32_Files.cpp +++ b/modules/juce_core/native/juce_win32_Files.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -64,12 +64,12 @@ namespace WindowsFileHelpers #endif //============================================================================== - DWORD getAtts (const String& path) noexcept + static DWORD getAtts (const String& path) noexcept { return GetFileAttributes (path.toWideCharPointer()); } - bool changeAtts (const String& path, DWORD bitsToSet, DWORD bitsToClear) noexcept + static bool changeAtts (const String& path, DWORD bitsToSet, DWORD bitsToClear) noexcept { auto oldAtts = getAtts (path); @@ -82,7 +82,7 @@ namespace WindowsFileHelpers || SetFileAttributes (path.toWideCharPointer(), newAtts) != FALSE; } - int64 fileTimeToTime (const FILETIME* const ft) noexcept + static int64 fileTimeToTime (const FILETIME* const ft) noexcept { static_assert (sizeof (ULARGE_INTEGER) == sizeof (FILETIME), "ULARGE_INTEGER is too small to hold FILETIME: please report!"); @@ -90,7 +90,7 @@ namespace WindowsFileHelpers return (int64) ((reinterpret_cast (ft)->QuadPart - 116444736000000000LL) / 10000); } - FILETIME* timeToFileTime (const int64 time, FILETIME* const ft) noexcept + static FILETIME* timeToFileTime (const int64 time, FILETIME* const ft) noexcept { if (time <= 0) return nullptr; @@ -99,7 +99,7 @@ namespace WindowsFileHelpers return ft; } - String getDriveFromPath (String path) + static String getDriveFromPath (String path) { if (path.isNotEmpty() && path[1] == ':' && path[2] == 0) path << '\\'; @@ -115,7 +115,7 @@ namespace WindowsFileHelpers return path; } - int64 getDiskSpaceInfo (const String& path, const bool total) + static int64 getDiskSpaceInfo (const String& path, const bool total) { ULARGE_INTEGER spc, tot, totFree; @@ -126,12 +126,12 @@ namespace WindowsFileHelpers return 0; } - unsigned int getWindowsDriveType (const String& path) + static unsigned int getWindowsDriveType (const String& path) { return GetDriveType (getDriveFromPath (path).toWideCharPointer()); } - File getSpecialFolderPath (int type) + static File getSpecialFolderPath (int type) { WCHAR path[MAX_PATH + 256]; @@ -141,7 +141,7 @@ namespace WindowsFileHelpers return {}; } - File getModuleFileName (HINSTANCE moduleHandle) + static File getModuleFileName (HINSTANCE moduleHandle) { WCHAR dest[MAX_PATH + 256]; dest[0] = 0; @@ -149,7 +149,7 @@ namespace WindowsFileHelpers return File (String (dest)); } - Result getResultForLastError() + static Result getResultForLastError() { TCHAR messageBuffer[256] = {}; @@ -159,7 +159,84 @@ namespace WindowsFileHelpers return Result::fail (String (messageBuffer)); } -} + + // The docs for the Windows security API aren't very clear. Some parts of the following + // function (the flags passed to GetNamedSecurityInfo, duplicating the primary access token) + // were guided by the example at https://blog.aaronballman.com/2011/08/how-to-check-access-rights/ + static bool hasFileAccess (const File& file, DWORD accessType) + { + const auto& path = file.getFullPathName(); + + if (path.isEmpty()) + return false; + + struct PsecurityDescriptorGuard + { + ~PsecurityDescriptorGuard() { if (psecurityDescriptor != nullptr) LocalFree (psecurityDescriptor); } + PSECURITY_DESCRIPTOR psecurityDescriptor = nullptr; + }; + + PsecurityDescriptorGuard descriptorGuard; + + if (GetNamedSecurityInfo (path.toWideCharPointer(), + SE_FILE_OBJECT, + OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION, + nullptr, + nullptr, + nullptr, + nullptr, + &descriptorGuard.psecurityDescriptor) != ERROR_SUCCESS) + { + return false; + } + + struct HandleGuard + { + ~HandleGuard() { if (handle != INVALID_HANDLE_VALUE) CloseHandle (handle); } + HANDLE handle = nullptr; + }; + + HandleGuard primaryTokenGuard; + + if (! OpenProcessToken (GetCurrentProcess(), + TOKEN_IMPERSONATE | TOKEN_DUPLICATE | TOKEN_QUERY | STANDARD_RIGHTS_READ, + &primaryTokenGuard.handle)) + { + return false; + } + + HandleGuard duplicatedTokenGuard; + + if (! DuplicateToken (primaryTokenGuard.handle, + SecurityImpersonation, + &duplicatedTokenGuard.handle)) + { + return false; + } + + GENERIC_MAPPING mapping { FILE_GENERIC_READ, FILE_GENERIC_WRITE, FILE_GENERIC_EXECUTE, FILE_ALL_ACCESS }; + + MapGenericMask (&accessType, &mapping); + DWORD allowed = 0; + BOOL granted = false; + PRIVILEGE_SET set; + DWORD setSize = sizeof (set); + + if (! AccessCheck (descriptorGuard.psecurityDescriptor, + duplicatedTokenGuard.handle, + accessType, + &mapping, + &set, + &setSize, + &allowed, + &granted)) + { + return false; + } + + return granted != FALSE; + } +} // namespace WindowsFileHelpers //============================================================================== #if JUCE_ALLOW_STATIC_NULL_VARIABLES @@ -199,17 +276,25 @@ bool File::isDirectory() const bool File::hasWriteAccess() const { - if (fullPath.isEmpty()) - return true; + if (exists()) + { + const auto attr = WindowsFileHelpers::getAtts (fullPath); - auto attr = WindowsFileHelpers::getAtts (fullPath); + return WindowsFileHelpers::hasFileAccess (*this, GENERIC_WRITE) + && (attr == INVALID_FILE_ATTRIBUTES + || (attr & FILE_ATTRIBUTE_DIRECTORY) != 0 + || (attr & FILE_ATTRIBUTE_READONLY) == 0); + } + + if ((! isDirectory()) && fullPath.containsChar (getSeparatorChar())) + return getParentDirectory().hasWriteAccess(); - // NB: According to MS, the FILE_ATTRIBUTE_READONLY attribute doesn't work for - // folders, and can be incorrectly set for some special folders, so we'll just say - // that folders are always writable. - return attr == INVALID_FILE_ATTRIBUTES - || (attr & FILE_ATTRIBUTE_DIRECTORY) != 0 - || (attr & FILE_ATTRIBUTE_READONLY) == 0; + return false; +} + +bool File::hasReadAccess() const +{ + return WindowsFileHelpers::hasFileAccess (*this, GENERIC_READ); } bool File::setFileReadOnlyInternal (bool shouldBeReadOnly) const diff --git a/modules/juce_core/native/juce_win32_Network.cpp b/modules/juce_core/native/juce_win32_Network.cpp index a2bceef5..621da4ac 100644 --- a/modules/juce_core/native/juce_win32_Network.cpp +++ b/modules/juce_core/native/juce_win32_Network.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_win32_Registry.cpp b/modules/juce_core/native/juce_win32_Registry.cpp index c0d08630..4d3761bf 100644 --- a/modules/juce_core/native/juce_win32_Registry.cpp +++ b/modules/juce_core/native/juce_win32_Registry.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/native/juce_win32_SystemStats.cpp b/modules/juce_core/native/juce_win32_SystemStats.cpp index 2546db24..7cfc79d5 100644 --- a/modules/juce_core/native/juce_win32_SystemStats.cpp +++ b/modules/juce_core/native/juce_win32_SystemStats.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -214,6 +214,7 @@ static DebugFlagsInitialiser debugFlagsInitialiser; return 0; } #else + RTL_OSVERSIONINFOW getWindowsVersionInfo(); RTL_OSVERSIONINFOW getWindowsVersionInfo() { RTL_OSVERSIONINFOW versionInfo = {}; diff --git a/modules/juce_core/native/juce_win32_Threads.cpp b/modules/juce_core/native/juce_win32_Threads.cpp index 1a400435..8d15042f 100644 --- a/modules/juce_core/native/juce_win32_Threads.cpp +++ b/modules/juce_core/native/juce_win32_Threads.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -197,6 +197,7 @@ static int lastProcessPriority = -1; // called when the app gains focus because Windows does weird things to process priority // when you swap apps, and this forces an update when the app is brought to the front. +void juce_repeatLastProcessPriority(); void juce_repeatLastProcessPriority() { if (lastProcessPriority >= 0) // (avoid changing this if it's not been explicitly set by the app..) @@ -265,6 +266,7 @@ void JUCE_CALLTYPE Process::terminate() ExitProcess (1); } +bool juce_isRunningInWine(); bool juce_isRunningInWine() { HMODULE ntdll = GetModuleHandleA ("ntdll"); diff --git a/modules/juce_core/network/juce_IPAddress.cpp b/modules/juce_core/network/juce_IPAddress.cpp index ff2479aa..f9394112 100644 --- a/modules/juce_core/network/juce_IPAddress.cpp +++ b/modules/juce_core/network/juce_IPAddress.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/network/juce_IPAddress.h b/modules/juce_core/network/juce_IPAddress.h index 9387cf5a..fe0638c2 100644 --- a/modules/juce_core/network/juce_IPAddress.h +++ b/modules/juce_core/network/juce_IPAddress.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/network/juce_MACAddress.cpp b/modules/juce_core/network/juce_MACAddress.cpp index b1dcfffc..ed7fa2c4 100644 --- a/modules/juce_core/network/juce_MACAddress.cpp +++ b/modules/juce_core/network/juce_MACAddress.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/network/juce_MACAddress.h b/modules/juce_core/network/juce_MACAddress.h index dcb176b0..f4aafdaa 100644 --- a/modules/juce_core/network/juce_MACAddress.h +++ b/modules/juce_core/network/juce_MACAddress.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/network/juce_NamedPipe.cpp b/modules/juce_core/network/juce_NamedPipe.cpp index a4a26ecf..c47aa5c9 100644 --- a/modules/juce_core/network/juce_NamedPipe.cpp +++ b/modules/juce_core/network/juce_NamedPipe.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/network/juce_NamedPipe.h b/modules/juce_core/network/juce_NamedPipe.h index 0d30a9b1..768a5719 100644 --- a/modules/juce_core/network/juce_NamedPipe.h +++ b/modules/juce_core/network/juce_NamedPipe.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/network/juce_Socket.cpp b/modules/juce_core/network/juce_Socket.cpp index 4a23600c..0823d429 100644 --- a/modules/juce_core/network/juce_Socket.cpp +++ b/modules/juce_core/network/juce_Socket.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/network/juce_Socket.h b/modules/juce_core/network/juce_Socket.h index 029f8fa1..6d877fad 100644 --- a/modules/juce_core/network/juce_Socket.h +++ b/modules/juce_core/network/juce_Socket.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/network/juce_URL.cpp b/modules/juce_core/network/juce_URL.cpp index 1a1ba004..ce9c5030 100644 --- a/modules/juce_core/network/juce_URL.cpp +++ b/modules/juce_core/network/juce_URL.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -790,12 +790,13 @@ std::unique_ptr URL::createInputStream (const InputStreamOptions& o JUCE_END_IGNORE_WARNINGS_GCC_LIKE } -#if JUCE_ANDROID -OutputStream* juce_CreateContentURIOutputStream (const URL&); -#endif - std::unique_ptr URL::createOutputStream() const { + #if JUCE_ANDROID + if (auto stream = AndroidDocument::fromDocument (*this).createOutputStream()) + return stream; + #endif + if (isLocalFile()) { #if JUCE_IOS @@ -806,11 +807,7 @@ std::unique_ptr URL::createOutputStream() const #endif } - #if JUCE_ANDROID - return std::unique_ptr (juce_CreateContentURIOutputStream (*this)); - #else return nullptr; - #endif } //============================================================================== diff --git a/modules/juce_core/network/juce_URL.h b/modules/juce_core/network/juce_URL.h index 7908ed26..09a048a7 100644 --- a/modules/juce_core/network/juce_URL.h +++ b/modules/juce_core/network/juce_URL.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -52,9 +52,6 @@ public: /** Creates URL referring to a local file on your disk using the file:// scheme. */ explicit URL (File localFile); - /** Destructor. */ - ~URL() = default; - /** Compares two URLs. All aspects of the URLs must be identical for them to match, including any parameters, diff --git a/modules/juce_core/network/juce_WebInputStream.cpp b/modules/juce_core/network/juce_WebInputStream.cpp index 5d6d3a04..daffbc44 100644 --- a/modules/juce_core/network/juce_WebInputStream.cpp +++ b/modules/juce_core/network/juce_WebInputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/network/juce_WebInputStream.h b/modules/juce_core/network/juce_WebInputStream.h index ab002555..88301212 100644 --- a/modules/juce_core/network/juce_WebInputStream.h +++ b/modules/juce_core/network/juce_WebInputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_BufferedInputStream.cpp b/modules/juce_core/streams/juce_BufferedInputStream.cpp index c60f3774..fdde48a6 100644 --- a/modules/juce_core/streams/juce_BufferedInputStream.cpp +++ b/modules/juce_core/streams/juce_BufferedInputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_BufferedInputStream.h b/modules/juce_core/streams/juce_BufferedInputStream.h index 3ad216b6..3189b306 100644 --- a/modules/juce_core/streams/juce_BufferedInputStream.h +++ b/modules/juce_core/streams/juce_BufferedInputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_FileInputSource.cpp b/modules/juce_core/streams/juce_FileInputSource.cpp index 6cd45a9b..7bf534a2 100644 --- a/modules/juce_core/streams/juce_FileInputSource.cpp +++ b/modules/juce_core/streams/juce_FileInputSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_FileInputSource.h b/modules/juce_core/streams/juce_FileInputSource.h index be49581b..c6d8bdae 100644 --- a/modules/juce_core/streams/juce_FileInputSource.h +++ b/modules/juce_core/streams/juce_FileInputSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_InputSource.h b/modules/juce_core/streams/juce_InputSource.h index 01f110d1..1eca80d6 100644 --- a/modules/juce_core/streams/juce_InputSource.h +++ b/modules/juce_core/streams/juce_InputSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_InputStream.cpp b/modules/juce_core/streams/juce_InputStream.cpp index d68b3ded..4387d40a 100644 --- a/modules/juce_core/streams/juce_InputStream.cpp +++ b/modules/juce_core/streams/juce_InputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_InputStream.h b/modules/juce_core/streams/juce_InputStream.h index 95e69294..5b0bb139 100644 --- a/modules/juce_core/streams/juce_InputStream.h +++ b/modules/juce_core/streams/juce_InputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_MemoryInputStream.cpp b/modules/juce_core/streams/juce_MemoryInputStream.cpp index d75b2b71..5e60dd61 100644 --- a/modules/juce_core/streams/juce_MemoryInputStream.cpp +++ b/modules/juce_core/streams/juce_MemoryInputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_MemoryInputStream.h b/modules/juce_core/streams/juce_MemoryInputStream.h index 970ff5cd..3d5047bf 100644 --- a/modules/juce_core/streams/juce_MemoryInputStream.h +++ b/modules/juce_core/streams/juce_MemoryInputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_MemoryOutputStream.cpp b/modules/juce_core/streams/juce_MemoryOutputStream.cpp index 2f83dbd3..e43b8465 100644 --- a/modules/juce_core/streams/juce_MemoryOutputStream.cpp +++ b/modules/juce_core/streams/juce_MemoryOutputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_MemoryOutputStream.h b/modules/juce_core/streams/juce_MemoryOutputStream.h index cc145acf..425b8d60 100644 --- a/modules/juce_core/streams/juce_MemoryOutputStream.h +++ b/modules/juce_core/streams/juce_MemoryOutputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_OutputStream.cpp b/modules/juce_core/streams/juce_OutputStream.cpp index c5727712..1836930d 100644 --- a/modules/juce_core/streams/juce_OutputStream.cpp +++ b/modules/juce_core/streams/juce_OutputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_OutputStream.h b/modules/juce_core/streams/juce_OutputStream.h index 80f78ed6..872af59d 100644 --- a/modules/juce_core/streams/juce_OutputStream.h +++ b/modules/juce_core/streams/juce_OutputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_SubregionStream.cpp b/modules/juce_core/streams/juce_SubregionStream.cpp index 84b444f5..bb2572a1 100644 --- a/modules/juce_core/streams/juce_SubregionStream.cpp +++ b/modules/juce_core/streams/juce_SubregionStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_SubregionStream.h b/modules/juce_core/streams/juce_SubregionStream.h index 006443c2..1894aff2 100644 --- a/modules/juce_core/streams/juce_SubregionStream.h +++ b/modules/juce_core/streams/juce_SubregionStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_URLInputSource.cpp b/modules/juce_core/streams/juce_URLInputSource.cpp index 1f9017b6..d50c4c54 100644 --- a/modules/juce_core/streams/juce_URLInputSource.cpp +++ b/modules/juce_core/streams/juce_URLInputSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/streams/juce_URLInputSource.h b/modules/juce_core/streams/juce_URLInputSource.h index 1b16cdc8..a93caaef 100644 --- a/modules/juce_core/streams/juce_URLInputSource.h +++ b/modules/juce_core/streams/juce_URLInputSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/system/juce_CompilerSupport.h b/modules/juce_core/system/juce_CompilerSupport.h index 7fd571e4..bbe21625 100644 --- a/modules/juce_core/system/juce_CompilerSupport.h +++ b/modules/juce_core/system/juce_CompilerSupport.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -72,8 +72,8 @@ // MSVC #if JUCE_MSVC - #if _MSC_FULL_VER < 190024210 // VS2015 - #error "JUCE requires Visual Studio 2015 Update 3 or later" + #if _MSC_FULL_VER < 191025017 // VS2017 + #error "JUCE requires Visual Studio 2017 or later" #endif #ifndef JUCE_EXCEPTIONS_DISABLED diff --git a/modules/juce_core/system/juce_CompilerWarnings.h b/modules/juce_core/system/juce_CompilerWarnings.h index 631be168..05845903 100644 --- a/modules/juce_core/system/juce_CompilerWarnings.h +++ b/modules/juce_core/system/juce_CompilerWarnings.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/system/juce_PlatformDefs.h b/modules/juce_core/system/juce_PlatformDefs.h index c0943302..0b7e64a3 100644 --- a/modules/juce_core/system/juce_PlatformDefs.h +++ b/modules/juce_core/system/juce_PlatformDefs.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/system/juce_StandardHeader.h b/modules/juce_core/system/juce_StandardHeader.h index fe164cdd..0fde7308 100644 --- a/modules/juce_core/system/juce_StandardHeader.h +++ b/modules/juce_core/system/juce_StandardHeader.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -27,9 +27,9 @@ See also SystemStats::getJUCEVersion() for a string version. */ -#define JUCE_MAJOR_VERSION 6 -#define JUCE_MINOR_VERSION 1 -#define JUCE_BUILDNUMBER 6 +#define JUCE_MAJOR_VERSION 7 +#define JUCE_MINOR_VERSION 0 +#define JUCE_BUILDNUMBER 0 /** Current JUCE version number. @@ -41,6 +41,11 @@ */ #define JUCE_VERSION ((JUCE_MAJOR_VERSION << 16) + (JUCE_MINOR_VERSION << 8) + JUCE_BUILDNUMBER) +#if ! DOXYGEN +#define JUCE_VERSION_ID \ + volatile auto juceVersionId = "juce_version_" JUCE_STRINGIFY(JUCE_MAJOR_VERSION) "_" JUCE_STRINGIFY(JUCE_MINOR_VERSION) "_" JUCE_STRINGIFY(JUCE_BUILDNUMBER); \ + ignoreUnused (juceVersionId); +#endif //============================================================================== #include @@ -64,6 +69,7 @@ #include #include #include +#include #include #include diff --git a/modules/juce_core/system/juce_SystemStats.cpp b/modules/juce_core/system/juce_SystemStats.cpp index 95146381..3fe9ac7f 100644 --- a/modules/juce_core/system/juce_SystemStats.cpp +++ b/modules/juce_core/system/juce_SystemStats.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/system/juce_SystemStats.h b/modules/juce_core/system/juce_SystemStats.h index 09ed101a..36249dea 100644 --- a/modules/juce_core/system/juce_SystemStats.h +++ b/modules/juce_core/system/juce_SystemStats.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/system/juce_TargetPlatform.h b/modules/juce_core/system/juce_TargetPlatform.h index c21cff17..aca2e656 100644 --- a/modules/juce_core/system/juce_TargetPlatform.h +++ b/modules/juce_core/system/juce_TargetPlatform.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -144,8 +144,8 @@ #endif #if JUCE_MAC - #if ! defined (MAC_OS_X_VERSION_10_11) - #error "The 10.11 SDK (Xcode 7.3.1+) is required to build JUCE apps. You can create apps that run on macOS 10.7+ by changing the deployment target." + #if ! defined (MAC_OS_X_VERSION_10_14) + #error "The 10.14 SDK (Xcode 10.1+) is required to build JUCE apps. You can create apps that run on macOS 10.7+ by changing the deployment target." #elif MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7 #error "Building for OSX 10.6 is no longer supported!" #endif diff --git a/modules/juce_core/text/juce_Base64.cpp b/modules/juce_core/text/juce_Base64.cpp index dd4d1a8e..4cfe6980 100644 --- a/modules/juce_core/text/juce_Base64.cpp +++ b/modules/juce_core/text/juce_Base64.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_Base64.h b/modules/juce_core/text/juce_Base64.h index 446171bf..81bca225 100644 --- a/modules/juce_core/text/juce_Base64.h +++ b/modules/juce_core/text/juce_Base64.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_CharPointer_ASCII.h b/modules/juce_core/text/juce_CharPointer_ASCII.h index 2d3a176d..4fc018b7 100644 --- a/modules/juce_core/text/juce_CharPointer_ASCII.h +++ b/modules/juce_core/text/juce_CharPointer_ASCII.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_CharPointer_UTF16.h b/modules/juce_core/text/juce_CharPointer_UTF16.h index d08f1c0a..5f3e2c3e 100644 --- a/modules/juce_core/text/juce_CharPointer_UTF16.h +++ b/modules/juce_core/text/juce_CharPointer_UTF16.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_CharPointer_UTF32.h b/modules/juce_core/text/juce_CharPointer_UTF32.h index 4dcbbd86..1cbfd103 100644 --- a/modules/juce_core/text/juce_CharPointer_UTF32.h +++ b/modules/juce_core/text/juce_CharPointer_UTF32.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_CharPointer_UTF8.h b/modules/juce_core/text/juce_CharPointer_UTF8.h index 6b65c245..84b24d3b 100644 --- a/modules/juce_core/text/juce_CharPointer_UTF8.h +++ b/modules/juce_core/text/juce_CharPointer_UTF8.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_CharacterFunctions.cpp b/modules/juce_core/text/juce_CharacterFunctions.cpp index a0e973e1..f1b466ff 100644 --- a/modules/juce_core/text/juce_CharacterFunctions.cpp +++ b/modules/juce_core/text/juce_CharacterFunctions.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_CharacterFunctions.h b/modules/juce_core/text/juce_CharacterFunctions.h index 764417e6..7ab9fb03 100644 --- a/modules/juce_core/text/juce_CharacterFunctions.h +++ b/modules/juce_core/text/juce_CharacterFunctions.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_Identifier.cpp b/modules/juce_core/text/juce_Identifier.cpp index 3e78fd52..44d3ac2e 100644 --- a/modules/juce_core/text/juce_Identifier.cpp +++ b/modules/juce_core/text/juce_Identifier.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_Identifier.h b/modules/juce_core/text/juce_Identifier.h index af2408fb..83d20661 100644 --- a/modules/juce_core/text/juce_Identifier.h +++ b/modules/juce_core/text/juce_Identifier.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_LocalisedStrings.cpp b/modules/juce_core/text/juce_LocalisedStrings.cpp index fcff32e0..11af8cf2 100644 --- a/modules/juce_core/text/juce_LocalisedStrings.cpp +++ b/modules/juce_core/text/juce_LocalisedStrings.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_LocalisedStrings.h b/modules/juce_core/text/juce_LocalisedStrings.h index c62f82fa..e839dddc 100644 --- a/modules/juce_core/text/juce_LocalisedStrings.h +++ b/modules/juce_core/text/juce_LocalisedStrings.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_NewLine.h b/modules/juce_core/text/juce_NewLine.h index bc7e2de7..3ac1f455 100644 --- a/modules/juce_core/text/juce_NewLine.h +++ b/modules/juce_core/text/juce_NewLine.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_String.cpp b/modules/juce_core/text/juce_String.cpp index 8a00e283..02c2c8f8 100644 --- a/modules/juce_core/text/juce_String.cpp +++ b/modules/juce_core/text/juce_String.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -45,40 +45,40 @@ static CharPointer_wchar_t castToCharPointer_wchar_t (const void* t) noexcept } //============================================================================== -// (Mirrors the structure of StringHolder, but without the atomic member, so can be statically constructed) -struct EmptyString +struct StringHolder { - int refCount; - size_t allocatedBytes; - String::CharPointerType::CharType text; + using CharPointerType = String::CharPointerType; + using CharType = String::CharPointerType::CharType; + + std::atomic refCount { 0 }; + size_t allocatedNumBytes = sizeof (CharType); + CharType text[1] { 0 }; }; -static const EmptyString emptyString { 0x3fffffff, sizeof (String::CharPointerType::CharType), 0 }; +constexpr StringHolder emptyString; //============================================================================== -class StringHolder +class StringHolderUtils { public: - StringHolder() = delete; - - using CharPointerType = String::CharPointerType; - using CharType = String::CharPointerType::CharType; + using CharPointerType = StringHolder::CharPointerType; + using CharType = StringHolder::CharType; - //============================================================================== static CharPointerType createUninitialisedBytes (size_t numBytes) { numBytes = (numBytes + 3) & ~(size_t) 3; - auto s = unalignedPointerCast (new char [sizeof (StringHolder) - sizeof (CharType) + numBytes]); - s->refCount.value = 0; + auto* bytes = new char [sizeof (StringHolder) - sizeof (CharType) + numBytes]; + auto s = unalignedPointerCast (bytes); + s->refCount = 0; s->allocatedNumBytes = numBytes; - return CharPointerType (s->text); + return CharPointerType (unalignedPointerCast (bytes + offsetof (StringHolder, text))); } template static CharPointerType createFromCharPointer (const CharPointer text) { if (text.getAddress() == nullptr || text.isEmpty()) - return CharPointerType (&(emptyString.text)); + return CharPointerType (emptyString.text); auto bytesNeeded = sizeof (CharType) + CharPointerType::getBytesRequiredFor (text); auto dest = createUninitialisedBytes (bytesNeeded); @@ -90,7 +90,7 @@ public: static CharPointerType createFromCharPointer (const CharPointer text, size_t maxChars) { if (text.getAddress() == nullptr || text.isEmpty() || maxChars == 0) - return CharPointerType (&(emptyString.text)); + return CharPointerType (emptyString.text); auto end = text; size_t numChars = 0; @@ -111,7 +111,7 @@ public: static CharPointerType createFromCharPointer (const CharPointer start, const CharPointer end) { if (start.getAddress() == nullptr || start.isEmpty()) - return CharPointerType (&(emptyString.text)); + return CharPointerType (emptyString.text); auto e = start; int numChars = 0; @@ -131,7 +131,7 @@ public: static CharPointerType createFromCharPointer (const CharPointerType start, const CharPointerType end) { if (start.getAddress() == nullptr || start.isEmpty()) - return CharPointerType (&(emptyString.text)); + return CharPointerType (emptyString.text); auto numBytes = (size_t) (reinterpret_cast (end.getAddress()) - reinterpret_cast (start.getAddress())); @@ -171,7 +171,7 @@ public: static int getReferenceCount (const CharPointerType text) noexcept { - return bufferFromText (text)->refCount.get() + 1; + return bufferFromText (text)->refCount + 1; } //============================================================================== @@ -186,7 +186,7 @@ public: return newText; } - if (b->allocatedNumBytes >= numBytes && b->refCount.get() <= 0) + if (b->allocatedNumBytes >= numBytes && b->refCount <= 0) return text; auto newText = createUninitialisedBytes (jmax (b->allocatedNumBytes, numBytes)); @@ -201,22 +201,18 @@ public: return bufferFromText (text)->allocatedNumBytes; } - //============================================================================== - Atomic refCount; - size_t allocatedNumBytes; - CharType text[1]; - private: - static StringHolder* bufferFromText (const CharPointerType text) noexcept + StringHolderUtils() = delete; + ~StringHolderUtils() = delete; + + static StringHolder* bufferFromText (const CharPointerType charPtr) noexcept { - // (Can't use offsetof() here because of warnings about this not being a POD) - return unalignedPointerCast (reinterpret_cast (text.getAddress()) - - (reinterpret_cast (reinterpret_cast (128)->text) - 128)); + return unalignedPointerCast (unalignedPointerCast (charPtr.getAddress()) - offsetof (StringHolder, text)); } static bool isEmptyString (StringHolder* other) { - return (other->refCount.get() & 0x30000000) != 0; + return other == &emptyString; } void compileTimeChecks() @@ -231,25 +227,22 @@ private: #else #error "native wchar_t size is unknown" #endif - - static_assert (sizeof (EmptyString) == sizeof (StringHolder), - "StringHolder is not large enough to hold an empty String"); } }; //============================================================================== -String::String() noexcept : text (&(emptyString.text)) +String::String() noexcept : text (emptyString.text) { } String::~String() noexcept { - StringHolder::release (text); + StringHolderUtils::release (text); } String::String (const String& other) noexcept : text (other.text) { - StringHolder::retain (text); + StringHolderUtils::retain (text); } void String::swapWith (String& other) noexcept @@ -259,20 +252,20 @@ void String::swapWith (String& other) noexcept void String::clear() noexcept { - StringHolder::release (text); - text = &(emptyString.text); + StringHolderUtils::release (text); + text = emptyString.text; } String& String::operator= (const String& other) noexcept { - StringHolder::retain (other.text); - StringHolder::release (text.atomicSwap (other.text)); + StringHolderUtils::retain (other.text); + StringHolderUtils::release (text.atomicSwap (other.text)); return *this; } String::String (String&& other) noexcept : text (other.text) { - other.text = &(emptyString.text); + other.text = emptyString.text; } String& String::operator= (String&& other) noexcept @@ -284,23 +277,23 @@ String& String::operator= (String&& other) noexcept inline String::PreallocationBytes::PreallocationBytes (const size_t num) noexcept : numBytes (num) {} String::String (const PreallocationBytes& preallocationSize) - : text (StringHolder::createUninitialisedBytes (preallocationSize.numBytes + sizeof (CharPointerType::CharType))) + : text (StringHolderUtils::createUninitialisedBytes (preallocationSize.numBytes + sizeof (CharPointerType::CharType))) { } void String::preallocateBytes (const size_t numBytesNeeded) { - text = StringHolder::makeUniqueWithByteSize (text, numBytesNeeded + sizeof (CharPointerType::CharType)); + text = StringHolderUtils::makeUniqueWithByteSize (text, numBytesNeeded + sizeof (CharPointerType::CharType)); } int String::getReferenceCount() const noexcept { - return StringHolder::getReferenceCount (text); + return StringHolderUtils::getReferenceCount (text); } //============================================================================== String::String (const char* const t) - : text (StringHolder::createFromCharPointer (CharPointer_ASCII (t))) + : text (StringHolderUtils::createFromCharPointer (CharPointer_ASCII (t))) { /* If you get an assertion here, then you're trying to create a string from 8-bit data that contains values greater than 127. These can NOT be correctly converted to unicode @@ -323,7 +316,7 @@ String::String (const char* const t) } String::String (const char* const t, const size_t maxChars) - : text (StringHolder::createFromCharPointer (CharPointer_ASCII (t), maxChars)) + : text (StringHolderUtils::createFromCharPointer (CharPointer_ASCII (t), maxChars)) { /* If you get an assertion here, then you're trying to create a string from 8-bit data that contains values greater than 127. These can NOT be correctly converted to unicode @@ -345,23 +338,23 @@ String::String (const char* const t, const size_t maxChars) jassert (t == nullptr || CharPointer_ASCII::isValidString (t, (int) maxChars)); } -String::String (const wchar_t* const t) : text (StringHolder::createFromCharPointer (castToCharPointer_wchar_t (t))) {} -String::String (const CharPointer_UTF8 t) : text (StringHolder::createFromCharPointer (t)) {} -String::String (const CharPointer_UTF16 t) : text (StringHolder::createFromCharPointer (t)) {} -String::String (const CharPointer_UTF32 t) : text (StringHolder::createFromCharPointer (t)) {} -String::String (const CharPointer_ASCII t) : text (StringHolder::createFromCharPointer (t)) {} +String::String (const wchar_t* const t) : text (StringHolderUtils::createFromCharPointer (castToCharPointer_wchar_t (t))) {} +String::String (const CharPointer_UTF8 t) : text (StringHolderUtils::createFromCharPointer (t)) {} +String::String (const CharPointer_UTF16 t) : text (StringHolderUtils::createFromCharPointer (t)) {} +String::String (const CharPointer_UTF32 t) : text (StringHolderUtils::createFromCharPointer (t)) {} +String::String (const CharPointer_ASCII t) : text (StringHolderUtils::createFromCharPointer (t)) {} -String::String (CharPointer_UTF8 t, size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {} -String::String (CharPointer_UTF16 t, size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {} -String::String (CharPointer_UTF32 t, size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {} -String::String (const wchar_t* t, size_t maxChars) : text (StringHolder::createFromCharPointer (castToCharPointer_wchar_t (t), maxChars)) {} +String::String (CharPointer_UTF8 t, size_t maxChars) : text (StringHolderUtils::createFromCharPointer (t, maxChars)) {} +String::String (CharPointer_UTF16 t, size_t maxChars) : text (StringHolderUtils::createFromCharPointer (t, maxChars)) {} +String::String (CharPointer_UTF32 t, size_t maxChars) : text (StringHolderUtils::createFromCharPointer (t, maxChars)) {} +String::String (const wchar_t* t, size_t maxChars) : text (StringHolderUtils::createFromCharPointer (castToCharPointer_wchar_t (t), maxChars)) {} -String::String (CharPointer_UTF8 start, CharPointer_UTF8 end) : text (StringHolder::createFromCharPointer (start, end)) {} -String::String (CharPointer_UTF16 start, CharPointer_UTF16 end) : text (StringHolder::createFromCharPointer (start, end)) {} -String::String (CharPointer_UTF32 start, CharPointer_UTF32 end) : text (StringHolder::createFromCharPointer (start, end)) {} +String::String (CharPointer_UTF8 start, CharPointer_UTF8 end) : text (StringHolderUtils::createFromCharPointer (start, end)) {} +String::String (CharPointer_UTF16 start, CharPointer_UTF16 end) : text (StringHolderUtils::createFromCharPointer (start, end)) {} +String::String (CharPointer_UTF32 start, CharPointer_UTF32 end) : text (StringHolderUtils::createFromCharPointer (start, end)) {} -String::String (const std::string& s) : text (StringHolder::createFromFixedLength (s.data(), s.size())) {} -String::String (StringRef s) : text (StringHolder::createFromCharPointer (s.text)) {} +String::String (const std::string& s) : text (StringHolderUtils::createFromFixedLength (s.data(), s.size())) {} +String::String (StringRef s) : text (StringHolderUtils::createFromCharPointer (s.text)) {} String String::charToString (juce_wchar character) { @@ -487,7 +480,7 @@ namespace NumberToStringConverters char buffer [charsNeededForInt]; auto* end = buffer + numElementsInArray (buffer); auto* start = numberToString (end, number); - return StringHolder::createFromFixedLength (start, (size_t) (end - start - 1)); + return StringHolderUtils::createFromFixedLength (start, (size_t) (end - start - 1)); } static String::CharPointerType createFromDouble (double number, int numberOfDecimalPlaces, bool useScientificNotation) @@ -495,7 +488,7 @@ namespace NumberToStringConverters char buffer [charsNeededForDouble]; size_t len; auto start = doubleToString (buffer, number, numberOfDecimalPlaces, useScientificNotation, len); - return StringHolder::createFromFixedLength (start, len); + return StringHolderUtils::createFromFixedLength (start, len); } } @@ -1322,7 +1315,7 @@ struct StringCreationHelper } StringCreationHelper (const String::CharPointerType s) - : source (s), allocatedBytes (StringHolder::getAllocatedNumBytes (s)) + : source (s), allocatedBytes (StringHolderUtils::getAllocatedNumBytes (s)) { result.preallocateBytes (allocatedBytes); dest = result.getCharPointer(); diff --git a/modules/juce_core/text/juce_String.h b/modules/juce_core/text/juce_String.h index 66f7e7c9..e24f79ba 100644 --- a/modules/juce_core/text/juce_String.h +++ b/modules/juce_core/text/juce_String.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_StringArray.cpp b/modules/juce_core/text/juce_StringArray.cpp index 5f18ff5c..e2a445f1 100644 --- a/modules/juce_core/text/juce_StringArray.cpp +++ b/modules/juce_core/text/juce_StringArray.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_StringArray.h b/modules/juce_core/text/juce_StringArray.h index b1e87dbb..2f198f16 100644 --- a/modules/juce_core/text/juce_StringArray.h +++ b/modules/juce_core/text/juce_StringArray.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_StringPairArray.cpp b/modules/juce_core/text/juce_StringPairArray.cpp index 9bd239c2..ecc0c82b 100644 --- a/modules/juce_core/text/juce_StringPairArray.cpp +++ b/modules/juce_core/text/juce_StringPairArray.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_StringPairArray.h b/modules/juce_core/text/juce_StringPairArray.h index 95ae9ed0..dd657d93 100644 --- a/modules/juce_core/text/juce_StringPairArray.h +++ b/modules/juce_core/text/juce_StringPairArray.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_StringPool.cpp b/modules/juce_core/text/juce_StringPool.cpp index 54c11bef..2caf18e0 100644 --- a/modules/juce_core/text/juce_StringPool.cpp +++ b/modules/juce_core/text/juce_StringPool.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_StringPool.h b/modules/juce_core/text/juce_StringPool.h index b7d31357..b6f0d8e9 100644 --- a/modules/juce_core/text/juce_StringPool.h +++ b/modules/juce_core/text/juce_StringPool.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_StringRef.h b/modules/juce_core/text/juce_StringRef.h index 6941eb8c..5b4666c7 100644 --- a/modules/juce_core/text/juce_StringRef.h +++ b/modules/juce_core/text/juce_StringRef.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_TextDiff.cpp b/modules/juce_core/text/juce_TextDiff.cpp index 315462ad..03f30fbb 100644 --- a/modules/juce_core/text/juce_TextDiff.cpp +++ b/modules/juce_core/text/juce_TextDiff.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/text/juce_TextDiff.h b/modules/juce_core/text/juce_TextDiff.h index 482e8535..85056e2d 100644 --- a/modules/juce_core/text/juce_TextDiff.h +++ b/modules/juce_core/text/juce_TextDiff.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_ChildProcess.cpp b/modules/juce_core/threads/juce_ChildProcess.cpp index 2e5f1433..1e559b1c 100644 --- a/modules/juce_core/threads/juce_ChildProcess.cpp +++ b/modules/juce_core/threads/juce_ChildProcess.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_ChildProcess.h b/modules/juce_core/threads/juce_ChildProcess.h index 47a26281..3c5e83bb 100644 --- a/modules/juce_core/threads/juce_ChildProcess.h +++ b/modules/juce_core/threads/juce_ChildProcess.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_CriticalSection.h b/modules/juce_core/threads/juce_CriticalSection.h index caaa1855..9d5e12de 100644 --- a/modules/juce_core/threads/juce_CriticalSection.h +++ b/modules/juce_core/threads/juce_CriticalSection.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_DynamicLibrary.h b/modules/juce_core/threads/juce_DynamicLibrary.h index fc9d05c7..1c48c404 100644 --- a/modules/juce_core/threads/juce_DynamicLibrary.h +++ b/modules/juce_core/threads/juce_DynamicLibrary.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_HighResolutionTimer.cpp b/modules/juce_core/threads/juce_HighResolutionTimer.cpp index db4e3e8e..de0f3a76 100644 --- a/modules/juce_core/threads/juce_HighResolutionTimer.cpp +++ b/modules/juce_core/threads/juce_HighResolutionTimer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_HighResolutionTimer.h b/modules/juce_core/threads/juce_HighResolutionTimer.h index cd08f35d..29ad4fd9 100644 --- a/modules/juce_core/threads/juce_HighResolutionTimer.h +++ b/modules/juce_core/threads/juce_HighResolutionTimer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_InterProcessLock.h b/modules/juce_core/threads/juce_InterProcessLock.h index 56ae9d0f..fd29ba7f 100644 --- a/modules/juce_core/threads/juce_InterProcessLock.h +++ b/modules/juce_core/threads/juce_InterProcessLock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_Process.h b/modules/juce_core/threads/juce_Process.h index 66ee79e0..dfc0c3a2 100644 --- a/modules/juce_core/threads/juce_Process.h +++ b/modules/juce_core/threads/juce_Process.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_ReadWriteLock.cpp b/modules/juce_core/threads/juce_ReadWriteLock.cpp index ed8b5a28..2140084a 100644 --- a/modules/juce_core/threads/juce_ReadWriteLock.cpp +++ b/modules/juce_core/threads/juce_ReadWriteLock.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_ReadWriteLock.h b/modules/juce_core/threads/juce_ReadWriteLock.h index 3d26f5f9..a26d6df2 100644 --- a/modules/juce_core/threads/juce_ReadWriteLock.h +++ b/modules/juce_core/threads/juce_ReadWriteLock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -74,7 +74,7 @@ public: thread has it locked for writing, then this will fail and return false. @returns true if the lock is successfully gained. - @see exitRead, ScopedReadLock + @see exitRead, ScopedTryReadLock */ bool tryEnterRead() const noexcept; @@ -106,7 +106,7 @@ public: to obtain the lock. @returns true if the lock is successfully gained. - @see enterWrite + @see enterWrite, ScopedTryWriteLock */ bool tryEnterWrite() const noexcept; diff --git a/modules/juce_core/threads/juce_ScopedLock.h b/modules/juce_core/threads/juce_ScopedLock.h index a140f146..6c1ba887 100644 --- a/modules/juce_core/threads/juce_ScopedLock.h +++ b/modules/juce_core/threads/juce_ScopedLock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_ScopedReadLock.h b/modules/juce_core/threads/juce_ScopedReadLock.h index ae3c41ee..b2d7e18c 100644 --- a/modules/juce_core/threads/juce_ScopedReadLock.h +++ b/modules/juce_core/threads/juce_ScopedReadLock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -81,4 +81,90 @@ private: JUCE_DECLARE_NON_COPYABLE (ScopedReadLock) }; +//============================================================================== +/** + Automatically locks and unlocks a ReadWriteLock object. + + Use one of these as a local variable to control access to a ReadWriteLock. + + e.g. @code + + ReadWriteLock myLock; + + for (;;) + { + const ScopedTryReadLock myScopedTryLock (myLock); + + // Unlike using a ScopedReadLock, this may fail to actually get the lock, so you + // should test this with the isLocked() method before doing your thread-unsafe + // action. + + if (myScopedTryLock.isLocked()) + { + ...do some stuff... + } + else + { + ..our attempt at locking failed because a write lock has already been issued.. + } + + // myLock gets unlocked here (if it was locked). + } + @endcode + + @see ReadWriteLock, ScopedTryWriteLock + + @tags{Core} +*/ +class JUCE_API ScopedTryReadLock +{ +public: + //============================================================================== + /** Creates a ScopedTryReadLock and calls ReadWriteLock::tryEnterRead() as soon as it is + created. When the ScopedTryReadLock object is destructed, the ReadWriteLock will be unlocked + (if it was successfully acquired). + + Make sure this object is created and destructed by the same thread, otherwise there are no + guarantees what will happen! Best just to use it as a local stack object, rather than creating + one with the new() operator. + */ + explicit ScopedTryReadLock (ReadWriteLock& lockIn) + : ScopedTryReadLock (lockIn, true) {} + + /** Creates a ScopedTryReadLock. + + If acquireLockOnInitialisation is true then as soon as it is created, this will call + ReadWriteLock::tryEnterRead(), and when the ScopedTryReadLock object is destructed, the + ReadWriteLock will be unlocked (if it was successfully acquired). + + Make sure this object is created and destructed by the same thread, otherwise there are no + guarantees what will happen! Best just to use it as a local stack object, rather than creating + one with the new() operator. + */ + ScopedTryReadLock (ReadWriteLock& lockIn, bool acquireLockOnInitialisation) noexcept + : lock (lockIn), lockWasSuccessful (acquireLockOnInitialisation && lock.tryEnterRead()) {} + + /** Destructor. + + The ReadWriteLock's exitRead() method will be called when the destructor is called. + + Make sure this object is created and destructed by the same thread, otherwise there are no + guarantees what will happen! + */ + ~ScopedTryReadLock() noexcept { if (lockWasSuccessful) lock.exitRead(); } + + /** Returns true if the mutex was successfully locked. */ + bool isLocked() const noexcept { return lockWasSuccessful; } + + /** Retry gaining the lock by calling tryEnter on the underlying lock. */ + bool retryLock() noexcept { return lockWasSuccessful = lock.tryEnterRead(); } + +private: + //============================================================================== + ReadWriteLock& lock; + bool lockWasSuccessful; + + JUCE_DECLARE_NON_COPYABLE (ScopedTryReadLock) +}; + } // namespace juce diff --git a/modules/juce_core/threads/juce_ScopedWriteLock.h b/modules/juce_core/threads/juce_ScopedWriteLock.h index ccd07a33..5f7290e7 100644 --- a/modules/juce_core/threads/juce_ScopedWriteLock.h +++ b/modules/juce_core/threads/juce_ScopedWriteLock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -81,4 +81,90 @@ private: JUCE_DECLARE_NON_COPYABLE (ScopedWriteLock) }; +//============================================================================== +/** + Automatically locks and unlocks a ReadWriteLock object. + + Use one of these as a local variable to control access to a ReadWriteLock. + + e.g. @code + + ReadWriteLock myLock; + + for (;;) + { + const ScopedTryWriteLock myScopedTryLock (myLock); + + // Unlike using a ScopedWriteLock, this may fail to actually get the lock, so you + // should test this with the isLocked() method before doing your thread-unsafe + // action. + + if (myScopedTryLock.isLocked()) + { + ...do some stuff... + } + else + { + ..our attempt at locking failed because some other thread has already locked the object.. + } + + // myLock gets unlocked here (if it was locked). + } + @endcode + + @see ReadWriteLock, ScopedTryWriteLock + + @tags{Core} +*/ +class JUCE_API ScopedTryWriteLock +{ +public: + //============================================================================== + /** Creates a ScopedTryWriteLock and calls ReadWriteLock::tryEnterWrite() immediately. + When the ScopedTryWriteLock object is destructed, the ReadWriteLock will be unlocked + (if it was successfully acquired). + + Make sure this object is created and destructed by the same thread, otherwise there are no + guarantees what will happen! Best just to use it as a local stack object, rather than creating + one with the new() operator. + */ + ScopedTryWriteLock (ReadWriteLock& lockIn) noexcept + : ScopedTryWriteLock (lockIn, true) {} + + /** Creates a ScopedTryWriteLock. + + If acquireLockOnInitialisation is true then as soon as it is created, this will call + ReadWriteLock::tryEnterWrite(), and when the ScopedTryWriteLock object is destructed, the + ReadWriteLock will be unlocked (if it was successfully acquired). + + Make sure this object is created and destructed by the same thread, otherwise there are no + guarantees what will happen! Best just to use it as a local stack object, rather than creating + one with the new() operator. + */ + ScopedTryWriteLock (ReadWriteLock& lockIn, bool acquireLockOnInitialisation) noexcept + : lock (lockIn), lockWasSuccessful (acquireLockOnInitialisation && lock.tryEnterWrite()) {} + + /** Destructor. + + The ReadWriteLock's exitWrite() method will be called when the destructor is called. + + Make sure this object is created and destructed by the same thread, + otherwise there are no guarantees what will happen! + */ + ~ScopedTryWriteLock() noexcept { if (lockWasSuccessful) lock.exitWrite(); } + + /** Returns true if the mutex was successfully locked. */ + bool isLocked() const noexcept { return lockWasSuccessful; } + + /** Retry gaining the lock by calling tryEnter on the underlying lock. */ + bool retryLock() noexcept { return lockWasSuccessful = lock.tryEnterWrite(); } + +private: + //============================================================================== + ReadWriteLock& lock; + bool lockWasSuccessful; + + JUCE_DECLARE_NON_COPYABLE (ScopedTryWriteLock) +}; + } diff --git a/modules/juce_core/threads/juce_SpinLock.h b/modules/juce_core/threads/juce_SpinLock.h index 14f7c6b0..4bf337d3 100644 --- a/modules/juce_core/threads/juce_SpinLock.h +++ b/modules/juce_core/threads/juce_SpinLock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_Thread.cpp b/modules/juce_core/threads/juce_Thread.cpp index e0f8e7dc..6c981e0a 100644 --- a/modules/juce_core/threads/juce_Thread.cpp +++ b/modules/juce_core/threads/juce_Thread.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_Thread.h b/modules/juce_core/threads/juce_Thread.h index 5db90efc..19634d67 100644 --- a/modules/juce_core/threads/juce_Thread.h +++ b/modules/juce_core/threads/juce_Thread.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_ThreadLocalValue.h b/modules/juce_core/threads/juce_ThreadLocalValue.h index 1c88d248..b8d0cbb5 100644 --- a/modules/juce_core/threads/juce_ThreadLocalValue.h +++ b/modules/juce_core/threads/juce_ThreadLocalValue.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_ThreadPool.cpp b/modules/juce_core/threads/juce_ThreadPool.cpp index ce5ecf8b..9b6c446f 100644 --- a/modules/juce_core/threads/juce_ThreadPool.cpp +++ b/modules/juce_core/threads/juce_ThreadPool.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_ThreadPool.h b/modules/juce_core/threads/juce_ThreadPool.h index 0a36b7af..64394010 100644 --- a/modules/juce_core/threads/juce_ThreadPool.h +++ b/modules/juce_core/threads/juce_ThreadPool.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_TimeSliceThread.cpp b/modules/juce_core/threads/juce_TimeSliceThread.cpp index 068d7dc7..261fe859 100644 --- a/modules/juce_core/threads/juce_TimeSliceThread.cpp +++ b/modules/juce_core/threads/juce_TimeSliceThread.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_TimeSliceThread.h b/modules/juce_core/threads/juce_TimeSliceThread.h index d74723d8..fc4009ad 100644 --- a/modules/juce_core/threads/juce_TimeSliceThread.h +++ b/modules/juce_core/threads/juce_TimeSliceThread.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_WaitableEvent.cpp b/modules/juce_core/threads/juce_WaitableEvent.cpp index 6c8855e9..14323707 100644 --- a/modules/juce_core/threads/juce_WaitableEvent.cpp +++ b/modules/juce_core/threads/juce_WaitableEvent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/threads/juce_WaitableEvent.h b/modules/juce_core/threads/juce_WaitableEvent.h index 52269f70..406ad74c 100644 --- a/modules/juce_core/threads/juce_WaitableEvent.h +++ b/modules/juce_core/threads/juce_WaitableEvent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/time/juce_PerformanceCounter.cpp b/modules/juce_core/time/juce_PerformanceCounter.cpp index 546cbb30..6bc000df 100644 --- a/modules/juce_core/time/juce_PerformanceCounter.cpp +++ b/modules/juce_core/time/juce_PerformanceCounter.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/time/juce_PerformanceCounter.h b/modules/juce_core/time/juce_PerformanceCounter.h index 0b8a22ba..b125b427 100644 --- a/modules/juce_core/time/juce_PerformanceCounter.h +++ b/modules/juce_core/time/juce_PerformanceCounter.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/time/juce_RelativeTime.cpp b/modules/juce_core/time/juce_RelativeTime.cpp index c9a2514b..efa17b82 100644 --- a/modules/juce_core/time/juce_RelativeTime.cpp +++ b/modules/juce_core/time/juce_RelativeTime.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/time/juce_RelativeTime.h b/modules/juce_core/time/juce_RelativeTime.h index e7d546ee..95a864b7 100644 --- a/modules/juce_core/time/juce_RelativeTime.h +++ b/modules/juce_core/time/juce_RelativeTime.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/time/juce_Time.cpp b/modules/juce_core/time/juce_Time.cpp index 4dbae77f..72dd854b 100644 --- a/modules/juce_core/time/juce_Time.cpp +++ b/modules/juce_core/time/juce_Time.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/time/juce_Time.h b/modules/juce_core/time/juce_Time.h index aab745c1..1c8bf3eb 100644 --- a/modules/juce_core/time/juce_Time.h +++ b/modules/juce_core/time/juce_Time.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/unit_tests/juce_UnitTest.cpp b/modules/juce_core/unit_tests/juce_UnitTest.cpp index c80ecd82..1b218eed 100644 --- a/modules/juce_core/unit_tests/juce_UnitTest.cpp +++ b/modules/juce_core/unit_tests/juce_UnitTest.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/unit_tests/juce_UnitTest.h b/modules/juce_core/unit_tests/juce_UnitTest.h index e843fe53..1685f5bc 100644 --- a/modules/juce_core/unit_tests/juce_UnitTest.h +++ b/modules/juce_core/unit_tests/juce_UnitTest.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/unit_tests/juce_UnitTestCategories.h b/modules/juce_core/unit_tests/juce_UnitTestCategories.h index 9f6fa6ca..4846fb31 100644 --- a/modules/juce_core/unit_tests/juce_UnitTestCategories.h +++ b/modules/juce_core/unit_tests/juce_UnitTestCategories.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -28,6 +28,7 @@ namespace UnitTestCategories static const String analytics { "Analytics" }; static const String audio { "Audio" }; static const String audioProcessorParameters { "AudioProcessorParameters" }; + static const String audioProcessors { "AudioProcessors" }; static const String blocks { "Blocks" }; static const String compression { "Compression" }; static const String containers { "Containers" }; diff --git a/modules/juce_core/xml/juce_XmlDocument.cpp b/modules/juce_core/xml/juce_XmlDocument.cpp index f3ae5435..075f9476 100644 --- a/modules/juce_core/xml/juce_XmlDocument.cpp +++ b/modules/juce_core/xml/juce_XmlDocument.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/xml/juce_XmlDocument.h b/modules/juce_core/xml/juce_XmlDocument.h index fe12c3f5..acffa7b4 100644 --- a/modules/juce_core/xml/juce_XmlDocument.h +++ b/modules/juce_core/xml/juce_XmlDocument.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/xml/juce_XmlElement.cpp b/modules/juce_core/xml/juce_XmlElement.cpp index 668c8c7a..f3d8ab0f 100644 --- a/modules/juce_core/xml/juce_XmlElement.cpp +++ b/modules/juce_core/xml/juce_XmlElement.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/xml/juce_XmlElement.h b/modules/juce_core/xml/juce_XmlElement.h index 1a42f072..041539fb 100644 --- a/modules/juce_core/xml/juce_XmlElement.h +++ b/modules/juce_core/xml/juce_XmlElement.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp b/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp index 3e8199e6..af89f3d3 100644 --- a/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp +++ b/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h b/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h index 63ff6b9d..b68051e8 100644 --- a/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h +++ b/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp b/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp index f29f3d73..9252d57f 100644 --- a/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp +++ b/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h b/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h index ae3b30f9..f9203df8 100644 --- a/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h +++ b/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/zip/juce_ZipFile.cpp b/modules/juce_core/zip/juce_ZipFile.cpp index 084e6d37..4bdd518f 100644 --- a/modules/juce_core/zip/juce_ZipFile.cpp +++ b/modules/juce_core/zip/juce_ZipFile.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_core/zip/juce_ZipFile.h b/modules/juce_core/zip/juce_ZipFile.h index 212e5473..ffd665dd 100644 --- a/modules/juce_core/zip/juce_ZipFile.h +++ b/modules/juce_core/zip/juce_ZipFile.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_cryptography/encryption/juce_BlowFish.cpp b/modules/juce_cryptography/encryption/juce_BlowFish.cpp index a56b9429..150890e4 100644 --- a/modules/juce_cryptography/encryption/juce_BlowFish.cpp +++ b/modules/juce_cryptography/encryption/juce_BlowFish.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_cryptography/encryption/juce_BlowFish.h b/modules/juce_cryptography/encryption/juce_BlowFish.h index 12bcf4c8..28c1439f 100644 --- a/modules/juce_cryptography/encryption/juce_BlowFish.h +++ b/modules/juce_cryptography/encryption/juce_BlowFish.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_cryptography/encryption/juce_Primes.cpp b/modules/juce_cryptography/encryption/juce_Primes.cpp index b2aa0beb..73e44a0c 100644 --- a/modules/juce_cryptography/encryption/juce_Primes.cpp +++ b/modules/juce_cryptography/encryption/juce_Primes.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_cryptography/encryption/juce_Primes.h b/modules/juce_cryptography/encryption/juce_Primes.h index 59f79e94..463a4bad 100644 --- a/modules/juce_cryptography/encryption/juce_Primes.h +++ b/modules/juce_cryptography/encryption/juce_Primes.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_cryptography/encryption/juce_RSAKey.cpp b/modules/juce_cryptography/encryption/juce_RSAKey.cpp index 2090f812..a00d8fee 100644 --- a/modules/juce_cryptography/encryption/juce_RSAKey.cpp +++ b/modules/juce_cryptography/encryption/juce_RSAKey.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_cryptography/encryption/juce_RSAKey.h b/modules/juce_cryptography/encryption/juce_RSAKey.h index ed8d3fdf..581ac6f6 100644 --- a/modules/juce_cryptography/encryption/juce_RSAKey.h +++ b/modules/juce_cryptography/encryption/juce_RSAKey.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_cryptography/hashing/juce_MD5.cpp b/modules/juce_cryptography/hashing/juce_MD5.cpp index b46ee022..117eb07b 100644 --- a/modules/juce_cryptography/hashing/juce_MD5.cpp +++ b/modules/juce_cryptography/hashing/juce_MD5.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_cryptography/hashing/juce_MD5.h b/modules/juce_cryptography/hashing/juce_MD5.h index da1e55cd..92bf3179 100644 --- a/modules/juce_cryptography/hashing/juce_MD5.h +++ b/modules/juce_cryptography/hashing/juce_MD5.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_cryptography/hashing/juce_SHA256.cpp b/modules/juce_cryptography/hashing/juce_SHA256.cpp index ce382955..44e9a4c8 100644 --- a/modules/juce_cryptography/hashing/juce_SHA256.cpp +++ b/modules/juce_cryptography/hashing/juce_SHA256.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_cryptography/hashing/juce_SHA256.h b/modules/juce_cryptography/hashing/juce_SHA256.h index 74f615c6..f2c8add5 100644 --- a/modules/juce_cryptography/hashing/juce_SHA256.h +++ b/modules/juce_cryptography/hashing/juce_SHA256.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_cryptography/hashing/juce_Whirlpool.cpp b/modules/juce_cryptography/hashing/juce_Whirlpool.cpp index cfec0a69..001f108a 100644 --- a/modules/juce_cryptography/hashing/juce_Whirlpool.cpp +++ b/modules/juce_cryptography/hashing/juce_Whirlpool.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_cryptography/hashing/juce_Whirlpool.h b/modules/juce_cryptography/hashing/juce_Whirlpool.h index 555f2126..05dbee7f 100644 --- a/modules/juce_cryptography/hashing/juce_Whirlpool.h +++ b/modules/juce_cryptography/hashing/juce_Whirlpool.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_cryptography/juce_cryptography.cpp b/modules/juce_cryptography/juce_cryptography.cpp index f1d8f23c..81709a1d 100644 --- a/modules/juce_cryptography/juce_cryptography.cpp +++ b/modules/juce_cryptography/juce_cryptography.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_cryptography/juce_cryptography.h b/modules/juce_cryptography/juce_cryptography.h index f9bf9c51..9bab0b7d 100644 --- a/modules/juce_cryptography/juce_cryptography.h +++ b/modules/juce_cryptography/juce_cryptography.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_cryptography vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE cryptography classes description: Classes for various basic cryptography functions, including RSA, Blowfish, MD5, SHA, etc. website: http://www.juce.com/juce diff --git a/modules/juce_cryptography/juce_cryptography.mm b/modules/juce_cryptography/juce_cryptography.mm index 79d1b129..31bd5f0f 100644 --- a/modules/juce_cryptography/juce_cryptography.mm +++ b/modules/juce_cryptography/juce_cryptography.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp b/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp index 0b93639b..f23719d5 100644 --- a/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp +++ b/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h b/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h index 80f6650d..1253deba 100644 --- a/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h +++ b/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp b/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp index 472543d9..205f9e4c 100644 --- a/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp +++ b/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/app_properties/juce_PropertiesFile.h b/modules/juce_data_structures/app_properties/juce_PropertiesFile.h index 448cc7f8..f48a3302 100644 --- a/modules/juce_data_structures/app_properties/juce_PropertiesFile.h +++ b/modules/juce_data_structures/app_properties/juce_PropertiesFile.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/juce_data_structures.cpp b/modules/juce_data_structures/juce_data_structures.cpp index a93db46f..4b482629 100644 --- a/modules/juce_data_structures/juce_data_structures.cpp +++ b/modules/juce_data_structures/juce_data_structures.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/juce_data_structures.h b/modules/juce_data_structures/juce_data_structures.h index 1e86e71b..546f593d 100644 --- a/modules/juce_data_structures/juce_data_structures.h +++ b/modules/juce_data_structures/juce_data_structures.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_data_structures vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE data model helper classes description: Classes for undo/redo management, and smart data structures. website: http://www.juce.com/juce diff --git a/modules/juce_data_structures/juce_data_structures.mm b/modules/juce_data_structures/juce_data_structures.mm index 06c479a4..cb196859 100644 --- a/modules/juce_data_structures/juce_data_structures.mm +++ b/modules/juce_data_structures/juce_data_structures.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/undomanager/juce_UndoManager.cpp b/modules/juce_data_structures/undomanager/juce_UndoManager.cpp index 69097965..ccd89d81 100644 --- a/modules/juce_data_structures/undomanager/juce_UndoManager.cpp +++ b/modules/juce_data_structures/undomanager/juce_UndoManager.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/undomanager/juce_UndoManager.h b/modules/juce_data_structures/undomanager/juce_UndoManager.h index 6ebfc56c..c99c2a31 100644 --- a/modules/juce_data_structures/undomanager/juce_UndoManager.h +++ b/modules/juce_data_structures/undomanager/juce_UndoManager.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/undomanager/juce_UndoableAction.h b/modules/juce_data_structures/undomanager/juce_UndoableAction.h index 1aee24c1..51e495ab 100644 --- a/modules/juce_data_structures/undomanager/juce_UndoableAction.h +++ b/modules/juce_data_structures/undomanager/juce_UndoableAction.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/values/juce_CachedValue.cpp b/modules/juce_data_structures/values/juce_CachedValue.cpp index 8d22ccac..c056a861 100644 --- a/modules/juce_data_structures/values/juce_CachedValue.cpp +++ b/modules/juce_data_structures/values/juce_CachedValue.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/values/juce_CachedValue.h b/modules/juce_data_structures/values/juce_CachedValue.h index f0bcd45a..0ce17a86 100644 --- a/modules/juce_data_structures/values/juce_CachedValue.h +++ b/modules/juce_data_structures/values/juce_CachedValue.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/values/juce_Value.cpp b/modules/juce_data_structures/values/juce_Value.cpp index 496527e5..4b5c5fe6 100644 --- a/modules/juce_data_structures/values/juce_Value.cpp +++ b/modules/juce_data_structures/values/juce_Value.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/values/juce_Value.h b/modules/juce_data_structures/values/juce_Value.h index 90babe87..94f6d1ed 100644 --- a/modules/juce_data_structures/values/juce_Value.h +++ b/modules/juce_data_structures/values/juce_Value.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -114,7 +114,8 @@ public: */ void referTo (const Value& valueToReferTo); - /** Returns true if this value and the other one are references to the same value. + /** Returns true if this object and the other one use the same underlying + ValueSource object. */ bool refersToSameSourceAs (const Value& other) const; diff --git a/modules/juce_data_structures/values/juce_ValueTree.cpp b/modules/juce_data_structures/values/juce_ValueTree.cpp index f55ddeb8..241a558e 100644 --- a/modules/juce_data_structures/values/juce_ValueTree.cpp +++ b/modules/juce_data_structures/values/juce_ValueTree.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/values/juce_ValueTree.h b/modules/juce_data_structures/values/juce_ValueTree.h index ae4b7931..d262e09c 100644 --- a/modules/juce_data_structures/values/juce_ValueTree.h +++ b/modules/juce_data_structures/values/juce_ValueTree.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h b/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h index d1636f8c..c5a14a56 100644 --- a/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h +++ b/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp b/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp index 08a4c5a1..0009f6a9 100644 --- a/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp +++ b/modules/juce_data_structures/values/juce_ValueTreePropertyWithDefault_test.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp b/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp index 1fb36fe8..22606f72 100644 --- a/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp +++ b/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h b/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h index 095dadd0..6d20ffdb 100644 --- a/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h +++ b/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/containers/juce_AudioBlock.h b/modules/juce_dsp/containers/juce_AudioBlock.h index 9f4dd847..58e1a327 100644 --- a/modules/juce_dsp/containers/juce_AudioBlock.h +++ b/modules/juce_dsp/containers/juce_AudioBlock.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/containers/juce_AudioBlock_test.cpp b/modules/juce_dsp/containers/juce_AudioBlock_test.cpp index a337ebee..df06583c 100644 --- a/modules/juce_dsp/containers/juce_AudioBlock_test.cpp +++ b/modules/juce_dsp/containers/juce_AudioBlock_test.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/containers/juce_FixedSizeFunction.h b/modules/juce_dsp/containers/juce_FixedSizeFunction.h index c5227d04..565f8658 100644 --- a/modules/juce_dsp/containers/juce_FixedSizeFunction.h +++ b/modules/juce_dsp/containers/juce_FixedSizeFunction.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp b/modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp index acb17f4f..6c4aa84a 100644 --- a/modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp +++ b/modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/containers/juce_SIMDRegister.h b/modules/juce_dsp/containers/juce_SIMDRegister.h index ea71c4ff..270193ab 100644 --- a/modules/juce_dsp/containers/juce_SIMDRegister.h +++ b/modules/juce_dsp/containers/juce_SIMDRegister.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -116,9 +116,6 @@ struct SIMDRegister /** Constructs an object from a scalar type by broadcasting it to all elements. */ inline SIMDRegister (Type s) noexcept { *this = s; } - /** Destructor. */ - inline ~SIMDRegister() noexcept = default; - //============================================================================== /** Returns the number of elements in this vector. */ static constexpr size_t size() noexcept { return SIMDNumElements; } diff --git a/modules/juce_dsp/containers/juce_SIMDRegister_Impl.h b/modules/juce_dsp/containers/juce_SIMDRegister_Impl.h index 7b0178ba..2975fad9 100644 --- a/modules/juce_dsp/containers/juce_SIMDRegister_Impl.h +++ b/modules/juce_dsp/containers/juce_SIMDRegister_Impl.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/containers/juce_SIMDRegister_test.cpp b/modules/juce_dsp/containers/juce_SIMDRegister_test.cpp index 1e26f7fe..f5ed7de8 100644 --- a/modules/juce_dsp/containers/juce_SIMDRegister_test.cpp +++ b/modules/juce_dsp/containers/juce_SIMDRegister_test.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -39,7 +39,6 @@ namespace SIMDRegister_test_internal { return static_cast (std::is_signed::value ? (random.nextFloat() * 16.0) - 8.0 : (random.nextFloat() * 8.0)); - } }; @@ -49,59 +48,32 @@ namespace SIMDRegister_test_internal static type next (Random& random) { return static_cast (random.nextInt64()); - - } - }; - - template struct RandomValue { static type next (Random& random) { return RandomPrimitive::next (random); } }; - template - struct RandomValue> - { - static std::complex next (Random& random) - { - return {RandomPrimitive::next (random), RandomPrimitive::next (random)}; } }; - template - struct VecFiller + struct RandomValue { - static void fill (type* dst, const int size, Random& random) - { - for (int i = 0; i < size; ++i) - dst[i] = RandomValue::next (random); - } + static type next (Random& random) { return RandomPrimitive::next (random); } }; - // We need to specialise for complex types: otherwise GCC 6 gives - // us an ICE internal compiler error after which the compiler seg faults. template - struct VecFiller> + struct RandomValue> { - static void fill (std::complex* dst, const int size, Random& random) + static std::complex next (Random& random) { - for (int i = 0; i < size; ++i) - dst[i] = std::complex (RandomValue::next (random), RandomValue::next (random)); + return {RandomPrimitive::next (random), RandomPrimitive::next (random)}; } }; template - struct VecFiller> + static void fillVec (type* dst, Random& random) { - static SIMDRegister fill (Random& random) + std::generate_n (dst, SIMDRegister::SIMDNumElements, [&] { - constexpr int size = (int) SIMDRegister::SIMDNumElements; - #ifdef _MSC_VER - __declspec(align(sizeof (SIMDRegister))) type elements[size]; - #else - type elements[(size_t) size] __attribute__((aligned(sizeof (SIMDRegister)))); - #endif - - VecFiller::fill (elements, size, random); - return SIMDRegister::fromRawArray (elements); - } - }; + return RandomValue::next (random); + }); + } // Avoid visual studio warning template @@ -127,7 +99,7 @@ namespace SIMDRegister_test_internal { return difference (a - b); } -} +} // namespace SIMDRegister_test_internal // These tests need to be strictly run on all platforms supported by JUCE as the // SIMD code is highly platform dependent. @@ -135,6 +107,8 @@ namespace SIMDRegister_test_internal class SIMDRegisterUnitTests : public UnitTest { public: + template struct Tag {}; + SIMDRegisterUnitTests() : UnitTest ("SIMDRegister UnitTests", UnitTestCategories::dsp) {} @@ -290,7 +264,7 @@ public: struct InitializationTest { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { u.expect (allValuesEqualTo (SIMDRegister::expand (static_cast (23)), 23)); @@ -300,7 +274,7 @@ public: #else type elements[SIMDRegister::SIMDNumElements] __attribute__((aligned(sizeof (SIMDRegister)))); #endif - SIMDRegister_test_internal::VecFiller::fill (elements, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (elements, random); SIMDRegister a (SIMDRegister::fromRawArray (elements)); u.expect (vecEqualToArray (a, elements)); @@ -316,13 +290,13 @@ public: struct AccessTest { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { // set-up SIMDRegister a; type array [SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (array, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array, random); // Test non-const access operator for (size_t i = 0; i < SIMDRegister::SIMDNumElements; ++i) @@ -342,7 +316,7 @@ public: struct OperatorTests { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { for (int n = 0; n < 100; ++n) { @@ -355,9 +329,9 @@ public: type array_b [SIMDRegister::SIMDNumElements]; type array_c [SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_c, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (array_c, random); copy (a, array_a); copy (b, array_b); copy (c, array_c); @@ -370,9 +344,9 @@ public: u.expect (vecEqualToArray (a, array_a)); u.expect (vecEqualToArray (b, array_b)); - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_c, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (array_c, random); copy (a, array_a); copy (b, array_b); copy (c, array_c); @@ -386,9 +360,9 @@ public: u.expect (vecEqualToArray (b, array_b)); // set-up again - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_c, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (array_c, random); copy (a, array_a); copy (b, array_b); copy (c, array_c); // test out-of-place with both params being vectors @@ -418,7 +392,7 @@ public: struct BitOperatorTests { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { typedef typename SIMDRegister::vMaskType vMaskType; typedef typename SIMDRegister::MaskType MaskType; @@ -438,7 +412,7 @@ public: } a, b; vMaskType bitmask = vMaskType::expand (static_cast (1) << (sizeof (MaskType) - 1)); - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); copy (a.floatVersion, array_a); copy (b.floatVersion, array_a); @@ -466,9 +440,9 @@ public: type float_a [SIMDRegister::SIMDNumElements]; type float_c [SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (float_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (float_c, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (float_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (float_c, random); memcpy (array_a, float_a, sizeof (type) * SIMDRegister::SIMDNumElements); memcpy (array_c, float_c, sizeof (type) * SIMDRegister::SIMDNumElements); @@ -484,9 +458,9 @@ public: u.expect (vecEqualToArray (a, float_a)); u.expect (vecEqualToArray (b, array_b)); - SIMDRegister_test_internal::VecFiller::fill (float_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (float_c, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (float_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (float_c, random); memcpy (array_a, float_a, sizeof (type) * SIMDRegister::SIMDNumElements); memcpy (array_c, float_c, sizeof (type) * SIMDRegister::SIMDNumElements); copy (a, float_a); copy (b, array_b); copy (c, float_c); @@ -502,9 +476,9 @@ public: u.expect (vecEqualToArray (b, array_b)); // set-up again - SIMDRegister_test_internal::VecFiller::fill (float_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (float_c, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (float_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (float_c, random); memcpy (array_a, float_a, sizeof (type) * SIMDRegister::SIMDNumElements); memcpy (array_c, float_c, sizeof (type) * SIMDRegister::SIMDNumElements); copy (a, float_a); copy (b, array_b); copy (c, float_c); @@ -542,7 +516,7 @@ public: struct CheckComparisonOps { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { typedef typename SIMDRegister::vMaskType vMaskType; typedef typename SIMDRegister::MaskType MaskType; @@ -560,8 +534,8 @@ public: MaskType array_ge [SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); // do check for (size_t j = 0; j < SIMDRegister::SIMDNumElements; ++j) @@ -598,8 +572,8 @@ public: do { - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); } while (std::equal (array_a, array_a + SIMDRegister::SIMDNumElements, array_b)); copy (a, array_a); @@ -609,7 +583,7 @@ public: u.expect (! (a == b)); u.expect (! (b == a)); - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); copy (a, array_a); copy (b, array_a); @@ -635,7 +609,7 @@ public: struct CheckMultiplyAdd { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { // set-up type array_a [SIMDRegister::SIMDNumElements]; @@ -643,10 +617,10 @@ public: type array_c [SIMDRegister::SIMDNumElements]; type array_d [SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (array_a, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_b, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_c, SIMDRegister::SIMDNumElements, random); - SIMDRegister_test_internal::VecFiller::fill (array_d, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array_a, random); + SIMDRegister_test_internal::fillVec (array_b, random); + SIMDRegister_test_internal::fillVec (array_c, random); + SIMDRegister_test_internal::fillVec (array_d, random); // check for (size_t i = 0; i < SIMDRegister::SIMDNumElements; ++i) @@ -667,7 +641,7 @@ public: struct CheckMinMax { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { for (int i = 0; i < 100; ++i) { @@ -717,17 +691,14 @@ public: struct CheckSum { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { type array [SIMDRegister::SIMDNumElements]; - type sumCheck = 0; - SIMDRegister_test_internal::VecFiller::fill (array, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array, random); - for (size_t j = 0; j < SIMDRegister::SIMDNumElements; ++j) - { - sumCheck += array[j]; - } + using AddedType = decltype (type{} + type{}); + const auto sumCheck = (type) std::accumulate (std::begin (array), std::end (array), AddedType{}); SIMDRegister a; copy (a, array); @@ -739,12 +710,12 @@ public: struct CheckAbs { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { type inArray[SIMDRegister::SIMDNumElements]; type outArray[SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (inArray, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (inArray, random); SIMDRegister a; copy (a, inArray); @@ -762,12 +733,12 @@ public: struct CheckTruncate { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { type inArray[SIMDRegister::SIMDNumElements]; type outArray[SIMDRegister::SIMDNumElements]; - SIMDRegister_test_internal::VecFiller::fill (inArray, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (inArray, random); SIMDRegister a; copy (a, inArray); @@ -783,7 +754,7 @@ public: struct CheckBoolEquals { template - static void run (UnitTest& u, Random& random) + static void run (UnitTest& u, Random& random, Tag) { bool is_signed = std::is_signed::value; type array [SIMDRegister::SIMDNumElements]; @@ -802,14 +773,14 @@ public: u.expect (a != value); u.expect (! (a == value)); - SIMDRegister_test_internal::VecFiller::fill (array, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array, random); copy (a, array); copy (b, array); u.expect (a == b); u.expect (! (a != b)); - SIMDRegister_test_internal::VecFiller::fill (array, SIMDRegister::SIMDNumElements, random); + SIMDRegister_test_internal::fillVec (array, random); copy (b, array); u.expect (a != b); @@ -819,96 +790,96 @@ public: //============================================================================== template - void runTestFloatingPoint (const char* unitTestName) + void runTestFloatingPoint (const char* unitTestName, TheTest) { beginTest (unitTestName); Random random = getRandom(); - TheTest::template run (*this, random); - TheTest::template run (*this, random); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag{}); } //============================================================================== template - void runTestForAllTypes (const char* unitTestName) + void runTestForAllTypes (const char* unitTestName, TheTest) { beginTest (unitTestName); Random random = getRandom(); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run(*this, random); - TheTest::template run (*this, random); - TheTest::template run(*this, random); - TheTest::template run (*this, random); - TheTest::template run(*this, random); - TheTest::template run> (*this, random); - TheTest::template run> (*this, random); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag> {}); + TheTest::run (*this, random, Tag>{}); } template - void runTestNonComplex (const char* unitTestName) + void runTestNonComplex (const char* unitTestName, TheTest) { beginTest (unitTestName); Random random = getRandom(); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run(*this, random); - TheTest::template run (*this, random); - TheTest::template run(*this, random); - TheTest::template run (*this, random); - TheTest::template run(*this, random); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag{}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag{}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag{}); } template - void runTestSigned (const char* unitTestName) + void runTestSigned (const char* unitTestName, TheTest) { beginTest (unitTestName); Random random = getRandom(); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); - TheTest::template run (*this, random); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag {}); + TheTest::run (*this, random, Tag{}); + TheTest::run (*this, random, Tag{}); + TheTest::run (*this, random, Tag{}); } void runTest() { - runTestForAllTypes ("InitializationTest"); + runTestForAllTypes ("InitializationTest", InitializationTest{}); - runTestForAllTypes ("AccessTest"); + runTestForAllTypes ("AccessTest", AccessTest{}); - runTestForAllTypes> ("AdditionOperators"); - runTestForAllTypes> ("SubtractionOperators"); - runTestForAllTypes> ("MultiplicationOperators"); + runTestForAllTypes ("AdditionOperators", OperatorTests{}); + runTestForAllTypes ("SubtractionOperators", OperatorTests{}); + runTestForAllTypes ("MultiplicationOperators", OperatorTests{}); - runTestForAllTypes> ("BitANDOperators"); - runTestForAllTypes> ("BitOROperators"); - runTestForAllTypes> ("BitXOROperators"); + runTestForAllTypes ("BitANDOperators", BitOperatorTests{}); + runTestForAllTypes ("BitOROperators", BitOperatorTests{}); + runTestForAllTypes ("BitXOROperators", BitOperatorTests{}); - runTestNonComplex ("CheckComparisons"); - runTestNonComplex ("CheckBoolEquals"); - runTestNonComplex ("CheckMinMax"); + runTestNonComplex ("CheckComparisons", CheckComparisonOps{}); + runTestNonComplex ("CheckBoolEquals", CheckBoolEquals{}); + runTestNonComplex ("CheckMinMax", CheckMinMax{}); - runTestForAllTypes ("CheckMultiplyAdd"); - runTestForAllTypes ("CheckSum"); + runTestForAllTypes ("CheckMultiplyAdd", CheckMultiplyAdd{}); + runTestForAllTypes ("CheckSum", CheckSum{}); - runTestSigned ("CheckAbs"); + runTestSigned ("CheckAbs", CheckAbs{}); - runTestFloatingPoint ("CheckTruncate"); + runTestFloatingPoint ("CheckTruncate", CheckTruncate{}); } }; diff --git a/modules/juce_dsp/filter_design/juce_FilterDesign.cpp b/modules/juce_dsp/filter_design/juce_FilterDesign.cpp index 826cba0a..efea14d2 100644 --- a/modules/juce_dsp/filter_design/juce_FilterDesign.cpp +++ b/modules/juce_dsp/filter_design/juce_FilterDesign.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/filter_design/juce_FilterDesign.h b/modules/juce_dsp/filter_design/juce_FilterDesign.h index 0d659d24..cd2719aa 100644 --- a/modules/juce_dsp/filter_design/juce_FilterDesign.h +++ b/modules/juce_dsp/filter_design/juce_FilterDesign.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/frequency/juce_Convolution.cpp b/modules/juce_dsp/frequency/juce_Convolution.cpp index 706813e7..dbcaa64c 100644 --- a/modules/juce_dsp/frequency/juce_Convolution.cpp +++ b/modules/juce_dsp/frequency/juce_Convolution.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/frequency/juce_Convolution.h b/modules/juce_dsp/frequency/juce_Convolution.h index 67a10bc7..f9b18a04 100644 --- a/modules/juce_dsp/frequency/juce_Convolution.h +++ b/modules/juce_dsp/frequency/juce_Convolution.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/frequency/juce_Convolution_test.cpp b/modules/juce_dsp/frequency/juce_Convolution_test.cpp index 0cbd97d0..115c2c76 100644 --- a/modules/juce_dsp/frequency/juce_Convolution_test.cpp +++ b/modules/juce_dsp/frequency/juce_Convolution_test.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/frequency/juce_FFT.cpp b/modules/juce_dsp/frequency/juce_FFT.cpp index 862cfcd0..bc383271 100644 --- a/modules/juce_dsp/frequency/juce_FFT.cpp +++ b/modules/juce_dsp/frequency/juce_FFT.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/frequency/juce_FFT.h b/modules/juce_dsp/frequency/juce_FFT.h index 59432522..b0e03406 100644 --- a/modules/juce_dsp/frequency/juce_FFT.h +++ b/modules/juce_dsp/frequency/juce_FFT.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/frequency/juce_FFT_test.cpp b/modules/juce_dsp/frequency/juce_FFT_test.cpp index 7242e078..4e3e999e 100644 --- a/modules/juce_dsp/frequency/juce_FFT_test.cpp +++ b/modules/juce_dsp/frequency/juce_FFT_test.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/frequency/juce_Windowing.cpp b/modules/juce_dsp/frequency/juce_Windowing.cpp index 13097817..3a12366a 100644 --- a/modules/juce_dsp/frequency/juce_Windowing.cpp +++ b/modules/juce_dsp/frequency/juce_Windowing.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/frequency/juce_Windowing.h b/modules/juce_dsp/frequency/juce_Windowing.h index 2aca0ad2..1b18cf08 100644 --- a/modules/juce_dsp/frequency/juce_Windowing.h +++ b/modules/juce_dsp/frequency/juce_Windowing.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/juce_dsp.cpp b/modules/juce_dsp/juce_dsp.cpp index fdf1df31..40dd665f 100644 --- a/modules/juce_dsp/juce_dsp.cpp +++ b/modules/juce_dsp/juce_dsp.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/juce_dsp.h b/modules/juce_dsp/juce_dsp.h index 2c7a3748..8f2d4b44 100644 --- a/modules/juce_dsp/juce_dsp.h +++ b/modules/juce_dsp/juce_dsp.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_dsp vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE DSP classes description: Classes for audio buffer manipulation, digital audio processing, filtering, oversampling, fast math functions etc. website: http://www.juce.com/juce @@ -93,7 +93,7 @@ #ifndef JUCE_VECTOR_CALLTYPE // __vectorcall does not work on 64-bit due to internal compiler error in - // release mode in both VS2015 and VS2017. Re-enable when Microsoft fixes this + // release mode VS2017. Re-enable when Microsoft fixes this #if _MSC_VER && JUCE_USE_SIMD && ! (defined(_M_X64) || defined(__amd64__)) #define JUCE_VECTOR_CALLTYPE __vectorcall #else diff --git a/modules/juce_dsp/juce_dsp.mm b/modules/juce_dsp/juce_dsp.mm index 9dc9631b..85baaba5 100644 --- a/modules/juce_dsp/juce_dsp.mm +++ b/modules/juce_dsp/juce_dsp.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/maths/juce_FastMathApproximations.h b/modules/juce_dsp/maths/juce_FastMathApproximations.h index 818f6083..03882441 100644 --- a/modules/juce_dsp/maths/juce_FastMathApproximations.h +++ b/modules/juce_dsp/maths/juce_FastMathApproximations.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/maths/juce_LogRampedValue.h b/modules/juce_dsp/maths/juce_LogRampedValue.h index 7af97758..998e2494 100644 --- a/modules/juce_dsp/maths/juce_LogRampedValue.h +++ b/modules/juce_dsp/maths/juce_LogRampedValue.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/maths/juce_LogRampedValue_test.cpp b/modules/juce_dsp/maths/juce_LogRampedValue_test.cpp index a462f459..4c729c36 100644 --- a/modules/juce_dsp/maths/juce_LogRampedValue_test.cpp +++ b/modules/juce_dsp/maths/juce_LogRampedValue_test.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/maths/juce_LookupTable.cpp b/modules/juce_dsp/maths/juce_LookupTable.cpp index cbd89b10..5e8f729c 100644 --- a/modules/juce_dsp/maths/juce_LookupTable.cpp +++ b/modules/juce_dsp/maths/juce_LookupTable.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/maths/juce_LookupTable.h b/modules/juce_dsp/maths/juce_LookupTable.h index 5ef84e20..77987cb6 100644 --- a/modules/juce_dsp/maths/juce_LookupTable.h +++ b/modules/juce_dsp/maths/juce_LookupTable.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/maths/juce_Matrix.cpp b/modules/juce_dsp/maths/juce_Matrix.cpp index 84a51a18..56c460cd 100644 --- a/modules/juce_dsp/maths/juce_Matrix.cpp +++ b/modules/juce_dsp/maths/juce_Matrix.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/maths/juce_Matrix.h b/modules/juce_dsp/maths/juce_Matrix.h index 1c21f6fd..c3345cf4 100644 --- a/modules/juce_dsp/maths/juce_Matrix.h +++ b/modules/juce_dsp/maths/juce_Matrix.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/maths/juce_Matrix_test.cpp b/modules/juce_dsp/maths/juce_Matrix_test.cpp index 4a15a71a..18aaeb0d 100644 --- a/modules/juce_dsp/maths/juce_Matrix_test.cpp +++ b/modules/juce_dsp/maths/juce_Matrix_test.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/maths/juce_Phase.h b/modules/juce_dsp/maths/juce_Phase.h index 4d593632..7cf296cc 100644 --- a/modules/juce_dsp/maths/juce_Phase.h +++ b/modules/juce_dsp/maths/juce_Phase.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/maths/juce_Polynomial.h b/modules/juce_dsp/maths/juce_Polynomial.h index e9ad836b..77487bb5 100644 --- a/modules/juce_dsp/maths/juce_Polynomial.h +++ b/modules/juce_dsp/maths/juce_Polynomial.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/maths/juce_SpecialFunctions.cpp b/modules/juce_dsp/maths/juce_SpecialFunctions.cpp index 5373bf52..36a97920 100644 --- a/modules/juce_dsp/maths/juce_SpecialFunctions.cpp +++ b/modules/juce_dsp/maths/juce_SpecialFunctions.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/maths/juce_SpecialFunctions.h b/modules/juce_dsp/maths/juce_SpecialFunctions.h index 7ed4e916..d9a57639 100644 --- a/modules/juce_dsp/maths/juce_SpecialFunctions.h +++ b/modules/juce_dsp/maths/juce_SpecialFunctions.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp b/modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp index 2f87732c..4daf7ad3 100644 --- a/modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp +++ b/modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/native/juce_avx_SIMDNativeOps.h b/modules/juce_dsp/native/juce_avx_SIMDNativeOps.h index e51a4d81..70ac3474 100644 --- a/modules/juce_dsp/native/juce_avx_SIMDNativeOps.h +++ b/modules/juce_dsp/native/juce_avx_SIMDNativeOps.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h b/modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h index 888354a7..2e0c72b9 100644 --- a/modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h +++ b/modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp b/modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp index 1219ed88..1391e6ec 100644 --- a/modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp +++ b/modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/native/juce_neon_SIMDNativeOps.h b/modules/juce_dsp/native/juce_neon_SIMDNativeOps.h index 09188925..f9cca4d5 100644 --- a/modules/juce_dsp/native/juce_neon_SIMDNativeOps.h +++ b/modules/juce_dsp/native/juce_neon_SIMDNativeOps.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp b/modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp index 1aade96f..411d4722 100644 --- a/modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp +++ b/modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/native/juce_sse_SIMDNativeOps.h b/modules/juce_dsp/native/juce_sse_SIMDNativeOps.h index 7f64d433..c9b4e96f 100644 --- a/modules/juce_dsp/native/juce_sse_SIMDNativeOps.h +++ b/modules/juce_dsp/native/juce_sse_SIMDNativeOps.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -106,11 +106,13 @@ struct SIMDNativeOps static forcedinline float JUCE_VECTOR_CALLTYPE sum (__m128 a) noexcept { #if defined(__SSE4__) - __m128 retval = _mm_dp_ps (a, _mm_loadu_ps (kOne), 0xff); + const auto retval = _mm_dp_ps (a, _mm_loadu_ps (kOne), 0xff); #elif defined(__SSE3__) - __m128 retval = _mm_hadd_ps (_mm_hadd_ps (a, a), a); + const auto shuffled = _mm_movehdup_ps (a); + const auto sums = _mm_add_ps (a, shuffled); + const auto retval = _mm_add_ss (sums, _mm_movehl_ps (shuffled, sums)); #else - __m128 retval = _mm_add_ps (_mm_shuffle_ps (a, a, 0x4e), a); + auto retval = _mm_add_ps (_mm_shuffle_ps (a, a, 0x4e), a); retval = _mm_add_ps (retval, _mm_shuffle_ps (retval, retval, 0xb1)); #endif return _mm_cvtss_f32 (retval); diff --git a/modules/juce_dsp/processors/juce_BallisticsFilter.cpp b/modules/juce_dsp/processors/juce_BallisticsFilter.cpp index e9fcf5ee..c999a764 100644 --- a/modules/juce_dsp/processors/juce_BallisticsFilter.cpp +++ b/modules/juce_dsp/processors/juce_BallisticsFilter.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_BallisticsFilter.h b/modules/juce_dsp/processors/juce_BallisticsFilter.h index 99eb3e60..e1a79575 100644 --- a/modules/juce_dsp/processors/juce_BallisticsFilter.h +++ b/modules/juce_dsp/processors/juce_BallisticsFilter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_DelayLine.cpp b/modules/juce_dsp/processors/juce_DelayLine.cpp index 8727230d..3ea3edbc 100644 --- a/modules/juce_dsp/processors/juce_DelayLine.cpp +++ b/modules/juce_dsp/processors/juce_DelayLine.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_DelayLine.h b/modules/juce_dsp/processors/juce_DelayLine.h index eb0df167..a32295f0 100644 --- a/modules/juce_dsp/processors/juce_DelayLine.h +++ b/modules/juce_dsp/processors/juce_DelayLine.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_DryWetMixer.cpp b/modules/juce_dsp/processors/juce_DryWetMixer.cpp index a6f7c964..03a68a76 100644 --- a/modules/juce_dsp/processors/juce_DryWetMixer.cpp +++ b/modules/juce_dsp/processors/juce_DryWetMixer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_DryWetMixer.h b/modules/juce_dsp/processors/juce_DryWetMixer.h index ec760abc..6023f7c1 100644 --- a/modules/juce_dsp/processors/juce_DryWetMixer.h +++ b/modules/juce_dsp/processors/juce_DryWetMixer.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_FIRFilter.cpp b/modules/juce_dsp/processors/juce_FIRFilter.cpp index 7dc91f91..4ebff528 100644 --- a/modules/juce_dsp/processors/juce_FIRFilter.cpp +++ b/modules/juce_dsp/processors/juce_FIRFilter.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_FIRFilter.h b/modules/juce_dsp/processors/juce_FIRFilter.h index 63f21a6c..560fdc2c 100644 --- a/modules/juce_dsp/processors/juce_FIRFilter.h +++ b/modules/juce_dsp/processors/juce_FIRFilter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_FIRFilter_test.cpp b/modules/juce_dsp/processors/juce_FIRFilter_test.cpp index f139525b..466ed942 100644 --- a/modules/juce_dsp/processors/juce_FIRFilter_test.cpp +++ b/modules/juce_dsp/processors/juce_FIRFilter_test.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp b/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp index 6dae81d2..2b145dd5 100644 --- a/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp +++ b/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h b/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h index 5453a119..7e24fd8b 100644 --- a/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h +++ b/modules/juce_dsp/processors/juce_FirstOrderTPTFilter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_IIRFilter.cpp b/modules/juce_dsp/processors/juce_IIRFilter.cpp index 0183300e..69f99417 100644 --- a/modules/juce_dsp/processors/juce_IIRFilter.cpp +++ b/modules/juce_dsp/processors/juce_IIRFilter.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_IIRFilter.h b/modules/juce_dsp/processors/juce_IIRFilter.h index e8fccda8..48d54c48 100644 --- a/modules/juce_dsp/processors/juce_IIRFilter.h +++ b/modules/juce_dsp/processors/juce_IIRFilter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_IIRFilter_Impl.h b/modules/juce_dsp/processors/juce_IIRFilter_Impl.h index 604d2669..9644f4dc 100644 --- a/modules/juce_dsp/processors/juce_IIRFilter_Impl.h +++ b/modules/juce_dsp/processors/juce_IIRFilter_Impl.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp b/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp index 716cabf1..8d41ca44 100644 --- a/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp +++ b/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h b/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h index 405e131a..4661762b 100644 --- a/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h +++ b/modules/juce_dsp/processors/juce_LinkwitzRileyFilter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_Oversampling.cpp b/modules/juce_dsp/processors/juce_Oversampling.cpp index e43333cb..f79c4328 100644 --- a/modules/juce_dsp/processors/juce_Oversampling.cpp +++ b/modules/juce_dsp/processors/juce_Oversampling.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_Oversampling.h b/modules/juce_dsp/processors/juce_Oversampling.h index 12fd03a6..95ffd987 100644 --- a/modules/juce_dsp/processors/juce_Oversampling.h +++ b/modules/juce_dsp/processors/juce_Oversampling.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_Panner.cpp b/modules/juce_dsp/processors/juce_Panner.cpp index 64721048..879cb519 100644 --- a/modules/juce_dsp/processors/juce_Panner.cpp +++ b/modules/juce_dsp/processors/juce_Panner.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_Panner.h b/modules/juce_dsp/processors/juce_Panner.h index a133ac98..46bd7e2c 100644 --- a/modules/juce_dsp/processors/juce_Panner.h +++ b/modules/juce_dsp/processors/juce_Panner.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_ProcessContext.h b/modules/juce_dsp/processors/juce_ProcessContext.h index 1a00fcff..983dd536 100644 --- a/modules/juce_dsp/processors/juce_ProcessContext.h +++ b/modules/juce_dsp/processors/juce_ProcessContext.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_ProcessorChain.h b/modules/juce_dsp/processors/juce_ProcessorChain.h index b8808cdd..3b0cdfe4 100644 --- a/modules/juce_dsp/processors/juce_ProcessorChain.h +++ b/modules/juce_dsp/processors/juce_ProcessorChain.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_ProcessorChain_test.cpp b/modules/juce_dsp/processors/juce_ProcessorChain_test.cpp index 0ce1ea00..c8205810 100644 --- a/modules/juce_dsp/processors/juce_ProcessorChain_test.cpp +++ b/modules/juce_dsp/processors/juce_ProcessorChain_test.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_ProcessorDuplicator.h b/modules/juce_dsp/processors/juce_ProcessorDuplicator.h index d15b151c..dbc92419 100644 --- a/modules/juce_dsp/processors/juce_ProcessorDuplicator.h +++ b/modules/juce_dsp/processors/juce_ProcessorDuplicator.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_ProcessorWrapper.h b/modules/juce_dsp/processors/juce_ProcessorWrapper.h index e4c35e57..3ebe2a0c 100644 --- a/modules/juce_dsp/processors/juce_ProcessorWrapper.h +++ b/modules/juce_dsp/processors/juce_ProcessorWrapper.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_StateVariableFilter.h b/modules/juce_dsp/processors/juce_StateVariableFilter.h index bf1645e1..9a991608 100644 --- a/modules/juce_dsp/processors/juce_StateVariableFilter.h +++ b/modules/juce_dsp/processors/juce_StateVariableFilter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp b/modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp index 3469694b..aa85ff48 100644 --- a/modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp +++ b/modules/juce_dsp/processors/juce_StateVariableTPTFilter.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/processors/juce_StateVariableTPTFilter.h b/modules/juce_dsp/processors/juce_StateVariableTPTFilter.h index 82ef4379..9137f079 100644 --- a/modules/juce_dsp/processors/juce_StateVariableTPTFilter.h +++ b/modules/juce_dsp/processors/juce_StateVariableTPTFilter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_Bias.h b/modules/juce_dsp/widgets/juce_Bias.h index 3e42b14c..cc255dad 100644 --- a/modules/juce_dsp/widgets/juce_Bias.h +++ b/modules/juce_dsp/widgets/juce_Bias.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_Chorus.cpp b/modules/juce_dsp/widgets/juce_Chorus.cpp index 5be5d823..7976fc8d 100644 --- a/modules/juce_dsp/widgets/juce_Chorus.cpp +++ b/modules/juce_dsp/widgets/juce_Chorus.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_Chorus.h b/modules/juce_dsp/widgets/juce_Chorus.h index f1d93297..01395061 100644 --- a/modules/juce_dsp/widgets/juce_Chorus.h +++ b/modules/juce_dsp/widgets/juce_Chorus.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_Compressor.cpp b/modules/juce_dsp/widgets/juce_Compressor.cpp index 40564232..e2a73f78 100644 --- a/modules/juce_dsp/widgets/juce_Compressor.cpp +++ b/modules/juce_dsp/widgets/juce_Compressor.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_Compressor.h b/modules/juce_dsp/widgets/juce_Compressor.h index b9df60df..f05b9a23 100644 --- a/modules/juce_dsp/widgets/juce_Compressor.h +++ b/modules/juce_dsp/widgets/juce_Compressor.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_Gain.h b/modules/juce_dsp/widgets/juce_Gain.h index f8adfaab..c43c240f 100644 --- a/modules/juce_dsp/widgets/juce_Gain.h +++ b/modules/juce_dsp/widgets/juce_Gain.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_LadderFilter.cpp b/modules/juce_dsp/widgets/juce_LadderFilter.cpp index c6fc8143..6a2ad9dc 100644 --- a/modules/juce_dsp/widgets/juce_LadderFilter.cpp +++ b/modules/juce_dsp/widgets/juce_LadderFilter.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_LadderFilter.h b/modules/juce_dsp/widgets/juce_LadderFilter.h index d1b21122..e2f7b58f 100644 --- a/modules/juce_dsp/widgets/juce_LadderFilter.h +++ b/modules/juce_dsp/widgets/juce_LadderFilter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_Limiter.cpp b/modules/juce_dsp/widgets/juce_Limiter.cpp index 6c41ded4..7a48ef63 100644 --- a/modules/juce_dsp/widgets/juce_Limiter.cpp +++ b/modules/juce_dsp/widgets/juce_Limiter.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_Limiter.h b/modules/juce_dsp/widgets/juce_Limiter.h index b951ffdb..e61c1797 100644 --- a/modules/juce_dsp/widgets/juce_Limiter.h +++ b/modules/juce_dsp/widgets/juce_Limiter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_NoiseGate.cpp b/modules/juce_dsp/widgets/juce_NoiseGate.cpp index af914bfa..840ee3b5 100644 --- a/modules/juce_dsp/widgets/juce_NoiseGate.cpp +++ b/modules/juce_dsp/widgets/juce_NoiseGate.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_NoiseGate.h b/modules/juce_dsp/widgets/juce_NoiseGate.h index 4975e734..58de30a6 100644 --- a/modules/juce_dsp/widgets/juce_NoiseGate.h +++ b/modules/juce_dsp/widgets/juce_NoiseGate.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_Oscillator.h b/modules/juce_dsp/widgets/juce_Oscillator.h index 1976da1f..92582707 100644 --- a/modules/juce_dsp/widgets/juce_Oscillator.h +++ b/modules/juce_dsp/widgets/juce_Oscillator.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_Phaser.cpp b/modules/juce_dsp/widgets/juce_Phaser.cpp index 804d34fd..50b17d5f 100644 --- a/modules/juce_dsp/widgets/juce_Phaser.cpp +++ b/modules/juce_dsp/widgets/juce_Phaser.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_Phaser.h b/modules/juce_dsp/widgets/juce_Phaser.h index a1745ccf..2a130274 100644 --- a/modules/juce_dsp/widgets/juce_Phaser.h +++ b/modules/juce_dsp/widgets/juce_Phaser.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_Reverb.h b/modules/juce_dsp/widgets/juce_Reverb.h index 83034321..677df27a 100644 --- a/modules/juce_dsp/widgets/juce_Reverb.h +++ b/modules/juce_dsp/widgets/juce_Reverb.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_dsp/widgets/juce_WaveShaper.h b/modules/juce_dsp/widgets/juce_WaveShaper.h index ca71a816..30dfdb3b 100644 --- a/modules/juce_dsp/widgets/juce_WaveShaper.h +++ b/modules/juce_dsp/widgets/juce_WaveShaper.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -71,7 +71,7 @@ struct WaveShaper }; //============================================================================== -#if JUCE_CXX17_IS_AVAILABLE +#if JUCE_CXX17_IS_AVAILABLE && ! ((JUCE_MAC || JUCE_IOS) && JUCE_CLANG && __clang_major__ < 10) template static WaveShaper, Functor> CreateWaveShaper (Functor functionToUse) { return {functionToUse}; } #else diff --git a/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp b/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp index 91885ed1..d21c9890 100644 --- a/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp +++ b/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/broadcasters/juce_ActionBroadcaster.h b/modules/juce_events/broadcasters/juce_ActionBroadcaster.h index 0f5479d1..e46a46fb 100644 --- a/modules/juce_events/broadcasters/juce_ActionBroadcaster.h +++ b/modules/juce_events/broadcasters/juce_ActionBroadcaster.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/broadcasters/juce_ActionListener.h b/modules/juce_events/broadcasters/juce_ActionListener.h index 64f34879..cea470b4 100644 --- a/modules/juce_events/broadcasters/juce_ActionListener.h +++ b/modules/juce_events/broadcasters/juce_ActionListener.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp b/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp index 2daa2b92..aff0a276 100644 --- a/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp +++ b/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/broadcasters/juce_AsyncUpdater.h b/modules/juce_events/broadcasters/juce_AsyncUpdater.h index 094a9c14..8bc51f27 100644 --- a/modules/juce_events/broadcasters/juce_AsyncUpdater.h +++ b/modules/juce_events/broadcasters/juce_AsyncUpdater.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp b/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp index cccb955a..a92e88ce 100644 --- a/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp +++ b/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h b/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h index 9e8b03ca..e2c5de73 100644 --- a/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h +++ b/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/broadcasters/juce_ChangeListener.h b/modules/juce_events/broadcasters/juce_ChangeListener.h index 668f3e86..b4203741 100644 --- a/modules/juce_events/broadcasters/juce_ChangeListener.h +++ b/modules/juce_events/broadcasters/juce_ChangeListener.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp b/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp index 3623c064..d7e4b00a 100644 --- a/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp +++ b/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -61,6 +61,8 @@ struct ChildProcessPingThread : public Thread, int timeoutMs; + using AsyncUpdater::cancelPendingUpdate; + private: Atomic countdown; @@ -97,6 +99,7 @@ struct ChildProcessCoordinator::Connection : public InterprocessConnection, ~Connection() override { + cancelPendingUpdate(); stopThread (10000); } @@ -169,6 +172,7 @@ bool ChildProcessCoordinator::launchWorkerProcess (const File& executable, const if (connection->isConnected()) { + connection->startPinging(); sendMessageToWorker ({ startMessage, specialMessageSize }); return true; } @@ -205,6 +209,7 @@ struct ChildProcessWorker::Connection : public InterprocessConnection, ~Connection() override { + cancelPendingUpdate(); stopThread (10000); disconnect(); } diff --git a/modules/juce_events/interprocess/juce_ConnectedChildProcess.h b/modules/juce_events/interprocess/juce_ConnectedChildProcess.h index 87c4611f..bf803483 100644 --- a/modules/juce_events/interprocess/juce_ConnectedChildProcess.h +++ b/modules/juce_events/interprocess/juce_ConnectedChildProcess.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/interprocess/juce_InterprocessConnection.cpp b/modules/juce_events/interprocess/juce_InterprocessConnection.cpp index aabd6314..2b8d55bf 100644 --- a/modules/juce_events/interprocess/juce_InterprocessConnection.cpp +++ b/modules/juce_events/interprocess/juce_InterprocessConnection.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/interprocess/juce_InterprocessConnection.h b/modules/juce_events/interprocess/juce_InterprocessConnection.h index 9f06adb2..ab0fda4c 100644 --- a/modules/juce_events/interprocess/juce_InterprocessConnection.h +++ b/modules/juce_events/interprocess/juce_InterprocessConnection.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp b/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp index cf79303a..964f0d55 100644 --- a/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp +++ b/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h b/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h index 3764d606..209d5a1d 100644 --- a/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h +++ b/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp b/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp index c02d0ce7..f1b006d6 100644 --- a/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp +++ b/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h b/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h index 227e78ca..fc0090a6 100644 --- a/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h +++ b/modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/juce_events.cpp b/modules/juce_events/juce_events.cpp index f604f903..c6678d5d 100644 --- a/modules/juce_events/juce_events.cpp +++ b/modules/juce_events/juce_events.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -87,6 +87,7 @@ #endif #elif JUCE_LINUX || JUCE_BSD + #include "native/juce_linux_EventLoopInternal.h" #include "native/juce_linux_Messaging.cpp" #elif JUCE_ANDROID diff --git a/modules/juce_events/juce_events.h b/modules/juce_events/juce_events.h index 12594a06..daf29ee6 100644 --- a/modules/juce_events/juce_events.h +++ b/modules/juce_events/juce_events.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -32,7 +32,7 @@ ID: juce_events vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE message and event handling classes description: Classes for running an application's main event loop and sending/receiving messages, timers, etc. website: http://www.juce.com/juce diff --git a/modules/juce_events/juce_events.mm b/modules/juce_events/juce_events.mm index 0c6396ee..122c0de9 100644 --- a/modules/juce_events/juce_events.mm +++ b/modules/juce_events/juce_events.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/messages/juce_ApplicationBase.cpp b/modules/juce_events/messages/juce_ApplicationBase.cpp index 6e6bc09c..2ca5dfef 100644 --- a/modules/juce_events/messages/juce_ApplicationBase.cpp +++ b/modules/juce_events/messages/juce_ApplicationBase.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/messages/juce_ApplicationBase.h b/modules/juce_events/messages/juce_ApplicationBase.h index efb639d2..54bb1a79 100644 --- a/modules/juce_events/messages/juce_ApplicationBase.h +++ b/modules/juce_events/messages/juce_ApplicationBase.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/messages/juce_CallbackMessage.h b/modules/juce_events/messages/juce_CallbackMessage.h index 1863b8d0..40d0013b 100644 --- a/modules/juce_events/messages/juce_CallbackMessage.h +++ b/modules/juce_events/messages/juce_CallbackMessage.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/messages/juce_DeletedAtShutdown.cpp b/modules/juce_events/messages/juce_DeletedAtShutdown.cpp index 888a1e10..4eff17df 100644 --- a/modules/juce_events/messages/juce_DeletedAtShutdown.cpp +++ b/modules/juce_events/messages/juce_DeletedAtShutdown.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/messages/juce_DeletedAtShutdown.h b/modules/juce_events/messages/juce_DeletedAtShutdown.h index 5203df7a..afba89fb 100644 --- a/modules/juce_events/messages/juce_DeletedAtShutdown.h +++ b/modules/juce_events/messages/juce_DeletedAtShutdown.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/messages/juce_Initialisation.h b/modules/juce_events/messages/juce_Initialisation.h index 0ddd0508..df016041 100644 --- a/modules/juce_events/messages/juce_Initialisation.h +++ b/modules/juce_events/messages/juce_Initialisation.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/messages/juce_Message.h b/modules/juce_events/messages/juce_Message.h index 1aca7bf3..e3f702f6 100644 --- a/modules/juce_events/messages/juce_Message.h +++ b/modules/juce_events/messages/juce_Message.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/messages/juce_MessageListener.cpp b/modules/juce_events/messages/juce_MessageListener.cpp index 1f58c916..d33d3229 100644 --- a/modules/juce_events/messages/juce_MessageListener.cpp +++ b/modules/juce_events/messages/juce_MessageListener.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/messages/juce_MessageListener.h b/modules/juce_events/messages/juce_MessageListener.h index 13652f40..272858ef 100644 --- a/modules/juce_events/messages/juce_MessageListener.h +++ b/modules/juce_events/messages/juce_MessageListener.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/messages/juce_MessageManager.cpp b/modules/juce_events/messages/juce_MessageManager.cpp index e137ad5d..153ac624 100644 --- a/modules/juce_events/messages/juce_MessageManager.cpp +++ b/modules/juce_events/messages/juce_MessageManager.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -26,6 +26,8 @@ namespace juce MessageManager::MessageManager() noexcept : messageThreadId (Thread::getCurrentThreadId()) { + JUCE_VERSION_ID + if (JUCEApplicationBase::isStandaloneApp()) Thread::setCurrentThreadName ("JUCE Message Thread"); } diff --git a/modules/juce_events/messages/juce_MessageManager.h b/modules/juce_events/messages/juce_MessageManager.h index 1d8bd60d..9a5c26e6 100644 --- a/modules/juce_events/messages/juce_MessageManager.h +++ b/modules/juce_events/messages/juce_MessageManager.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h b/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h index 0c32696b..e6751aa8 100644 --- a/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h +++ b/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/messages/juce_NotificationType.h b/modules/juce_events/messages/juce_NotificationType.h index 7af5bb94..c30e5aba 100644 --- a/modules/juce_events/messages/juce_NotificationType.h +++ b/modules/juce_events/messages/juce_NotificationType.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp b/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp index 1324fc9a..15bc6a00 100644 --- a/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp +++ b/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -28,12 +28,21 @@ namespace juce class ScopedLowPowerModeDisabler::Pimpl { public: - Pimpl() = default; - ~Pimpl() { [[NSProcessInfo processInfo] endActivity: activity]; } + Pimpl() + { + if (@available (macOS 10.9, *)) + activity = [[NSProcessInfo processInfo] beginActivityWithOptions: NSActivityUserInitiatedAllowingIdleSystemSleep + reason: @"App must remain in high-power mode"]; + } + + ~Pimpl() + { + if (@available (macOS 10.9, *)) + [[NSProcessInfo processInfo] endActivity: activity]; + } private: - id activity { [[NSProcessInfo processInfo] beginActivityWithOptions: NSActivityUserInitiatedAllowingIdleSystemSleep - reason: @"App must remain in high-power mode"] }; + id activity; JUCE_DECLARE_NON_COPYABLE (Pimpl) JUCE_DECLARE_NON_MOVEABLE (Pimpl) diff --git a/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h b/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h index 3d559e14..37027dff 100644 --- a/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h +++ b/modules/juce_events/native/juce_ScopedLowPowerModeDisabler.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/native/juce_android_Messaging.cpp b/modules/juce_events/native/juce_android_Messaging.cpp index 20f5f50c..7cf749f9 100644 --- a/modules/juce_events/native/juce_android_Messaging.cpp +++ b/modules/juce_events/native/juce_android_Messaging.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -288,6 +288,7 @@ private: //============================================================================== File juce_getExecutableFile(); +void juce_juceEventsAndroidStartApp(); void juce_juceEventsAndroidStartApp() { auto dllPath = juce_getExecutableFile().getFullPathName(); diff --git a/modules/juce_events/native/juce_ios_MessageManager.mm b/modules/juce_events/native/juce_ios_MessageManager.mm index dd2fb8e4..68ea66a8 100644 --- a/modules/juce_events/native/juce_ios_MessageManager.mm +++ b/modules/juce_events/native/juce_ios_MessageManager.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/native/juce_linux_EventLoop.h b/modules/juce_events/native/juce_linux_EventLoop.h index e2be5da5..3032d20f 100644 --- a/modules/juce_events/native/juce_linux_EventLoop.h +++ b/modules/juce_events/native/juce_linux_EventLoop.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/native/juce_linux_EventLoopInternal.h b/modules/juce_events/native/juce_linux_EventLoopInternal.h new file mode 100644 index 00000000..81ab3a31 --- /dev/null +++ b/modules/juce_events/native/juce_linux_EventLoopInternal.h @@ -0,0 +1,55 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +struct LinuxEventLoopInternal +{ + /** + @internal + + Receives notifications when a fd callback is added or removed. + + This is useful for VST3 plugins that host other VST3 plugins. In this scenario, the 'inner' + plugin may want to register additional file descriptors on top of those registered by the + 'outer' plugin. In order for this to work, the outer plugin must in turn pass this request + on to the host, to indicate that the outer plugin wants to receive FD callbacks for both the + inner and outer plugin. + */ + struct Listener + { + virtual ~Listener() = default; + virtual void fdCallbacksChanged() = 0; + }; + + /** @internal */ + static void registerLinuxEventLoopListener (Listener&); + /** @internal */ + static void deregisterLinuxEventLoopListener (Listener&); + /** @internal */ + static void invokeEventLoopCallbackForFd (int); + /** @internal */ + static std::vector getRegisteredFds(); +}; + +} // namespace juce diff --git a/modules/juce_events/native/juce_linux_Messaging.cpp b/modules/juce_events/native/juce_linux_Messaging.cpp index 42de52f5..dcf58334 100644 --- a/modules/juce_events/native/juce_linux_Messaging.cpp +++ b/modules/juce_events/native/juce_linux_Messaging.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -108,125 +108,168 @@ private: JUCE_IMPLEMENT_SINGLETON (InternalMessageQueue) //============================================================================== +/* + Stores callbacks associated with file descriptors (FD). + + The callback for a particular FD should be called whenever that file has data to read. + + For standalone apps, the main thread will call poll to wait for new data on any FD, and then + call the associated callbacks for any FDs that changed. + + For plugins, the host (generally) provides some kind of run loop mechanism instead. + - In VST2 plugins, the host should call effEditIdle at regular intervals, and plugins can + dispatch all pending events inside this callback. The host doesn't know about any of the + plugin's FDs, so it's possible there will be a bit of latency between an FD becoming ready, + and its associated callback being called. + - In VST3 plugins, it's possible to register each FD individually with the host. In this case, + the facilities in LinuxEventLoopInternal can be used to observe added/removed FD callbacks, + and the host can be notified whenever the set of FDs changes. The host will call onFDIsSet + whenever a particular FD has data ready. This call should be forwarded through to + InternalRunLoop::dispatchEvent. +*/ struct InternalRunLoop { public: - InternalRunLoop() - { - fdReadCallbacks.reserve (16); - } + InternalRunLoop() = default; - void registerFdCallback (int fd, std::function&& cb, short eventMask) + void registerFdCallback (int fd, std::function&& cb, short eventMask) { - const ScopedLock sl (lock); - - if (shouldDeferModifyingReadCallbacks) { - deferredReadCallbackModifications.emplace_back ([this, fd, cb, eventMask]() mutable - { - registerFdCallback (fd, std::move (cb), eventMask); - }); - return; + const ScopedLock sl (lock); + + callbacks.emplace (fd, std::make_shared> (std::move (cb))); + + const auto iter = getPollfd (fd); + + if (iter == pfds.end() || iter->fd != fd) + pfds.insert (iter, { fd, eventMask, 0 }); + else + jassertfalse; + + jassert (pfdsAreSorted()); } - fdReadCallbacks.push_back ({ fd, std::move (cb) }); - pfds.push_back ({ fd, eventMask, 0 }); + listeners.call ([] (auto& l) { l.fdCallbacksChanged(); }); } void unregisterFdCallback (int fd) { - const ScopedLock sl (lock); - - if (shouldDeferModifyingReadCallbacks) { - deferredReadCallbackModifications.emplace_back ([this, fd] { unregisterFdCallback (fd); }); - return; - } + const ScopedLock sl (lock); - { - auto removePredicate = [=] (const std::pair>& cb) { return cb.first == fd; }; + callbacks.erase (fd); - fdReadCallbacks.erase (std::remove_if (std::begin (fdReadCallbacks), std::end (fdReadCallbacks), removePredicate), - std::end (fdReadCallbacks)); - } + const auto iter = getPollfd (fd); - { - auto removePredicate = [=] (const pollfd& pfd) { return pfd.fd == fd; }; + if (iter != pfds.end() && iter->fd == fd) + pfds.erase (iter); + else + jassertfalse; - pfds.erase (std::remove_if (std::begin (pfds), std::end (pfds), removePredicate), - std::end (pfds)); + jassert (pfdsAreSorted()); } + + listeners.call ([] (auto& l) { l.fdCallbacksChanged(); }); } bool dispatchPendingEvents() { - const ScopedLock sl (lock); + callbackStorage.clear(); + getFunctionsToCallThisTime (callbackStorage); - if (poll (&pfds.front(), static_cast (pfds.size()), 0) == 0) - return false; + // CriticalSection should be available during the callback + for (auto& fn : callbackStorage) + (*fn)(); - bool eventWasSent = false; + return ! callbackStorage.empty(); + } - for (auto& pfd : pfds) + void dispatchEvent (int fd) const + { + const auto fn = [&] { - if (pfd.revents == 0) - continue; + const ScopedLock sl (lock); + const auto iter = callbacks.find (fd); + return iter != callbacks.end() ? iter->second : nullptr; + }(); + + // CriticalSection should be available during the callback + if (auto* callback = fn.get()) + (*callback)(); + } + + bool sleepUntilNextEvent (int timeoutMs) + { + const ScopedLock sl (lock); + return poll (pfds.data(), static_cast (pfds.size()), timeoutMs) != 0; + } + + std::vector getRegisteredFds() + { + const ScopedLock sl (lock); + std::vector result; + result.reserve (callbacks.size()); + std::transform (callbacks.begin(), + callbacks.end(), + std::back_inserter (result), + [] (const auto& pair) { return pair.first; }); + return result; + } + + void addListener (LinuxEventLoopInternal::Listener& listener) { listeners.add (&listener); } + void removeListener (LinuxEventLoopInternal::Listener& listener) { listeners.remove (&listener); } - pfd.revents = 0; + //============================================================================== + JUCE_DECLARE_SINGLETON (InternalRunLoop, false) + +private: + using SharedCallback = std::shared_ptr>; + + /* Appends any functions that need to be called to the passed-in vector. - auto fd = pfd.fd; + We take a copy of each shared function so that the functions can be called without + locking or racing in the event that the function attempts to register/deregister a + new FD callback. + */ + void getFunctionsToCallThisTime (std::vector& functions) + { + const ScopedLock sl (lock); + + if (! sleepUntilNextEvent (0)) + return; - for (auto& fdAndCallback : fdReadCallbacks) + for (auto& pfd : pfds) + { + if (std::exchange (pfd.revents, 0) != 0) { - if (fdAndCallback.first == fd) - { - { - ScopedValueSetter insideFdReadCallback (shouldDeferModifyingReadCallbacks, true); - fdAndCallback.second (fd); - } - - if (! deferredReadCallbackModifications.empty()) - { - for (auto& deferredRegisterEvent : deferredReadCallbackModifications) - deferredRegisterEvent(); - - deferredReadCallbackModifications.clear(); - - // elements may have been removed from the fdReadCallbacks/pfds array so we really need - // to call poll again - return true; - } - - eventWasSent = true; - } + const auto iter = callbacks.find (pfd.fd); + + if (iter != callbacks.end()) + functions.emplace_back (iter->second); } } - - return eventWasSent; } - void sleepUntilNextEvent (int timeoutMs) + std::vector::iterator getPollfd (int fd) { - poll (&pfds.front(), static_cast (pfds.size()), timeoutMs); + return std::lower_bound (pfds.begin(), pfds.end(), fd, [] (auto descriptor, auto toFind) + { + return descriptor.fd < toFind; + }); } - std::vector>> getFdReadCallbacks() + bool pfdsAreSorted() const { - const ScopedLock sl (lock); - return fdReadCallbacks; + return std::is_sorted (pfds.begin(), pfds.end(), [] (auto a, auto b) { return a.fd < b.fd; }); } - //============================================================================== - JUCE_DECLARE_SINGLETON (InternalRunLoop, false) - -private: CriticalSection lock; - std::vector>> fdReadCallbacks; + std::map callbacks; + std::vector callbackStorage; std::vector pfds; - bool shouldDeferModifyingReadCallbacks = false; - std::vector> deferredReadCallbackModifications; + ListenerList listeners; }; JUCE_IMPLEMENT_SINGLETON (InternalRunLoop) @@ -236,13 +279,13 @@ namespace LinuxErrorHandling { static bool keyboardBreakOccurred = false; - void keyboardBreakSignalHandler (int sig) + static void keyboardBreakSignalHandler (int sig) { if (sig == SIGINT) keyboardBreakOccurred = true; } - void installKeyboardBreakHandler() + static void installKeyboardBreakHandler() { struct sigaction saction; sigset_t maskSet; @@ -313,7 +356,7 @@ bool dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages) void LinuxEventLoop::registerFdCallback (int fd, std::function readCallback, short eventMask) { if (auto* runLoop = InternalRunLoop::getInstanceWithoutCreating()) - runLoop->registerFdCallback (fd, std::move (readCallback), eventMask); + runLoop->registerFdCallback (fd, [cb = std::move (readCallback), fd] { cb (fd); }, eventMask); } void LinuxEventLoop::unregisterFdCallback (int fd) @@ -322,15 +365,31 @@ void LinuxEventLoop::unregisterFdCallback (int fd) runLoop->unregisterFdCallback (fd); } -} // namespace juce +//============================================================================== +void LinuxEventLoopInternal::registerLinuxEventLoopListener (LinuxEventLoopInternal::Listener& listener) +{ + if (auto* runLoop = InternalRunLoop::getInstanceWithoutCreating()) + runLoop->addListener (listener); +} + +void LinuxEventLoopInternal::deregisterLinuxEventLoopListener (LinuxEventLoopInternal::Listener& listener) +{ + if (auto* runLoop = InternalRunLoop::getInstanceWithoutCreating()) + runLoop->removeListener (listener); +} -JUCE_API std::vector>> getFdReadCallbacks() +void LinuxEventLoopInternal::invokeEventLoopCallbackForFd (int fd) { - using namespace juce; + if (auto* runLoop = InternalRunLoop::getInstanceWithoutCreating()) + runLoop->dispatchEvent (fd); +} +std::vector LinuxEventLoopInternal::getRegisteredFds() +{ if (auto* runLoop = InternalRunLoop::getInstanceWithoutCreating()) - return runLoop->getFdReadCallbacks(); + return runLoop->getRegisteredFds(); - jassertfalse; return {}; } + +} // namespace juce diff --git a/modules/juce_events/native/juce_mac_MessageManager.mm b/modules/juce_events/native/juce_mac_MessageManager.mm index 7ccdf817..e254a967 100644 --- a/modules/juce_events/native/juce_mac_MessageManager.mm +++ b/modules/juce_events/native/juce_mac_MessageManager.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/native/juce_osx_MessageQueue.h b/modules/juce_events/native/juce_osx_MessageQueue.h index b32cb0ec..58f39cdf 100644 --- a/modules/juce_events/native/juce_osx_MessageQueue.h +++ b/modules/juce_events/native/juce_osx_MessageQueue.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/native/juce_win32_HiddenMessageWindow.h b/modules/juce_events/native/juce_win32_HiddenMessageWindow.h index 4b87c159..e199569c 100644 --- a/modules/juce_events/native/juce_win32_HiddenMessageWindow.h +++ b/modules/juce_events/native/juce_win32_HiddenMessageWindow.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/native/juce_win32_Messaging.cpp b/modules/juce_events/native/juce_win32_Messaging.cpp index adfaf3b8..3266f7a3 100644 --- a/modules/juce_events/native/juce_win32_Messaging.cpp +++ b/modules/juce_events/native/juce_win32_Messaging.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/native/juce_win32_WinRTWrapper.cpp b/modules/juce_events/native/juce_win32_WinRTWrapper.cpp index b1a4abc3..af4a7937 100644 --- a/modules/juce_events/native/juce_win32_WinRTWrapper.cpp +++ b/modules/juce_events/native/juce_win32_WinRTWrapper.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/native/juce_win32_WinRTWrapper.h b/modules/juce_events/native/juce_win32_WinRTWrapper.h index a5b01d79..af0e1b96 100644 --- a/modules/juce_events/native/juce_win32_WinRTWrapper.h +++ b/modules/juce_events/native/juce_win32_WinRTWrapper.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/timers/juce_MultiTimer.cpp b/modules/juce_events/timers/juce_MultiTimer.cpp index 6174dd4b..8074bf8d 100644 --- a/modules/juce_events/timers/juce_MultiTimer.cpp +++ b/modules/juce_events/timers/juce_MultiTimer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/timers/juce_MultiTimer.h b/modules/juce_events/timers/juce_MultiTimer.h index 034967c4..a8aaeb8d 100644 --- a/modules/juce_events/timers/juce_MultiTimer.h +++ b/modules/juce_events/timers/juce_MultiTimer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/timers/juce_Timer.cpp b/modules/juce_events/timers/juce_Timer.cpp index 32c4e12b..3da0766d 100644 --- a/modules/juce_events/timers/juce_Timer.cpp +++ b/modules/juce_events/timers/juce_Timer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_events/timers/juce_Timer.h b/modules/juce_events/timers/juce_Timer.h index 4e5e7bcd..4d0c1acd 100644 --- a/modules/juce_events/timers/juce_Timer.h +++ b/modules/juce_events/timers/juce_Timer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_graphics/colour/juce_Colour.cpp b/modules/juce_graphics/colour/juce_Colour.cpp index 5dc54fb0..38d2d8b0 100644 --- a/modules/juce_graphics/colour/juce_Colour.cpp +++ b/modules/juce_graphics/colour/juce_Colour.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/colour/juce_Colour.h b/modules/juce_graphics/colour/juce_Colour.h index fffa2902..b8e10580 100644 --- a/modules/juce_graphics/colour/juce_Colour.h +++ b/modules/juce_graphics/colour/juce_Colour.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/colour/juce_ColourGradient.cpp b/modules/juce_graphics/colour/juce_ColourGradient.cpp index 95c4020e..a9dc3af6 100644 --- a/modules/juce_graphics/colour/juce_ColourGradient.cpp +++ b/modules/juce_graphics/colour/juce_ColourGradient.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/colour/juce_ColourGradient.h b/modules/juce_graphics/colour/juce_ColourGradient.h index f49f27b7..c38f5251 100644 --- a/modules/juce_graphics/colour/juce_ColourGradient.h +++ b/modules/juce_graphics/colour/juce_ColourGradient.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/colour/juce_Colours.cpp b/modules/juce_graphics/colour/juce_Colours.cpp index 03242a65..3dff4648 100644 --- a/modules/juce_graphics/colour/juce_Colours.cpp +++ b/modules/juce_graphics/colour/juce_Colours.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/colour/juce_Colours.h b/modules/juce_graphics/colour/juce_Colours.h index 78d51d20..434b2b16 100644 --- a/modules/juce_graphics/colour/juce_Colours.h +++ b/modules/juce_graphics/colour/juce_Colours.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/colour/juce_FillType.cpp b/modules/juce_graphics/colour/juce_FillType.cpp index 4e13e404..932a9917 100644 --- a/modules/juce_graphics/colour/juce_FillType.cpp +++ b/modules/juce_graphics/colour/juce_FillType.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/colour/juce_FillType.h b/modules/juce_graphics/colour/juce_FillType.h index 6c8ceb51..75fbbb57 100644 --- a/modules/juce_graphics/colour/juce_FillType.h +++ b/modules/juce_graphics/colour/juce_FillType.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/colour/juce_PixelFormats.h b/modules/juce_graphics/colour/juce_PixelFormats.h index 0563e8f6..29f685dc 100644 --- a/modules/juce_graphics/colour/juce_PixelFormats.h +++ b/modules/juce_graphics/colour/juce_PixelFormats.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/contexts/juce_GraphicsContext.cpp b/modules/juce_graphics/contexts/juce_GraphicsContext.cpp index 85f098d1..4cf70077 100644 --- a/modules/juce_graphics/contexts/juce_GraphicsContext.cpp +++ b/modules/juce_graphics/contexts/juce_GraphicsContext.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,8 +26,108 @@ namespace juce { +struct GraphicsFontHelpers +{ + static auto compareFont (const Font& a, const Font& b) { return Font::compare (a, b); } +}; + +static auto operator< (const Font& a, const Font& b) +{ + return GraphicsFontHelpers::compareFont (a, b); +} + +template +static auto operator< (const Rectangle& a, const Rectangle& b) +{ + const auto tie = [] (auto& t) { return std::make_tuple (t.getX(), t.getY(), t.getWidth(), t.getHeight()); }; + return tie (a) < tie (b); +} + +static auto operator< (const Justification& a, const Justification& b) +{ + return a.getFlags() < b.getFlags(); +} + +//============================================================================== namespace { + struct ConfiguredArrangement + { + void draw (const Graphics& g) const { arrangement.draw (g, transform); } + + GlyphArrangement arrangement; + AffineTransform transform; + }; + + template + class GlyphArrangementCache final : public DeletedAtShutdown + { + public: + GlyphArrangementCache() = default; + + ~GlyphArrangementCache() override + { + clearSingletonInstance(); + } + + template + void draw (const Graphics& g, ArrangementArgs&& args, ConfigureArrangement&& configureArrangement) + { + const ScopedTryLock stl (lock); + + if (! stl.isLocked()) + { + configureArrangement (args).draw (g); + return; + } + + const auto cached = [&] + { + const auto iter = cache.find (args); + + if (iter != cache.end()) + { + if (iter->second.cachePosition != cacheOrder.begin()) + cacheOrder.splice (cacheOrder.begin(), cacheOrder, iter->second.cachePosition); + + return iter; + } + + auto result = cache.emplace (std::move (args), CachedGlyphArrangement { configureArrangement (args), {} }).first; + cacheOrder.push_front (result); + return result; + }(); + + cached->second.cachePosition = cacheOrder.begin(); + cached->second.configured.draw (g); + + while (cache.size() > cacheSize) + { + cache.erase (cacheOrder.back()); + cacheOrder.pop_back(); + } + } + + JUCE_DECLARE_SINGLETON (GlyphArrangementCache, false) + + private: + struct CachedGlyphArrangement + { + using CachePtr = typename std::map::const_iterator; + ConfiguredArrangement configured; + typename std::list::const_iterator cachePosition; + }; + + static constexpr size_t cacheSize = 128; + std::map cache; + std::list cacheOrder; + CriticalSection lock; + }; + + template + juce::SingletonHolder, juce::CriticalSection, false> GlyphArrangementCache::singletonHolder; + + //============================================================================== template Rectangle coordsToRectangle (Type x, Type y, Type w, Type h) noexcept { @@ -231,67 +331,120 @@ Font Graphics::getCurrentFont() const void Graphics::drawSingleLineText (const String& text, const int startX, const int baselineY, Justification justification) const { - if (text.isNotEmpty()) - { - // Don't pass any vertical placement flags to this method - they'll be ignored. - jassert (justification.getOnlyVerticalFlags() == 0); + if (text.isEmpty()) + return; + + // Don't pass any vertical placement flags to this method - they'll be ignored. + jassert (justification.getOnlyVerticalFlags() == 0); - auto flags = justification.getOnlyHorizontalFlags(); + auto flags = justification.getOnlyHorizontalFlags(); - if (flags == Justification::right && startX < context.getClipBounds().getX()) - return; + if (flags == Justification::right && startX < context.getClipBounds().getX()) + return; - if (flags == Justification::left && startX > context.getClipBounds().getRight()) - return; + if (flags == Justification::left && startX > context.getClipBounds().getRight()) + return; - GlyphArrangement arr; - arr.addLineOfText (context.getFont(), text, (float) startX, (float) baselineY); + struct ArrangementArgs + { + auto tie() const noexcept { return std::tie (font, text, startX, baselineY); } + bool operator< (const ArrangementArgs& other) const { return tie() < other.tie(); } + + const Font font; + const String text; + const int startX, baselineY, flags; + }; - if (flags != Justification::left) + auto configureArrangement = [] (const ArrangementArgs& args) + { + AffineTransform transform; + GlyphArrangement arrangement; + arrangement.addLineOfText (args.font, args.text, (float) args.startX, (float) args.baselineY); + + if (args.flags != Justification::left) { - auto w = arr.getBoundingBox (0, -1, true).getWidth(); + auto w = arrangement.getBoundingBox (0, -1, true).getWidth(); - if ((flags & (Justification::horizontallyCentred | Justification::horizontallyJustified)) != 0) + if ((args.flags & (Justification::horizontallyCentred | Justification::horizontallyJustified)) != 0) w /= 2.0f; - arr.draw (*this, AffineTransform::translation (-w, 0)); + transform = AffineTransform::translation (-w, 0); } - else - { - arr.draw (*this); - } - } + + return ConfiguredArrangement { std::move (arrangement), std::move (transform) }; + }; + + GlyphArrangementCache::getInstance()->draw (*this, + { context.getFont(), text, startX, baselineY, flags }, + std::move (configureArrangement)); } void Graphics::drawMultiLineText (const String& text, const int startX, const int baselineY, const int maximumLineWidth, Justification justification, const float leading) const { - if (text.isNotEmpty() - && startX < context.getClipBounds().getRight()) + if (text.isEmpty() || startX >= context.getClipBounds().getRight()) + return; + + struct ArrangementArgs { - GlyphArrangement arr; - arr.addJustifiedText (context.getFont(), text, - (float) startX, (float) baselineY, (float) maximumLineWidth, - justification, leading); - arr.draw (*this); - } + auto tie() const noexcept { return std::tie (font, text, startX, baselineY, maximumLineWidth, justification, leading); } + bool operator< (const ArrangementArgs& other) const { return tie() < other.tie(); } + + const Font font; + const String text; + const int startX, baselineY, maximumLineWidth; + const Justification justification; + const float leading; + }; + + auto configureArrangement = [] (const ArrangementArgs& args) + { + GlyphArrangement arrangement; + arrangement.addJustifiedText (args.font, args.text, + (float) args.startX, (float) args.baselineY, (float) args.maximumLineWidth, + args.justification, args.leading); + return ConfiguredArrangement { std::move (arrangement), {} }; + }; + + GlyphArrangementCache::getInstance()->draw (*this, + { context.getFont(), text, startX, baselineY, maximumLineWidth, justification, leading }, + std::move (configureArrangement)); } void Graphics::drawText (const String& text, Rectangle area, Justification justificationType, bool useEllipsesIfTooBig) const { - if (text.isNotEmpty() && context.clipRegionIntersects (area.getSmallestIntegerContainer())) + if (text.isEmpty() || ! context.clipRegionIntersects (area.getSmallestIntegerContainer())) + return; + + struct ArrangementArgs { - GlyphArrangement arr; - arr.addCurtailedLineOfText (context.getFont(), text, 0.0f, 0.0f, - area.getWidth(), useEllipsesIfTooBig); - - arr.justifyGlyphs (0, arr.getNumGlyphs(), - area.getX(), area.getY(), area.getWidth(), area.getHeight(), - justificationType); - arr.draw (*this); - } + auto tie() const noexcept { return std::tie (font, text, area, justificationType, useEllipsesIfTooBig); } + bool operator< (const ArrangementArgs& other) const { return tie() < other.tie(); } + + const Font font; + const String text; + const Rectangle area; + const Justification justificationType; + const bool useEllipsesIfTooBig; + }; + + auto configureArrangement = [] (const ArrangementArgs& args) + { + GlyphArrangement arrangement; + arrangement.addCurtailedLineOfText (args.font, args.text, 0.0f, 0.0f, + args.area.getWidth(), args.useEllipsesIfTooBig); + + arrangement.justifyGlyphs (0, arrangement.getNumGlyphs(), + args.area.getX(), args.area.getY(), args.area.getWidth(), args.area.getHeight(), + args.justificationType); + return ConfiguredArrangement { std::move (arrangement), {} }; + }; + + GlyphArrangementCache::getInstance()->draw (*this, + { context.getFont(), text, area, justificationType, useEllipsesIfTooBig }, + std::move (configureArrangement)); } void Graphics::drawText (const String& text, Rectangle area, @@ -311,18 +464,37 @@ void Graphics::drawFittedText (const String& text, Rectangle area, const int maximumNumberOfLines, const float minimumHorizontalScale) const { - if (text.isNotEmpty() && (! area.isEmpty()) && context.clipRegionIntersects (area)) + if (text.isEmpty() || area.isEmpty() || ! context.clipRegionIntersects (area)) + return; + + struct ArrangementArgs { - GlyphArrangement arr; - arr.addFittedText (context.getFont(), text, - (float) area.getX(), (float) area.getY(), - (float) area.getWidth(), (float) area.getHeight(), - justification, - maximumNumberOfLines, - minimumHorizontalScale); - - arr.draw (*this); - } + auto tie() const noexcept { return std::tie (font, text, area, justification, maximumNumberOfLines, minimumHorizontalScale); } + bool operator< (const ArrangementArgs& other) const noexcept { return tie() < other.tie(); } + + const Font font; + const String text; + const Rectangle area; + const Justification justification; + const int maximumNumberOfLines; + const float minimumHorizontalScale; + }; + + auto configureArrangement = [] (const ArrangementArgs& args) + { + GlyphArrangement arrangement; + arrangement.addFittedText (args.font, args.text, + args.area.getX(), args.area.getY(), + args.area.getWidth(), args.area.getHeight(), + args.justification, + args.maximumNumberOfLines, + args.minimumHorizontalScale); + return ConfiguredArrangement { std::move (arrangement), {} }; + }; + + GlyphArrangementCache::getInstance()->draw (*this, + { context.getFont(), text, area.toFloat(), justification, maximumNumberOfLines, minimumHorizontalScale }, + std::move (configureArrangement)); } void Graphics::drawFittedText (const String& text, int x, int y, int width, int height, diff --git a/modules/juce_graphics/contexts/juce_GraphicsContext.h b/modules/juce_graphics/contexts/juce_GraphicsContext.h index 9f8274b4..71cfec53 100644 --- a/modules/juce_graphics/contexts/juce_GraphicsContext.h +++ b/modules/juce_graphics/contexts/juce_GraphicsContext.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h b/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h index 92e36a81..e34a42fe 100644 --- a/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h +++ b/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp b/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp index ecc8881d..bcd64c5c 100644 --- a/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp +++ b/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h b/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h index 5c4631c2..2ce23137 100644 --- a/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h +++ b/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -93,6 +93,7 @@ protected: struct SavedState { SavedState(); + SavedState (const SavedState&) = default; SavedState& operator= (const SavedState&) = delete; RectangleList clip; diff --git a/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp b/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp index 84ff197e..53897c08 100644 --- a/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp +++ b/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h b/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h index eec16e90..0d4e5fe6 100644 --- a/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h +++ b/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/effects/juce_DropShadowEffect.cpp b/modules/juce_graphics/effects/juce_DropShadowEffect.cpp index 3502902b..1f430aaa 100644 --- a/modules/juce_graphics/effects/juce_DropShadowEffect.cpp +++ b/modules/juce_graphics/effects/juce_DropShadowEffect.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/effects/juce_DropShadowEffect.h b/modules/juce_graphics/effects/juce_DropShadowEffect.h index db8e0b9b..061b84f3 100644 --- a/modules/juce_graphics/effects/juce_DropShadowEffect.h +++ b/modules/juce_graphics/effects/juce_DropShadowEffect.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/effects/juce_GlowEffect.cpp b/modules/juce_graphics/effects/juce_GlowEffect.cpp index c8c0ee20..23005355 100644 --- a/modules/juce_graphics/effects/juce_GlowEffect.cpp +++ b/modules/juce_graphics/effects/juce_GlowEffect.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/effects/juce_GlowEffect.h b/modules/juce_graphics/effects/juce_GlowEffect.h index 340c4f14..7237668e 100644 --- a/modules/juce_graphics/effects/juce_GlowEffect.h +++ b/modules/juce_graphics/effects/juce_GlowEffect.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/effects/juce_ImageEffectFilter.h b/modules/juce_graphics/effects/juce_ImageEffectFilter.h index 05494e8f..07116548 100644 --- a/modules/juce_graphics/effects/juce_ImageEffectFilter.h +++ b/modules/juce_graphics/effects/juce_ImageEffectFilter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/fonts/juce_AttributedString.cpp b/modules/juce_graphics/fonts/juce_AttributedString.cpp index ce09e29a..f128c5d3 100644 --- a/modules/juce_graphics/fonts/juce_AttributedString.cpp +++ b/modules/juce_graphics/fonts/juce_AttributedString.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/fonts/juce_AttributedString.h b/modules/juce_graphics/fonts/juce_AttributedString.h index 5f7fffdf..44494771 100644 --- a/modules/juce_graphics/fonts/juce_AttributedString.h +++ b/modules/juce_graphics/fonts/juce_AttributedString.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/fonts/juce_CustomTypeface.cpp b/modules/juce_graphics/fonts/juce_CustomTypeface.cpp index 4a42cf84..11d37b08 100644 --- a/modules/juce_graphics/fonts/juce_CustomTypeface.cpp +++ b/modules/juce_graphics/fonts/juce_CustomTypeface.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/fonts/juce_CustomTypeface.h b/modules/juce_graphics/fonts/juce_CustomTypeface.h index 8fdacda9..75653f03 100644 --- a/modules/juce_graphics/fonts/juce_CustomTypeface.h +++ b/modules/juce_graphics/fonts/juce_CustomTypeface.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/fonts/juce_Font.cpp b/modules/juce_graphics/fonts/juce_Font.cpp index 02d999c7..b6a6ec00 100644 --- a/modules/juce_graphics/fonts/juce_Font.cpp +++ b/modules/juce_graphics/fonts/juce_Font.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -243,14 +243,19 @@ public: { } + auto tie() const + { + return std::tie (height, underline, horizontalScale, kerning, typefaceName, typefaceStyle); + } + bool operator== (const SharedFontInternal& other) const noexcept { - return height == other.height - && underline == other.underline - && horizontalScale == other.horizontalScale - && kerning == other.kerning - && typefaceName == other.typefaceName - && typefaceStyle == other.typefaceStyle; + return tie() == other.tie(); + } + + bool operator< (const SharedFontInternal& other) const noexcept + { + return tie() < other.tie(); } /* The typeface and ascent data members may be read/set from multiple threads @@ -418,6 +423,11 @@ bool Font::operator!= (const Font& other) const noexcept return ! operator== (other); } +bool Font::compare (const Font& a, const Font& b) noexcept +{ + return *a.font < *b.font; +} + void Font::dupeInternalIfShared() { if (font->getReferenceCount() > 1) diff --git a/modules/juce_graphics/fonts/juce_Font.h b/modules/juce_graphics/fonts/juce_Font.h index e4eae256..8b4e9601 100644 --- a/modules/juce_graphics/fonts/juce_Font.h +++ b/modules/juce_graphics/fonts/juce_Font.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -471,12 +471,17 @@ public: private: //============================================================================== - class SharedFontInternal; - ReferenceCountedObjectPtr font; + static bool compare (const Font&, const Font&) noexcept; + void dupeInternalIfShared(); void checkTypefaceSuitability(); float getHeightToPointsFactor() const; + friend struct GraphicsFontHelpers; + + class SharedFontInternal; + ReferenceCountedObjectPtr font; + JUCE_LEAK_DETECTOR (Font) }; diff --git a/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp b/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp index eb5313ee..648acfcc 100644 --- a/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp +++ b/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/fonts/juce_GlyphArrangement.h b/modules/juce_graphics/fonts/juce_GlyphArrangement.h index 068e46b2..3ec14752 100644 --- a/modules/juce_graphics/fonts/juce_GlyphArrangement.h +++ b/modules/juce_graphics/fonts/juce_GlyphArrangement.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/fonts/juce_TextLayout.cpp b/modules/juce_graphics/fonts/juce_TextLayout.cpp index d69f5e13..817d5ec3 100644 --- a/modules/juce_graphics/fonts/juce_TextLayout.cpp +++ b/modules/juce_graphics/fonts/juce_TextLayout.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/fonts/juce_TextLayout.h b/modules/juce_graphics/fonts/juce_TextLayout.h index 9e2e8578..7e7e9823 100644 --- a/modules/juce_graphics/fonts/juce_TextLayout.h +++ b/modules/juce_graphics/fonts/juce_TextLayout.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/fonts/juce_Typeface.cpp b/modules/juce_graphics/fonts/juce_Typeface.cpp index ed896123..cc1fef47 100644 --- a/modules/juce_graphics/fonts/juce_Typeface.cpp +++ b/modules/juce_graphics/fonts/juce_Typeface.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/fonts/juce_Typeface.h b/modules/juce_graphics/fonts/juce_Typeface.h index cd6f9c6c..b5baec6d 100644 --- a/modules/juce_graphics/fonts/juce_Typeface.h +++ b/modules/juce_graphics/fonts/juce_Typeface.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_AffineTransform.cpp b/modules/juce_graphics/geometry/juce_AffineTransform.cpp index 86713c85..d2aa599b 100644 --- a/modules/juce_graphics/geometry/juce_AffineTransform.cpp +++ b/modules/juce_graphics/geometry/juce_AffineTransform.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_AffineTransform.h b/modules/juce_graphics/geometry/juce_AffineTransform.h index 56f2faac..bd61c2a9 100644 --- a/modules/juce_graphics/geometry/juce_AffineTransform.h +++ b/modules/juce_graphics/geometry/juce_AffineTransform.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_BorderSize.h b/modules/juce_graphics/geometry/juce_BorderSize.h index ea941027..bbf7593d 100644 --- a/modules/juce_graphics/geometry/juce_BorderSize.h +++ b/modules/juce_graphics/geometry/juce_BorderSize.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -40,6 +40,8 @@ namespace juce template class BorderSize { + auto tie() const { return std::tie (top, left, bottom, right); } + public: //============================================================================== /** Creates a null border. @@ -98,10 +100,10 @@ public: /** Returns a rectangle with these borders removed from it. */ Rectangle subtractedFrom (const Rectangle& original) const noexcept { - return Rectangle (original.getX() + left, - original.getY() + top, - original.getWidth() - (left + right), - original.getHeight() - (top + bottom)); + return { original.getX() + left, + original.getY() + top, + original.getWidth() - (left + right), + original.getHeight() - (top + bottom) }; } /** Removes this border from a given rectangle. */ @@ -113,30 +115,50 @@ public: /** Returns a rectangle with these borders added around it. */ Rectangle addedTo (const Rectangle& original) const noexcept { - return Rectangle (original.getX() - left, - original.getY() - top, - original.getWidth() + (left + right), - original.getHeight() + (top + bottom)); + return { original.getX() - left, + original.getY() - top, + original.getWidth() + (left + right), + original.getHeight() + (top + bottom) }; } - /** Adds this border around a given rectangle. */ void addTo (Rectangle& rectangle) const noexcept { rectangle = addedTo (rectangle); } - //============================================================================== - bool operator== (const BorderSize& other) const noexcept + /** Removes this border from another border. */ + BorderSize subtractedFrom (const BorderSize& other) const noexcept + { + return { other.top - top, + other.left - left, + other.bottom - bottom, + other.right - right }; + } + + /** Adds this border to another border. */ + BorderSize addedTo (const BorderSize& other) const noexcept { - return top == other.top && left == other.left && bottom == other.bottom && right == other.right; + return { other.top + top, + other.left + left, + other.bottom + bottom, + other.right + right }; } - bool operator!= (const BorderSize& other) const noexcept + /** Multiplies each member of the border by a scalar. */ + template + BorderSize multipliedBy (ScalarType scalar) const noexcept { - return ! operator== (other); + return { static_cast (scalar * top), + static_cast (scalar * left), + static_cast (scalar * bottom), + static_cast (scalar * right) }; } + //============================================================================== + bool operator== (const BorderSize& other) const noexcept { return tie() == other.tie(); } + bool operator!= (const BorderSize& other) const noexcept { return tie() != other.tie(); } + private: //============================================================================== ValueType top{}, left{}, bottom{}, right{}; diff --git a/modules/juce_graphics/geometry/juce_EdgeTable.cpp b/modules/juce_graphics/geometry/juce_EdgeTable.cpp index f9f1688c..7b660538 100644 --- a/modules/juce_graphics/geometry/juce_EdgeTable.cpp +++ b/modules/juce_graphics/geometry/juce_EdgeTable.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_EdgeTable.h b/modules/juce_graphics/geometry/juce_EdgeTable.h index ca7a5270..f78e6fda 100644 --- a/modules/juce_graphics/geometry/juce_EdgeTable.h +++ b/modules/juce_graphics/geometry/juce_EdgeTable.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_Line.h b/modules/juce_graphics/geometry/juce_Line.h index ad258e5f..940b0955 100644 --- a/modules/juce_graphics/geometry/juce_Line.h +++ b/modules/juce_graphics/geometry/juce_Line.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -203,7 +203,8 @@ public: */ Point getPointAlongLine (ValueType distanceFromStart) const noexcept { - return start + (end - start) * (distanceFromStart / getLength()); + const auto length = getLength(); + return length == 0 ? start : start + (end - start) * (distanceFromStart / length); } /** Returns a point which is a certain distance along and to the side of this line. @@ -328,6 +329,16 @@ public: && point.y < ((end.y - start.y) * (point.x - start.x)) / (end.x - start.x) + start.y; } + /** Returns a lengthened copy of this line. + + This will extend the line by a certain amount by moving the start away from the end + (leaving the end-point the same), and return the new line. + */ + Line withLengthenedStart (ValueType distanceToLengthenBy) const noexcept + { + return withShortenedStart (-distanceToLengthenBy); + } + //============================================================================== /** Returns a shortened copy of this line. @@ -339,6 +350,16 @@ public: return { getPointAlongLine (jmin (distanceToShortenBy, getLength())), end }; } + /** Returns a lengthened copy of this line. + + This will extend the line by a certain amount by moving the end away from the start + (leaving the start-point the same), and return the new line. + */ + Line withLengthenedEnd (ValueType distanceToLengthenBy) const noexcept + { + return withShortenedEnd (-distanceToLengthenBy); + } + /** Returns a shortened copy of this line. This will chop off part of the end of this line by a certain amount, (leaving the diff --git a/modules/juce_graphics/geometry/juce_Parallelogram.h b/modules/juce_graphics/geometry/juce_Parallelogram.h index a8bde9d1..3913dc1a 100644 --- a/modules/juce_graphics/geometry/juce_Parallelogram.h +++ b/modules/juce_graphics/geometry/juce_Parallelogram.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_Path.cpp b/modules/juce_graphics/geometry/juce_Path.cpp index fc809fa2..5026a75d 100644 --- a/modules/juce_graphics/geometry/juce_Path.cpp +++ b/modules/juce_graphics/geometry/juce_Path.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_Path.h b/modules/juce_graphics/geometry/juce_Path.h index 893fa435..62dd72a1 100644 --- a/modules/juce_graphics/geometry/juce_Path.h +++ b/modules/juce_graphics/geometry/juce_Path.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_PathIterator.cpp b/modules/juce_graphics/geometry/juce_PathIterator.cpp index 84efb848..1239de23 100644 --- a/modules/juce_graphics/geometry/juce_PathIterator.cpp +++ b/modules/juce_graphics/geometry/juce_PathIterator.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_PathIterator.h b/modules/juce_graphics/geometry/juce_PathIterator.h index 7eb82088..b6a14c06 100644 --- a/modules/juce_graphics/geometry/juce_PathIterator.h +++ b/modules/juce_graphics/geometry/juce_PathIterator.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_PathStrokeType.cpp b/modules/juce_graphics/geometry/juce_PathStrokeType.cpp index 16852647..fae0391a 100644 --- a/modules/juce_graphics/geometry/juce_PathStrokeType.cpp +++ b/modules/juce_graphics/geometry/juce_PathStrokeType.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_PathStrokeType.h b/modules/juce_graphics/geometry/juce_PathStrokeType.h index 268086f5..0b49c756 100644 --- a/modules/juce_graphics/geometry/juce_PathStrokeType.h +++ b/modules/juce_graphics/geometry/juce_PathStrokeType.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_Point.h b/modules/juce_graphics/geometry/juce_Point.h index dc89cf76..da183d1e 100644 --- a/modules/juce_graphics/geometry/juce_Point.h +++ b/modules/juce_graphics/geometry/juce_Point.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_Rectangle.h b/modules/juce_graphics/geometry/juce_Rectangle.h index d8854a03..db7b479d 100644 --- a/modules/juce_graphics/geometry/juce_Rectangle.h +++ b/modules/juce_graphics/geometry/juce_Rectangle.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_RectangleList.h b/modules/juce_graphics/geometry/juce_RectangleList.h index 783caf2f..8e106cd4 100644 --- a/modules/juce_graphics/geometry/juce_RectangleList.h +++ b/modules/juce_graphics/geometry/juce_RectangleList.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/geometry/juce_Rectangle_test.cpp b/modules/juce_graphics/geometry/juce_Rectangle_test.cpp index fe9a8fe4..0ac97aee 100644 --- a/modules/juce_graphics/geometry/juce_Rectangle_test.cpp +++ b/modules/juce_graphics/geometry/juce_Rectangle_test.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/image_formats/juce_GIFLoader.cpp b/modules/juce_graphics/image_formats/juce_GIFLoader.cpp index 19887688..f2cd0d86 100644 --- a/modules/juce_graphics/image_formats/juce_GIFLoader.cpp +++ b/modules/juce_graphics/image_formats/juce_GIFLoader.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp b/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp index 9386c3e1..00f0251d 100644 --- a/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp +++ b/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/image_formats/juce_PNGLoader.cpp b/modules/juce_graphics/image_formats/juce_PNGLoader.cpp index cec62e0c..137e47ce 100644 --- a/modules/juce_graphics/image_formats/juce_PNGLoader.cpp +++ b/modules/juce_graphics/image_formats/juce_PNGLoader.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -63,7 +63,8 @@ namespace pnglibNamespace "-Wtautological-constant-out-of-range-compare", "-Wzero-as-null-pointer-constant", "-Wcomma", - "-Wmaybe-uninitialized") + "-Wmaybe-uninitialized", + "-Wnull-pointer-subtraction") #undef check using std::abs; diff --git a/modules/juce_graphics/images/juce_Image.cpp b/modules/juce_graphics/images/juce_Image.cpp index c4355fe7..e054ad55 100644 --- a/modules/juce_graphics/images/juce_Image.cpp +++ b/modules/juce_graphics/images/juce_Image.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/images/juce_Image.h b/modules/juce_graphics/images/juce_Image.h index 62bb19fd..830ee682 100644 --- a/modules/juce_graphics/images/juce_Image.h +++ b/modules/juce_graphics/images/juce_Image.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/images/juce_ImageCache.cpp b/modules/juce_graphics/images/juce_ImageCache.cpp index 72ef62c8..b1731eb5 100644 --- a/modules/juce_graphics/images/juce_ImageCache.cpp +++ b/modules/juce_graphics/images/juce_ImageCache.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/images/juce_ImageCache.h b/modules/juce_graphics/images/juce_ImageCache.h index 09554cf4..2d74f94d 100644 --- a/modules/juce_graphics/images/juce_ImageCache.h +++ b/modules/juce_graphics/images/juce_ImageCache.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp b/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp index 396a1684..3b6063cd 100644 --- a/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp +++ b/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/images/juce_ImageConvolutionKernel.h b/modules/juce_graphics/images/juce_ImageConvolutionKernel.h index 2a79316b..717a83cd 100644 --- a/modules/juce_graphics/images/juce_ImageConvolutionKernel.h +++ b/modules/juce_graphics/images/juce_ImageConvolutionKernel.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/images/juce_ImageFileFormat.cpp b/modules/juce_graphics/images/juce_ImageFileFormat.cpp index 5d8eaca1..31e825cc 100644 --- a/modules/juce_graphics/images/juce_ImageFileFormat.cpp +++ b/modules/juce_graphics/images/juce_ImageFileFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/images/juce_ImageFileFormat.h b/modules/juce_graphics/images/juce_ImageFileFormat.h index 0749084d..8fcd09d8 100644 --- a/modules/juce_graphics/images/juce_ImageFileFormat.h +++ b/modules/juce_graphics/images/juce_ImageFileFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/images/juce_ScaledImage.h b/modules/juce_graphics/images/juce_ScaledImage.h index 10e4c748..fac21453 100644 --- a/modules/juce_graphics/images/juce_ScaledImage.h +++ b/modules/juce_graphics/images/juce_ScaledImage.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/juce_graphics.cpp b/modules/juce_graphics/juce_graphics.cpp index 510b38f1..d852554b 100644 --- a/modules/juce_graphics/juce_graphics.cpp +++ b/modules/juce_graphics/juce_graphics.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/juce_graphics.h b/modules/juce_graphics/juce_graphics.h index 6404d5ed..3fe8f547 100644 --- a/modules/juce_graphics/juce_graphics.h +++ b/modules/juce_graphics/juce_graphics.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_graphics vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE graphics classes description: Classes for 2D vector graphics, image loading/saving, font handling, etc. website: http://www.juce.com/juce diff --git a/modules/juce_graphics/juce_graphics.mm b/modules/juce_graphics/juce_graphics.mm index 5dc07873..a9e8ac8b 100644 --- a/modules/juce_graphics/juce_graphics.mm +++ b/modules/juce_graphics/juce_graphics.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/native/juce_RenderingHelpers.h b/modules/juce_graphics/native/juce_RenderingHelpers.h index dbde048f..716236a7 100644 --- a/modules/juce_graphics/native/juce_RenderingHelpers.h +++ b/modules/juce_graphics/native/juce_RenderingHelpers.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/native/juce_android_Fonts.cpp b/modules/juce_graphics/native/juce_android_Fonts.cpp index ad187bc7..2c82913b 100644 --- a/modules/juce_graphics/native/juce_android_Fonts.cpp +++ b/modules/juce_graphics/native/juce_android_Fonts.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/native/juce_android_GraphicsContext.cpp b/modules/juce_graphics/native/juce_android_GraphicsContext.cpp index a49000f4..4a745e2b 100644 --- a/modules/juce_graphics/native/juce_android_GraphicsContext.cpp +++ b/modules/juce_graphics/native/juce_android_GraphicsContext.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -28,7 +28,7 @@ namespace juce namespace GraphicsHelpers { - LocalRef createPaint (Graphics::ResamplingQuality quality) + static LocalRef createPaint (Graphics::ResamplingQuality quality) { jint constructorFlags = 1 /*ANTI_ALIAS_FLAG*/ | 4 /*DITHER_FLAG*/ @@ -40,7 +40,7 @@ namespace GraphicsHelpers return LocalRef(getEnv()->NewObject (AndroidPaint, AndroidPaint.constructor, constructorFlags)); } - const LocalRef createMatrix (JNIEnv* env, const AffineTransform& t) + static LocalRef createMatrix (JNIEnv* env, const AffineTransform& t) { auto m = LocalRef(env->NewObject (AndroidMatrix, AndroidMatrix.constructor)); @@ -56,7 +56,7 @@ namespace GraphicsHelpers return m; } -} +} // namespace GraphicsHelpers ImagePixelData::Ptr NativeImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const { diff --git a/modules/juce_graphics/native/juce_android_IconHelpers.cpp b/modules/juce_graphics/native/juce_android_IconHelpers.cpp index b89815dd..019da9d3 100644 --- a/modules/juce_graphics/native/juce_android_IconHelpers.cpp +++ b/modules/juce_graphics/native/juce_android_IconHelpers.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -25,5 +25,6 @@ namespace juce { + Image JUCE_API getIconFromApplication (const String&, int); Image JUCE_API getIconFromApplication (const String&, int) { return {}; } } diff --git a/modules/juce_graphics/native/juce_freetype_Fonts.cpp b/modules/juce_graphics/native/juce_freetype_Fonts.cpp index a74e630c..2c34fa9e 100644 --- a/modules/juce_graphics/native/juce_freetype_Fonts.cpp +++ b/modules/juce_graphics/native/juce_freetype_Fonts.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/native/juce_linux_Fonts.cpp b/modules/juce_graphics/native/juce_linux_Fonts.cpp index 580a1372..d5e9cc13 100644 --- a/modules/juce_graphics/native/juce_linux_Fonts.cpp +++ b/modules/juce_graphics/native/juce_linux_Fonts.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -30,7 +30,8 @@ static std::unique_ptr findFontsConfFile() { static const char* pathsToSearch[] = { "/etc/fonts/fonts.conf", "/usr/share/fonts/fonts.conf", - "/usr/local/etc/fonts/fonts.conf" }; + "/usr/local/etc/fonts/fonts.conf", + "/usr/share/defaults/fonts/fonts.conf" }; for (auto* path : pathsToSearch) if (auto xml = parseXML (File (path))) @@ -110,87 +111,122 @@ bool TextLayout::createNativeLayout (const AttributedString&) } //============================================================================== -struct DefaultFontNames +struct DefaultFontInfo { - DefaultFontNames() - : defaultSans (getDefaultSansSerifFontName()), - defaultSerif (getDefaultSerifFontName()), - defaultFixed (getDefaultMonospacedFontName()) + struct Characteristics + { + explicit Characteristics (String nameIn) : name (nameIn) {} + + Characteristics withStyle (String styleIn) const + { + auto copy = *this; + copy.style = std::move (styleIn); + return copy; + } + + String name, style; + }; + + DefaultFontInfo() + : defaultSans (getDefaultSansSerifFontCharacteristics()), + defaultSerif (getDefaultSerifFontCharacteristics()), + defaultFixed (getDefaultMonospacedFontCharacteristics()) { } - String getRealFontName (const String& faceName) const + Characteristics getRealFontCharacteristics (const String& faceName) const { if (faceName == Font::getDefaultSansSerifFontName()) return defaultSans; if (faceName == Font::getDefaultSerifFontName()) return defaultSerif; if (faceName == Font::getDefaultMonospacedFontName()) return defaultFixed; - return faceName; + return Characteristics { faceName }; } - String defaultSans, defaultSerif, defaultFixed; + Characteristics defaultSans, defaultSerif, defaultFixed; private: - static String pickBestFont (const StringArray& names, const char* const* choicesArray) + template + static Characteristics pickBestFont (const StringArray& names, Range&& choicesArray) { - const StringArray choices (choicesArray); - - for (auto& choice : choices) - if (names.contains (choice, true)) + for (auto& choice : choicesArray) + if (names.contains (choice.name, true)) return choice; - for (auto& choice : choices) + for (auto& choice : choicesArray) for (auto& name : names) - if (name.startsWithIgnoreCase (choice)) - return name; + if (name.startsWithIgnoreCase (choice.name)) + return Characteristics { name }.withStyle (choice.style); - for (auto& choice : choices) + for (auto& choice : choicesArray) for (auto& name : names) - if (name.containsIgnoreCase (choice)) - return name; + if (name.containsIgnoreCase (choice.name)) + return Characteristics { name }.withStyle (choice.style); - return names[0]; + return Characteristics { names[0] }; } - static String getDefaultSansSerifFontName() + static Characteristics getDefaultSansSerifFontCharacteristics() { StringArray allFonts; FTTypefaceList::getInstance()->getSansSerifNames (allFonts); - static const char* targets[] = { "Verdana", "Bitstream Vera Sans", "Luxi Sans", - "Liberation Sans", "DejaVu Sans", "Sans", nullptr }; + static const Characteristics targets[] { Characteristics { "Verdana" }, + Characteristics { "Bitstream Vera Sans" }.withStyle ("Roman"), + Characteristics { "Luxi Sans" }, + Characteristics { "Liberation Sans" }, + Characteristics { "DejaVu Sans" }, + Characteristics { "Sans" } }; return pickBestFont (allFonts, targets); } - static String getDefaultSerifFontName() + static Characteristics getDefaultSerifFontCharacteristics() { StringArray allFonts; FTTypefaceList::getInstance()->getSerifNames (allFonts); - static const char* targets[] = { "Bitstream Vera Serif", "Times", "Nimbus Roman", - "Liberation Serif", "DejaVu Serif", "Serif", nullptr }; + static const Characteristics targets[] { Characteristics { "Bitstream Vera Serif" }.withStyle ("Roman"), + Characteristics { "Times" }, + Characteristics { "Nimbus Roman" }, + Characteristics { "Liberation Serif" }, + Characteristics { "DejaVu Serif" }, + Characteristics { "Serif" } }; return pickBestFont (allFonts, targets); } - static String getDefaultMonospacedFontName() + static Characteristics getDefaultMonospacedFontCharacteristics() { StringArray allFonts; FTTypefaceList::getInstance()->getMonospacedNames (allFonts); - static const char* targets[] = { "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Sans Mono", - "Liberation Mono", "Courier", "DejaVu Mono", "Mono", nullptr }; + static const Characteristics targets[] { Characteristics { "DejaVu Sans Mono" }, + Characteristics { "Bitstream Vera Sans Mono" }.withStyle ("Roman"), + Characteristics { "Sans Mono" }, + Characteristics { "Liberation Mono" }, + Characteristics { "Courier" }, + Characteristics { "DejaVu Mono" }, + Characteristics { "Mono" } }; return pickBestFont (allFonts, targets); } - JUCE_DECLARE_NON_COPYABLE (DefaultFontNames) + JUCE_DECLARE_NON_COPYABLE (DefaultFontInfo) }; Typeface::Ptr Font::getDefaultTypefaceForFont (const Font& font) { - static DefaultFontNames defaultNames; + static const DefaultFontInfo defaultInfo; Font f (font); - f.setTypefaceName (defaultNames.getRealFontName (font.getTypefaceName())); + + const auto name = font.getTypefaceName(); + const auto characteristics = defaultInfo.getRealFontCharacteristics (name); + f.setTypefaceName (characteristics.name); + + const auto styles = findAllTypefaceStyles (name); + + if (! styles.contains (font.getTypefaceStyle())) + f.setTypefaceStyle (characteristics.style); + return Typeface::createSystemTypefaceFor (f); } diff --git a/modules/juce_graphics/native/juce_linux_IconHelpers.cpp b/modules/juce_graphics/native/juce_linux_IconHelpers.cpp index b89815dd..019da9d3 100644 --- a/modules/juce_graphics/native/juce_linux_IconHelpers.cpp +++ b/modules/juce_graphics/native/juce_linux_IconHelpers.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -25,5 +25,6 @@ namespace juce { + Image JUCE_API getIconFromApplication (const String&, int); Image JUCE_API getIconFromApplication (const String&, int) { return {}; } } diff --git a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h index 07f7b57c..aa323fa6 100644 --- a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h +++ b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm index df5f9f94..e190577b 100644 --- a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm +++ b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -124,19 +124,18 @@ public: [] (void * __nullable info, const void*, size_t) { delete (ImageDataContainer::Ptr*) info; }) }; } - CFUniquePtr data (CFDataCreate (nullptr, (const UInt8*) srcData.data, (CFIndex) srcData.size)); + const auto usableSize = jmin ((size_t) srcData.lineStride * (size_t) srcData.height, srcData.size); + CFUniquePtr data (CFDataCreate (nullptr, (const UInt8*) srcData.data, (CFIndex) usableSize)); return detail::DataProviderPtr { CGDataProviderCreateWithCFData (data.get()) }; }(); - CGImageRef imageRef = CGImageCreate ((size_t) srcData.width, - (size_t) srcData.height, - 8, - (size_t) srcData.pixelStride * 8, - (size_t) srcData.lineStride, - colourSpace, getCGImageFlags (juceImage.getFormat()), provider.get(), - nullptr, true, kCGRenderingIntentDefault); - - return imageRef; + return CGImageCreate ((size_t) srcData.width, + (size_t) srcData.height, + 8, + (size_t) srcData.pixelStride * 8, + (size_t) srcData.lineStride, + colourSpace, getCGImageFlags (juceImage.getFormat()), provider.get(), + nullptr, true, kCGRenderingIntentDefault); } //============================================================================== diff --git a/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h b/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h index 424a608b..4ccee76a 100644 --- a/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h +++ b/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/native/juce_mac_Fonts.mm b/modules/juce_graphics/native/juce_mac_Fonts.mm index 83ba2947..ed96d2a8 100644 --- a/modules/juce_graphics/native/juce_mac_Fonts.mm +++ b/modules/juce_graphics/native/juce_mac_Fonts.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -274,7 +274,8 @@ namespace CoreTextTypeLayout if (attribStringLen <= wordBegin) continue; - const auto wordEnd = jmin (attribStringLen, (currentPosition + attr.range.getLength()).getAddress() - beginPtr.getAddress()); + const auto wordEndAddress = (currentPosition + attr.range.getLength()).getAddress(); + const auto wordEnd = jmin (attribStringLen, (CFIndex) (wordEndAddress - beginPtr.getAddress())); const auto range = CFRangeMake (wordBegin, wordEnd - wordBegin); if (auto ctFontRef = getOrCreateFont (attr.font)) diff --git a/modules/juce_graphics/native/juce_mac_IconHelpers.cpp b/modules/juce_graphics/native/juce_mac_IconHelpers.cpp index e1f7c765..ce4aa20c 100644 --- a/modules/juce_graphics/native/juce_mac_IconHelpers.cpp +++ b/modules/juce_graphics/native/juce_mac_IconHelpers.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp b/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp index 1f17a41c..b5e3340f 100644 --- a/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp +++ b/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h b/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h index 6830621c..a407a77a 100644 --- a/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h +++ b/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp b/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp index 28931e9f..b82b4c53 100644 --- a/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp +++ b/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -229,7 +229,7 @@ namespace DirectWriteTypeLayout return dwFontMetrics.designUnitsPerEm / totalHeight; } - void setTextFormatProperties (const AttributedString& text, IDWriteTextFormat& format) + static void setTextFormatProperties (const AttributedString& text, IDWriteTextFormat& format) { DWRITE_TEXT_ALIGNMENT alignment = DWRITE_TEXT_ALIGNMENT_LEADING; DWRITE_WORD_WRAPPING wrapType = DWRITE_WORD_WRAPPING_WRAP; @@ -271,13 +271,13 @@ namespace DirectWriteTypeLayout format.SetWordWrapping (wrapType); } - void addAttributedRange (const AttributedString::Attribute& attr, - IDWriteTextLayout& textLayout, - CharPointer_UTF16 begin, - CharPointer_UTF16 textPointer, - const UINT32 textLen, - ID2D1RenderTarget& renderTarget, - IDWriteFontCollection& fontCollection) + static void addAttributedRange (const AttributedString::Attribute& attr, + IDWriteTextLayout& textLayout, + CharPointer_UTF16 begin, + CharPointer_UTF16 textPointer, + const UINT32 textLen, + ID2D1RenderTarget& renderTarget, + IDWriteFontCollection& fontCollection) { DWRITE_TEXT_RANGE range; range.startPosition = (UINT32) (textPointer.getAddress() - begin.getAddress()); @@ -337,9 +337,13 @@ namespace DirectWriteTypeLayout } } - bool setupLayout (const AttributedString& text, float maxWidth, float maxHeight, - ID2D1RenderTarget& renderTarget, IDWriteFactory& directWriteFactory, - IDWriteFontCollection& fontCollection, ComSmartPtr& textLayout) + static bool setupLayout (const AttributedString& text, + float maxWidth, + float maxHeight, + ID2D1RenderTarget& renderTarget, + IDWriteFactory& directWriteFactory, + IDWriteFontCollection& fontCollection, + ComSmartPtr& textLayout) { // To add color to text, we need to create a D2D render target // Since we are not actually rendering to a D2D context we create a temporary GDI render target @@ -403,10 +407,11 @@ namespace DirectWriteTypeLayout return true; } - void createLayout (TextLayout& layout, const AttributedString& text, - IDWriteFactory& directWriteFactory, - IDWriteFontCollection& fontCollection, - ID2D1DCRenderTarget& renderTarget) + static void createLayout (TextLayout& layout, + const AttributedString& text, + IDWriteFactory& directWriteFactory, + IDWriteFontCollection& fontCollection, + ID2D1DCRenderTarget& renderTarget) { ComSmartPtr dwTextLayout; @@ -442,8 +447,11 @@ namespace DirectWriteTypeLayout } } - void drawToD2DContext (const AttributedString& text, const Rectangle& area, ID2D1RenderTarget& renderTarget, - IDWriteFactory& directWriteFactory, IDWriteFontCollection& fontCollection) + static inline void drawToD2DContext (const AttributedString& text, + const Rectangle& area, + ID2D1RenderTarget& renderTarget, + IDWriteFactory& directWriteFactory, + IDWriteFontCollection& fontCollection) { ComSmartPtr dwTextLayout; diff --git a/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp b/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp index 189ca991..da59341e 100644 --- a/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp +++ b/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/native/juce_win32_Fonts.cpp b/modules/juce_graphics/native/juce_win32_Fonts.cpp index 119a60e5..b7d4afe2 100644 --- a/modules/juce_graphics/native/juce_win32_Fonts.cpp +++ b/modules/juce_graphics/native/juce_win32_Fonts.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/native/juce_win32_IconHelpers.cpp b/modules/juce_graphics/native/juce_win32_IconHelpers.cpp index b89815dd..019da9d3 100644 --- a/modules/juce_graphics/native/juce_win32_IconHelpers.cpp +++ b/modules/juce_graphics/native/juce_win32_IconHelpers.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -25,5 +25,6 @@ namespace juce { + Image JUCE_API getIconFromApplication (const String&, int); Image JUCE_API getIconFromApplication (const String&, int) { return {}; } } diff --git a/modules/juce_graphics/placement/juce_Justification.h b/modules/juce_graphics/placement/juce_Justification.h index 3e223633..4a8b79ad 100644 --- a/modules/juce_graphics/placement/juce_Justification.h +++ b/modules/juce_graphics/placement/juce_Justification.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/placement/juce_RectanglePlacement.cpp b/modules/juce_graphics/placement/juce_RectanglePlacement.cpp index 8652727a..9459bfbc 100644 --- a/modules/juce_graphics/placement/juce_RectanglePlacement.cpp +++ b/modules/juce_graphics/placement/juce_RectanglePlacement.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_graphics/placement/juce_RectanglePlacement.h b/modules/juce_graphics/placement/juce_RectanglePlacement.h index bdb1b088..862d916f 100644 --- a/modules/juce_graphics/placement/juce_RectanglePlacement.h +++ b/modules/juce_graphics/placement/juce_RectanglePlacement.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h b/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h index f3ad8444..a9bc64d3 100644 --- a/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h +++ b/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityActions.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h b/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h index 41b2475d..159f11e0 100644 --- a/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h +++ b/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityEvent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h b/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h index d5854953..d80c5a1e 100644 --- a/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h +++ b/modules/juce_gui_basics/accessibility/enums/juce_AccessibilityRole.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h b/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h index f5623720..049c3972 100644 --- a/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h +++ b/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityCellInterface.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h b/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h index 05afe40b..4f7f7944 100644 --- a/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h +++ b/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTableInterface.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h b/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h index ea5a8944..b53ce321 100644 --- a/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h +++ b/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityTextInterface.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -66,6 +66,9 @@ public: /** Returns a section of text. */ virtual String getText (Range range) const = 0; + /** Returns the full text. */ + String getAllText() const { return getText ({ 0, getTotalNumCharacters() }); } + /** Replaces the text with a new string. */ virtual void setText (const String& newText) = 0; diff --git a/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h b/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h index 3690ebf7..d77ba5ea 100644 --- a/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h +++ b/modules/juce_gui_basics/accessibility/interfaces/juce_AccessibilityValueInterface.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp b/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp index 8dbf22da..2ec62520 100644 --- a/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp +++ b/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -63,7 +63,6 @@ AccessibilityHandler::AccessibilityHandler (Component& comp, interfaces (std::move (interfacesIn)), nativeImpl (createNativeImpl (*this)) { - notifyAccessibilityEventInternal (*this, InternalAccessibilityEvent::elementCreated); } AccessibilityHandler::~AccessibilityHandler() diff --git a/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h b/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h index f7e30313..5cab7a70 100644 --- a/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h +++ b/modules/juce_gui_basics/accessibility/juce_AccessibilityHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/accessibility/juce_AccessibilityState.h b/modules/juce_gui_basics/accessibility/juce_AccessibilityState.h index 9b061c29..247a6c83 100644 --- a/modules/juce_gui_basics/accessibility/juce_AccessibilityState.h +++ b/modules/juce_gui_basics/accessibility/juce_AccessibilityState.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/application/juce_Application.cpp b/modules/juce_gui_basics/application/juce_Application.cpp index 88eb39cd..5e0844ba 100644 --- a/modules/juce_gui_basics/application/juce_Application.cpp +++ b/modules/juce_gui_basics/application/juce_Application.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/application/juce_Application.h b/modules/juce_gui_basics/application/juce_Application.h index b2fb7ccf..16977549 100644 --- a/modules/juce_gui_basics/application/juce_Application.h +++ b/modules/juce_gui_basics/application/juce_Application.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp b/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp index 81463ed4..3c272b54 100644 --- a/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp +++ b/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_ArrowButton.h b/modules/juce_gui_basics/buttons/juce_ArrowButton.h index 3c40d1c6..70bb3776 100644 --- a/modules/juce_gui_basics/buttons/juce_ArrowButton.h +++ b/modules/juce_gui_basics/buttons/juce_ArrowButton.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_Button.cpp b/modules/juce_gui_basics/buttons/juce_Button.cpp index 8a518737..b66b88c2 100644 --- a/modules/juce_gui_basics/buttons/juce_Button.cpp +++ b/modules/juce_gui_basics/buttons/juce_Button.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_Button.h b/modules/juce_gui_basics/buttons/juce_Button.h index afea46af..ce849023 100644 --- a/modules/juce_gui_basics/buttons/juce_Button.h +++ b/modules/juce_gui_basics/buttons/juce_Button.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp b/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp index 5fb3925a..7c4ef9bc 100644 --- a/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp +++ b/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_DrawableButton.h b/modules/juce_gui_basics/buttons/juce_DrawableButton.h index db9f0901..8503a568 100644 --- a/modules/juce_gui_basics/buttons/juce_DrawableButton.h +++ b/modules/juce_gui_basics/buttons/juce_DrawableButton.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp b/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp index 81664b2d..1fdd25a2 100644 --- a/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp +++ b/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h b/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h index ab10af19..e4b67694 100644 --- a/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h +++ b/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_ImageButton.cpp b/modules/juce_gui_basics/buttons/juce_ImageButton.cpp index f3fac83d..2d462fd5 100644 --- a/modules/juce_gui_basics/buttons/juce_ImageButton.cpp +++ b/modules/juce_gui_basics/buttons/juce_ImageButton.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_ImageButton.h b/modules/juce_gui_basics/buttons/juce_ImageButton.h index ab20fd9f..56f63222 100644 --- a/modules/juce_gui_basics/buttons/juce_ImageButton.h +++ b/modules/juce_gui_basics/buttons/juce_ImageButton.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp b/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp index 31454463..15c773b1 100644 --- a/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp +++ b/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_ShapeButton.h b/modules/juce_gui_basics/buttons/juce_ShapeButton.h index 6863b1ca..13f5c73e 100644 --- a/modules/juce_gui_basics/buttons/juce_ShapeButton.h +++ b/modules/juce_gui_basics/buttons/juce_ShapeButton.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_TextButton.cpp b/modules/juce_gui_basics/buttons/juce_TextButton.cpp index 70427b52..213b482f 100644 --- a/modules/juce_gui_basics/buttons/juce_TextButton.cpp +++ b/modules/juce_gui_basics/buttons/juce_TextButton.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_TextButton.h b/modules/juce_gui_basics/buttons/juce_TextButton.h index c424cae2..770294bb 100644 --- a/modules/juce_gui_basics/buttons/juce_TextButton.h +++ b/modules/juce_gui_basics/buttons/juce_TextButton.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp b/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp index bffb22e0..0461ea12 100644 --- a/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp +++ b/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_ToggleButton.h b/modules/juce_gui_basics/buttons/juce_ToggleButton.h index b864f585..d01488c7 100644 --- a/modules/juce_gui_basics/buttons/juce_ToggleButton.h +++ b/modules/juce_gui_basics/buttons/juce_ToggleButton.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp b/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp index 3f44add3..27c94dd9 100644 --- a/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp +++ b/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/buttons/juce_ToolbarButton.h b/modules/juce_gui_basics/buttons/juce_ToolbarButton.h index cc300637..ead752e0 100644 --- a/modules/juce_gui_basics/buttons/juce_ToolbarButton.h +++ b/modules/juce_gui_basics/buttons/juce_ToolbarButton.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h b/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h index 639b87a1..850fa386 100644 --- a/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h +++ b/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp b/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp index 13202350..b00b9f07 100644 --- a/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp +++ b/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h b/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h index a1ef6929..ebd0d469 100644 --- a/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h +++ b/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp b/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp index 0ca18aa5..bfa089b3 100644 --- a/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp +++ b/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h b/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h index b3a40320..985951b6 100644 --- a/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h +++ b/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp b/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp index c89056ba..ce51d068 100644 --- a/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp +++ b/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h b/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h index 5544b627..0c6c2045 100644 --- a/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h +++ b/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp b/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp index 61a10971..84e8a56a 100644 --- a/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp +++ b/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h b/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h index bb46a66c..c5f62b03 100644 --- a/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h +++ b/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/components/juce_CachedComponentImage.h b/modules/juce_gui_basics/components/juce_CachedComponentImage.h index 09910be0..9808a382 100644 --- a/modules/juce_gui_basics/components/juce_CachedComponentImage.h +++ b/modules/juce_gui_basics/components/juce_CachedComponentImage.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/components/juce_Component.cpp b/modules/juce_gui_basics/components/juce_Component.cpp index 691fbbae..cc7577c5 100644 --- a/modules/juce_gui_basics/components/juce_Component.cpp +++ b/modules/juce_gui_basics/components/juce_Component.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -327,7 +327,7 @@ struct Component::ComponentHelpers static bool hitTest (Component& comp, Point localPoint) { const auto intPoint = localPoint.roundToInt(); - return Rectangle { comp.getWidth(), comp.getHeight() }.toFloat().contains (localPoint) + return Rectangle { comp.getWidth(), comp.getHeight() }.contains (intPoint) && comp.hitTest (intPoint.x, intPoint.y); } @@ -509,7 +509,7 @@ struct Component::ComponentHelpers for (auto& ms : Desktop::getInstance().getMouseSources()) if (auto* c = ms.getComponentUnderMouse()) if (modalWouldBlockComponent (*c, &modal)) - (c->*function) (ms, ms.getScreenPosition(), Time::getCurrentTime()); + (c->*function) (ms, ScalingHelpers::screenPosToLocalPos (*c, ms.getScreenPosition()), Time::getCurrentTime()); } }; @@ -752,6 +752,16 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo) peer->setConstrainer (currentConstrainer); repaint(); + + #if JUCE_LINUX + // Creating the peer Image on Linux will change the reported position of the window. If + // the Image creation is interleaved with the coming configureNotifyEvents the window + // will appear in the wrong position. To avoid this, we force the Image creation here, + // before handling any of the configureNotifyEvents. The Linux implementation of + // performAnyPendingRepaintsNow() will force update the peer position if necessary. + peer->performAnyPendingRepaintsNow(); + #endif + internalHierarchyChanged(); if (auto* handler = getAccessibilityHandler()) @@ -1370,7 +1380,7 @@ AffineTransform Component::getTransform() const return affineTransform != nullptr ? *affineTransform : AffineTransform(); } -float Component::getApproximateScaleFactorForComponent (Component* targetComponent) +float Component::getApproximateScaleFactorForComponent (const Component* targetComponent) { AffineTransform transform; @@ -1997,7 +2007,7 @@ void Component::paintComponentAndChildren (Graphics& g) { auto clipBounds = g.getClipBounds(); - if (flags.dontClipGraphicsFlag) + if (flags.dontClipGraphicsFlag && getNumChildComponents() == 0) { paint (g); } @@ -2933,6 +2943,11 @@ void Component::takeKeyboardFocus (FocusChangeType cause) return; WeakReference componentLosingFocus (currentlyFocusedComponent); + + if (auto* losingFocus = componentLosingFocus.get()) + if (auto* otherPeer = losingFocus->getPeer()) + otherPeer->closeInputMethodContext(); + currentlyFocusedComponent = this; Desktop::getInstance().triggerFocusCallback(); @@ -2998,6 +3013,9 @@ void Component::giveAwayKeyboardFocusInternal (bool sendFocusLossEvent) { if (auto* componentLosingFocus = currentlyFocusedComponent) { + if (auto* otherPeer = componentLosingFocus->getPeer()) + otherPeer->closeInputMethodContext(); + currentlyFocusedComponent = nullptr; if (sendFocusLossEvent && componentLosingFocus != nullptr) @@ -3290,6 +3308,18 @@ AccessibilityHandler* Component::getAccessibilityHandler() || accessibilityHandler->getTypeIndex() != std::type_index (typeid (*this))) { accessibilityHandler = createAccessibilityHandler(); + + // On Android, notifying that an element was created can cause the system to request + // the accessibility node info for the new element. If we're not careful, this will lead + // to recursive calls, as each time an element is created, new node info will be requested, + // causing an element to be created, causing a new info request... + // By assigning the accessibility handler before notifying the system that an element was + // created, the if() predicate above should evaluate to false on recursive calls, + // terminating the recursion. + if (accessibilityHandler != nullptr) + notifyAccessibilityEventInternal (*accessibilityHandler, InternalAccessibilityEvent::elementCreated); + else + jassertfalse; // createAccessibilityHandler must return non-null } return accessibilityHandler.get(); diff --git a/modules/juce_gui_basics/components/juce_Component.h b/modules/juce_gui_basics/components/juce_Component.h index 711d3d55..24529bf5 100644 --- a/modules/juce_gui_basics/components/juce_Component.h +++ b/modules/juce_gui_basics/components/juce_Component.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -615,7 +615,7 @@ public: /** Returns the approximate scale factor for a given component by traversing its parent hierarchy and applying each transform and finally scaling this by the global scale factor. */ - static float JUCE_CALLTYPE getApproximateScaleFactorForComponent (Component* targetComponent); + static float JUCE_CALLTYPE getApproximateScaleFactorForComponent (const Component* targetComponent); //============================================================================== /** Returns a proportion of the component's width. @@ -1113,10 +1113,10 @@ public: number of simple components being rendered, and where they are guaranteed never to do any drawing beyond their own boundaries, setting this to true will reduce the overhead involved in clipping the graphics context that gets passed to the component's paint() callback. + If you enable this mode, you'll need to make sure your paint method doesn't call anything like Graphics::fillAll(), and doesn't draw beyond the component's bounds, because that'll produce - artifacts. Your component also can't have any child components that may be placed beyond its - bounds. + artifacts. This option will have no effect on components that contain any child components. */ void setPaintingIsUnclipped (bool shouldPaintWithoutClipping) noexcept; diff --git a/modules/juce_gui_basics/components/juce_ComponentListener.cpp b/modules/juce_gui_basics/components/juce_ComponentListener.cpp index 479937d3..f93e89c3 100644 --- a/modules/juce_gui_basics/components/juce_ComponentListener.cpp +++ b/modules/juce_gui_basics/components/juce_ComponentListener.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/components/juce_ComponentListener.h b/modules/juce_gui_basics/components/juce_ComponentListener.h index da8e5654..f4253e19 100644 --- a/modules/juce_gui_basics/components/juce_ComponentListener.h +++ b/modules/juce_gui_basics/components/juce_ComponentListener.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/components/juce_ComponentTraverser.h b/modules/juce_gui_basics/components/juce_ComponentTraverser.h index 1b37a0bb..a5d4e3a6 100644 --- a/modules/juce_gui_basics/components/juce_ComponentTraverser.h +++ b/modules/juce_gui_basics/components/juce_ComponentTraverser.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/components/juce_FocusTraverser.cpp b/modules/juce_gui_basics/components/juce_FocusTraverser.cpp index 6290f7db..188c33d6 100644 --- a/modules/juce_gui_basics/components/juce_FocusTraverser.cpp +++ b/modules/juce_gui_basics/components/juce_FocusTraverser.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/components/juce_FocusTraverser.h b/modules/juce_gui_basics/components/juce_FocusTraverser.h index d2b43568..5efae331 100644 --- a/modules/juce_gui_basics/components/juce_FocusTraverser.h +++ b/modules/juce_gui_basics/components/juce_FocusTraverser.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp b/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp index 6bd8d851..5d1287a7 100644 --- a/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp +++ b/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/components/juce_ModalComponentManager.h b/modules/juce_gui_basics/components/juce_ModalComponentManager.h index 61f0038e..37b6ea1f 100644 --- a/modules/juce_gui_basics/components/juce_ModalComponentManager.h +++ b/modules/juce_gui_basics/components/juce_ModalComponentManager.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/desktop/juce_Desktop.cpp b/modules/juce_gui_basics/desktop/juce_Desktop.cpp index cd56e721..8054f49c 100644 --- a/modules/juce_gui_basics/desktop/juce_Desktop.cpp +++ b/modules/juce_gui_basics/desktop/juce_Desktop.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/desktop/juce_Desktop.h b/modules/juce_gui_basics/desktop/juce_Desktop.h index f01279fd..45388b32 100644 --- a/modules/juce_gui_basics/desktop/juce_Desktop.h +++ b/modules/juce_gui_basics/desktop/juce_Desktop.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/desktop/juce_Displays.cpp b/modules/juce_gui_basics/desktop/juce_Displays.cpp index fe6e6cec..cff16433 100644 --- a/modules/juce_gui_basics/desktop/juce_Displays.cpp +++ b/modules/juce_gui_basics/desktop/juce_Displays.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/desktop/juce_Displays.h b/modules/juce_gui_basics/desktop/juce_Displays.h index 6bdc71e7..aecf834e 100644 --- a/modules/juce_gui_basics/desktop/juce_Displays.h +++ b/modules/juce_gui_basics/desktop/juce_Displays.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -166,8 +166,6 @@ public: #ifndef DOXYGEN /** @internal */ void refresh(); - /** @internal */ - ~Displays() = default; [[deprecated ("Use the getDisplayForPoint or getDisplayForRect methods instead " "as they can deal with converting between logical and physical pixels.")]] diff --git a/modules/juce_gui_basics/drawables/juce_Drawable.cpp b/modules/juce_gui_basics/drawables/juce_Drawable.cpp index 4b39d74f..2f214350 100644 --- a/modules/juce_gui_basics/drawables/juce_Drawable.cpp +++ b/modules/juce_gui_basics/drawables/juce_Drawable.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_Drawable.h b/modules/juce_gui_basics/drawables/juce_Drawable.h index 2cddd85d..9215a963 100644 --- a/modules/juce_gui_basics/drawables/juce_Drawable.h +++ b/modules/juce_gui_basics/drawables/juce_Drawable.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp b/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp index ae4257df..a0836c0a 100644 --- a/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp +++ b/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_DrawableComposite.h b/modules/juce_gui_basics/drawables/juce_DrawableComposite.h index c76d0d21..9e4d53fd 100644 --- a/modules/juce_gui_basics/drawables/juce_DrawableComposite.h +++ b/modules/juce_gui_basics/drawables/juce_DrawableComposite.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp b/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp index be590249..04b2e7eb 100644 --- a/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp +++ b/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_DrawableImage.h b/modules/juce_gui_basics/drawables/juce_DrawableImage.h index 8b9b4aab..6e1bb162 100644 --- a/modules/juce_gui_basics/drawables/juce_DrawableImage.h +++ b/modules/juce_gui_basics/drawables/juce_DrawableImage.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp b/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp index fd9919de..d7a36a83 100644 --- a/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp +++ b/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_DrawablePath.h b/modules/juce_gui_basics/drawables/juce_DrawablePath.h index 244850d5..523db9f3 100644 --- a/modules/juce_gui_basics/drawables/juce_DrawablePath.h +++ b/modules/juce_gui_basics/drawables/juce_DrawablePath.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp b/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp index 299df35e..6c8fbab7 100644 --- a/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp +++ b/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h b/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h index 3176e16c..98883a03 100644 --- a/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h +++ b/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp b/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp index ca399dbd..54e54131 100644 --- a/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp +++ b/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_DrawableShape.h b/modules/juce_gui_basics/drawables/juce_DrawableShape.h index f729c30e..b4ddb9ee 100644 --- a/modules/juce_gui_basics/drawables/juce_DrawableShape.h +++ b/modules/juce_gui_basics/drawables/juce_DrawableShape.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_DrawableText.cpp b/modules/juce_gui_basics/drawables/juce_DrawableText.cpp index 3d1f6237..361aad61 100644 --- a/modules/juce_gui_basics/drawables/juce_DrawableText.cpp +++ b/modules/juce_gui_basics/drawables/juce_DrawableText.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_DrawableText.h b/modules/juce_gui_basics/drawables/juce_DrawableText.h index 49bc052e..76ba450d 100644 --- a/modules/juce_gui_basics/drawables/juce_DrawableText.h +++ b/modules/juce_gui_basics/drawables/juce_DrawableText.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/drawables/juce_SVGParser.cpp b/modules/juce_gui_basics/drawables/juce_SVGParser.cpp index caaacbfe..7b4d83cc 100644 --- a/modules/juce_gui_basics/drawables/juce_SVGParser.cpp +++ b/modules/juce_gui_basics/drawables/juce_SVGParser.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -1748,6 +1748,7 @@ private: deltaAngle = fmod (deltaAngle, MathConstants::twoPi); } + SVGState (const SVGState&) = default; SVGState& operator= (const SVGState&) = delete; }; diff --git a/modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp b/modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp index eef5d0cc..9887b1c3 100644 --- a/modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_ContentSharer.h b/modules/juce_gui_basics/filebrowser/juce_ContentSharer.h index e72e1499..1edc79f3 100644 --- a/modules/juce_gui_basics/filebrowser/juce_ContentSharer.h +++ b/modules/juce_gui_basics/filebrowser/juce_ContentSharer.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp index 81907c9a..f336a002 100644 --- a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h index d09dac5b..a57f9b2c 100644 --- a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h +++ b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp index 6976073e..134e4511 100644 --- a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -66,10 +66,10 @@ void DirectoryContentsList::setDirectory (const File& directory, auto newFlags = fileTypeFlags; - if (includeDirectories) newFlags |= File::findDirectories; + if (includeDirectories) newFlags |= File::findDirectories; else newFlags &= ~File::findDirectories; - if (includeFiles) newFlags |= File::findFiles; + if (includeFiles) newFlags |= File::findFiles; else newFlags &= ~File::findFiles; setTypeFlags (newFlags); @@ -88,7 +88,7 @@ void DirectoryContentsList::stopSearching() { shouldStop = true; thread.removeTimeSliceClient (this); - fileFindHandle = nullptr; + isSearching = false; } void DirectoryContentsList::clear() @@ -112,6 +112,7 @@ void DirectoryContentsList::refresh() { fileFindHandle = std::make_unique (root, false, "*", fileTypeFlags); shouldStop = false; + isSearching = true; thread.addTimeSliceClient (this); } } @@ -165,7 +166,7 @@ bool DirectoryContentsList::contains (const File& targetFile) const bool DirectoryContentsList::isStillLoading() const { - return fileFindHandle != nullptr; + return isSearching; } void DirectoryContentsList::changed() @@ -221,6 +222,7 @@ bool DirectoryContentsList::checkNextFile (bool& hasChanged) } fileFindHandle = nullptr; + isSearching = false; if (! wasEmpty && files.isEmpty()) hasChanged = true; diff --git a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h index 691155ae..c1668637 100644 --- a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h +++ b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -208,7 +208,7 @@ private: OwnedArray files; std::unique_ptr fileFindHandle; - std::atomic shouldStop { true }; + std::atomic shouldStop { true }, isSearching { false }; bool wasEmpty = true; diff --git a/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp b/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp index a36a3fc6..39f337f4 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h b/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h index f6f3f3b6..e70857bc 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h +++ b/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h b/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h index e4689075..7bd30cc5 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h +++ b/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp b/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp index 58ee108b..10224c49 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FileChooser.h b/modules/juce_gui_basics/filebrowser/juce_FileChooser.h index af1badcd..4bae64c9 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileChooser.h +++ b/modules/juce_gui_basics/filebrowser/juce_FileChooser.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp b/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp index ffae88cc..814c73ad 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h b/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h index f75958df..904dac3c 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h +++ b/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp b/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp index da9c6e96..8e83749c 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h b/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h index 47fb9a7a..b5bfe529 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h +++ b/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h b/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h index 135df17e..8fc28cea 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h +++ b/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp b/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp index 66b0c96a..65ceb66a 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h b/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h index 1c40ea6c..557453d2 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h +++ b/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp b/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp index b29e50d7..f5f1e643 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h b/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h index 956bde23..b021bc75 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h +++ b/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp b/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp index a4753da2..3d3c4b13 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h b/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h index e5fb6391..4c8e75d1 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h +++ b/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp b/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp index df40edc8..30094dc2 100644 --- a/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h b/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h index 8dc7fb87..2c354a73 100644 --- a/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h +++ b/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/juce_gui_basics.cpp b/modules/juce_gui_basics/juce_gui_basics.cpp index 64477463..6755bba6 100644 --- a/modules/juce_gui_basics/juce_gui_basics.cpp +++ b/modules/juce_gui_basics/juce_gui_basics.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -45,20 +45,20 @@ #include "juce_gui_basics.h" +#include + //============================================================================== #if JUCE_MAC #import #import - - #if JUCE_SUPPORT_CARBON - #import // still needed for SetSystemUIMode() - #endif + #import #elif JUCE_IOS #if JUCE_PUSH_NOTIFICATIONS && defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 #import #endif + #import #import //============================================================================== @@ -69,6 +69,7 @@ #include #include #include + #include #if JUCE_WEB_BROWSER #include @@ -81,6 +82,7 @@ #pragma comment(lib, "vfw32.lib") #pragma comment(lib, "imm32.lib") #pragma comment(lib, "comctl32.lib") + #pragma comment(lib, "dxgi.lib") #if JUCE_OPENGL #pragma comment(lib, "OpenGL32.Lib") @@ -257,33 +259,10 @@ namespace juce #include "native/juce_MultiTouchMapper.h" #endif -#if JUCE_ANDROID || JUCE_WINDOWS +#if JUCE_ANDROID || JUCE_WINDOWS || JUCE_UNIT_TESTS #include "native/accessibility/juce_AccessibilityTextHelpers.h" #endif -namespace juce -{ - -static const juce::Identifier disableAsyncLayerBackedViewIdentifier { "disableAsyncLayerBackedView" }; - -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") - -/** Used by the macOS and iOS peers. */ -void setComponentAsyncLayerBackedViewDisabled (juce::Component& comp, bool shouldDisableAsyncLayerBackedView) -{ - comp.getProperties().set (disableAsyncLayerBackedViewIdentifier, shouldDisableAsyncLayerBackedView); -} - -/** Used by the macOS and iOS peers. */ -bool getComponentAsyncLayerBackedViewDisabled (juce::Component& comp) -{ - return comp.getProperties()[disableAsyncLayerBackedViewIdentifier]; -} - -JUCE_END_IGNORE_WARNINGS_GCC_LIKE - -} // namespace juce - #if JUCE_MAC || JUCE_IOS #include "native/accessibility/juce_mac_AccessibilitySharedCode.mm" @@ -333,9 +312,9 @@ JUCE_END_IGNORE_WARNINGS_GCC_LIKE #include "native/juce_linux_FileChooser.cpp" #elif JUCE_ANDROID + #include "juce_core/files/juce_common_MimeTypes.h" #include "native/accessibility/juce_android_Accessibility.cpp" #include "native/juce_android_Windowing.cpp" - #include "native/juce_common_MimeTypes.cpp" #include "native/juce_android_FileChooser.cpp" #if JUCE_CONTENT_SHARING @@ -430,3 +409,7 @@ bool juce::isWindowOnCurrentVirtualDesktop (void* x) // Depends on types defined in platform-specific windowing files #include "mouse/juce_MouseCursor.cpp" + +#if JUCE_UNIT_TESTS +#include "native/accessibility/juce_AccessibilityTextHelpers_test.cpp" +#endif diff --git a/modules/juce_gui_basics/juce_gui_basics.h b/modules/juce_gui_basics/juce_gui_basics.h index 5eaf306f..f83888ed 100644 --- a/modules/juce_gui_basics/juce_gui_basics.h +++ b/modules/juce_gui_basics/juce_gui_basics.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_gui_basics vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE GUI core classes description: Basic user-interface components and related classes. website: http://www.juce.com/juce @@ -43,8 +43,11 @@ minimumCppStandard: 14 dependencies: juce_graphics juce_data_structures - OSXFrameworks: Cocoa Carbon QuartzCore - iOSFrameworks: UIKit CoreServices + OSXFrameworks: Cocoa QuartzCore + WeakOSXFrameworks: Metal MetalKit + iOSFrameworks: CoreServices UIKit + WeakiOSFrameworks: Metal MetalKit + mingwLibs: dxgi END_JUCE_MODULE_DECLARATION diff --git a/modules/juce_gui_basics/juce_gui_basics.mm b/modules/juce_gui_basics/juce_gui_basics.mm index 769404c3..df31b67f 100644 --- a/modules/juce_gui_basics/juce_gui_basics.mm +++ b/modules/juce_gui_basics/juce_gui_basics.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp b/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp index 7c6b83fb..919f5f53 100644 --- a/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp +++ b/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/keyboard/juce_CaretComponent.h b/modules/juce_gui_basics/keyboard/juce_CaretComponent.h index a10b26c6..a3975560 100644 --- a/modules/juce_gui_basics/keyboard/juce_CaretComponent.h +++ b/modules/juce_gui_basics/keyboard/juce_CaretComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp b/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp index 6ec38c21..e8938c1e 100644 --- a/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp +++ b/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/keyboard/juce_KeyListener.h b/modules/juce_gui_basics/keyboard/juce_KeyListener.h index d0f18fe9..da33a7ea 100644 --- a/modules/juce_gui_basics/keyboard/juce_KeyListener.h +++ b/modules/juce_gui_basics/keyboard/juce_KeyListener.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp b/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp index 732303cb..95645ec4 100644 --- a/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp +++ b/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/keyboard/juce_KeyPress.h b/modules/juce_gui_basics/keyboard/juce_KeyPress.h index e9c1d014..82d98896 100644 --- a/modules/juce_gui_basics/keyboard/juce_KeyPress.h +++ b/modules/juce_gui_basics/keyboard/juce_KeyPress.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp b/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp index aabcca90..0aab730b 100644 --- a/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp +++ b/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h b/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h index 99cbd865..c8b78176 100644 --- a/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h +++ b/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp b/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp index d636499e..28015040 100644 --- a/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp +++ b/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h b/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h index 3789c8c1..5270459e 100644 --- a/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h +++ b/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h b/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h index 77f2b16b..2a8ce34d 100644 --- a/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h +++ b/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h b/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h index 1ba59e43..4976bb94 100644 --- a/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h +++ b/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h b/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h index 249b20ea..c89f0390 100644 --- a/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h +++ b/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_AnimatedPosition.h b/modules/juce_gui_basics/layout/juce_AnimatedPosition.h index cc75fc55..20d9f9f6 100644 --- a/modules/juce_gui_basics/layout/juce_AnimatedPosition.h +++ b/modules/juce_gui_basics/layout/juce_AnimatedPosition.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h b/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h index a4ec21a8..107138c7 100644 --- a/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h +++ b/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp b/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp index 8429f1c0..3095bde9 100644 --- a/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp +++ b/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ComponentAnimator.h b/modules/juce_gui_basics/layout/juce_ComponentAnimator.h index b5fe424d..ecbed0f9 100644 --- a/modules/juce_gui_basics/layout/juce_ComponentAnimator.h +++ b/modules/juce_gui_basics/layout/juce_ComponentAnimator.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp b/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp index 4575a13d..7c498800 100644 --- a/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp +++ b/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -111,7 +111,9 @@ void ComponentBoundsConstrainer::setBoundsForComponent (Component* component, if (auto* parent = component->getParentComponent()) return { parent->getWidth(), parent->getHeight() }; - if (auto* display = Desktop::getInstance().getDisplays().getDisplayForPoint (targetBounds.getCentre())) + const auto globalBounds = component->localAreaToGlobal (targetBounds - component->getPosition()); + + if (auto* display = Desktop::getInstance().getDisplays().getDisplayForPoint (globalBounds.getCentre())) return component->getLocalArea (nullptr, display->userArea) + component->getPosition(); const auto max = std::numeric_limits::max(); diff --git a/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h b/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h index ce9eb3ff..2a00d93e 100644 --- a/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h +++ b/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp b/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp index a8caf626..a3c002cb 100644 --- a/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp +++ b/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ComponentBuilder.h b/modules/juce_gui_basics/layout/juce_ComponentBuilder.h index 2b4b1969..daff94cc 100644 --- a/modules/juce_gui_basics/layout/juce_ComponentBuilder.h +++ b/modules/juce_gui_basics/layout/juce_ComponentBuilder.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp b/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp index 45d897e0..c943bea9 100644 --- a/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp +++ b/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h b/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h index 02bfbcf4..fac4c27e 100644 --- a/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h +++ b/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp b/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp index 43d7975a..bb1fabc3 100644 --- a/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp +++ b/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h b/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h index cb6847fe..db959f34 100644 --- a/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h +++ b/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_FlexBox.cpp b/modules/juce_gui_basics/layout/juce_FlexBox.cpp index c24d1e8f..9a7a2469 100644 --- a/modules/juce_gui_basics/layout/juce_FlexBox.cpp +++ b/modules/juce_gui_basics/layout/juce_FlexBox.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_FlexBox.h b/modules/juce_gui_basics/layout/juce_FlexBox.h index d80e7dc2..8cbdac5d 100644 --- a/modules/juce_gui_basics/layout/juce_FlexBox.h +++ b/modules/juce_gui_basics/layout/juce_FlexBox.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_FlexItem.h b/modules/juce_gui_basics/layout/juce_FlexItem.h index 67841a6d..1dfd59a6 100644 --- a/modules/juce_gui_basics/layout/juce_FlexItem.h +++ b/modules/juce_gui_basics/layout/juce_FlexItem.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_Grid.cpp b/modules/juce_gui_basics/layout/juce_Grid.cpp index de0a81f5..36a397f5 100644 --- a/modules/juce_gui_basics/layout/juce_Grid.cpp +++ b/modules/juce_gui_basics/layout/juce_Grid.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_Grid.h b/modules/juce_gui_basics/layout/juce_Grid.h index a958516e..ce261d21 100644 --- a/modules/juce_gui_basics/layout/juce_Grid.h +++ b/modules/juce_gui_basics/layout/juce_Grid.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_GridItem.cpp b/modules/juce_gui_basics/layout/juce_GridItem.cpp index 50ef8128..c1c6b466 100644 --- a/modules/juce_gui_basics/layout/juce_GridItem.cpp +++ b/modules/juce_gui_basics/layout/juce_GridItem.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_GridItem.h b/modules/juce_gui_basics/layout/juce_GridItem.h index 7da2c089..314d6539 100644 --- a/modules/juce_gui_basics/layout/juce_GridItem.h +++ b/modules/juce_gui_basics/layout/juce_GridItem.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_GroupComponent.cpp b/modules/juce_gui_basics/layout/juce_GroupComponent.cpp index 6835b9bf..e7944b7b 100644 --- a/modules/juce_gui_basics/layout/juce_GroupComponent.cpp +++ b/modules/juce_gui_basics/layout/juce_GroupComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_GroupComponent.h b/modules/juce_gui_basics/layout/juce_GroupComponent.h index e95fdf2b..e45b15f9 100644 --- a/modules/juce_gui_basics/layout/juce_GroupComponent.h +++ b/modules/juce_gui_basics/layout/juce_GroupComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp b/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp index f92b2864..255d3306 100644 --- a/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp +++ b/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h b/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h index 14034284..52ed9311 100644 --- a/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h +++ b/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp b/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp index 9f77521a..36fcbf34 100644 --- a/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp +++ b/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h b/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h index d4274ef7..bdab8b98 100644 --- a/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h +++ b/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp b/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp index 59b23abd..83535a07 100644 --- a/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp +++ b/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h b/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h index 2d5ce443..01e93882 100644 --- a/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h +++ b/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp b/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp index 1a32a657..8629e5fc 100644 --- a/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp +++ b/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h b/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h index 69126ba2..e3fc26de 100644 --- a/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h +++ b/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ScrollBar.cpp b/modules/juce_gui_basics/layout/juce_ScrollBar.cpp index f856ce31..4d5052bd 100644 --- a/modules/juce_gui_basics/layout/juce_ScrollBar.cpp +++ b/modules/juce_gui_basics/layout/juce_ScrollBar.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_ScrollBar.h b/modules/juce_gui_basics/layout/juce_ScrollBar.h index 27074786..a6d94185 100644 --- a/modules/juce_gui_basics/layout/juce_ScrollBar.h +++ b/modules/juce_gui_basics/layout/juce_ScrollBar.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_SidePanel.cpp b/modules/juce_gui_basics/layout/juce_SidePanel.cpp index 5ff9c730..758b5d96 100644 --- a/modules/juce_gui_basics/layout/juce_SidePanel.cpp +++ b/modules/juce_gui_basics/layout/juce_SidePanel.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_SidePanel.h b/modules/juce_gui_basics/layout/juce_SidePanel.h index 89feba03..59395f10 100644 --- a/modules/juce_gui_basics/layout/juce_SidePanel.h +++ b/modules/juce_gui_basics/layout/juce_SidePanel.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp b/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp index 2d0d25e5..4505a179 100644 --- a/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp +++ b/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h b/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h index bc7512db..fa53c71a 100644 --- a/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h +++ b/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp b/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp index 297fe7e5..82dd81b7 100644 --- a/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp +++ b/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h b/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h index 2e0a5889..249755a2 100644 --- a/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h +++ b/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp b/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp index 3b85e53f..30c65f1e 100644 --- a/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp +++ b/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h b/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h index 577b8f96..a6b7e3f8 100644 --- a/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h +++ b/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp b/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp index bc019093..ee0485d0 100644 --- a/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp +++ b/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h b/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h index 73c5aac2..c4ab1a43 100644 --- a/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h +++ b/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp b/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp index 8c765e3d..b19bc3d3 100644 --- a/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp +++ b/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_TabbedComponent.h b/modules/juce_gui_basics/layout/juce_TabbedComponent.h index 852564f1..83528440 100644 --- a/modules/juce_gui_basics/layout/juce_TabbedComponent.h +++ b/modules/juce_gui_basics/layout/juce_TabbedComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/layout/juce_Viewport.cpp b/modules/juce_gui_basics/layout/juce_Viewport.cpp index b59de116..c3027632 100644 --- a/modules/juce_gui_basics/layout/juce_Viewport.cpp +++ b/modules/juce_gui_basics/layout/juce_Viewport.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -90,7 +90,7 @@ struct Viewport::DragToScrollListener : private MouseListener, if (e.source == scrollSource && ! doesMouseEventComponentBlockViewportDrag (e.eventComponent)) { - auto totalOffset = e.getOffsetFromDragStart().toFloat(); + auto totalOffset = e.getEventRelativeTo (&viewport).getOffsetFromDragStart().toFloat(); if (! isDragging && totalOffset.getDistanceFromOrigin() > 8.0f && viewportWouldScrollOnEvent (&viewport, e.source)) { diff --git a/modules/juce_gui_basics/layout/juce_Viewport.h b/modules/juce_gui_basics/layout/juce_Viewport.h index 77e6700b..c7a75a11 100644 --- a/modules/juce_gui_basics/layout/juce_Viewport.h +++ b/modules/juce_gui_basics/layout/juce_Viewport.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -337,8 +337,16 @@ protected: private: //============================================================================== + class AccessibilityIgnoredComponent : public Component + { + std::unique_ptr createAccessibilityHandler() override + { + return createIgnoredAccessibilityHandler (*this); + } + }; + std::unique_ptr verticalScrollBar, horizontalScrollBar; - Component contentHolder; + AccessibilityIgnoredComponent contentHolder; WeakReference contentComp; Rectangle lastVisibleArea; int scrollBarThickness = 0; diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp index 6ed39e1a..af5af212 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h index f0ba3666..d609e3c4 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp index 738fed8c..004d6845 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h index b6c05aed..08de34e0 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp index bdbe6b97..d0e86e63 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h index 0a2cd69e..073eb720 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp index 99930bc2..0ec5d7d2 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h index 530ee3af..88e896c7 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp index 78b2c7ee..bd87b26a 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h index 99c621f4..f2072f19 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp b/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp index 7e07f4d6..dc9f961a 100644 --- a/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp +++ b/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h b/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h index 7b6d7d5c..71218ed1 100644 --- a/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h +++ b/modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp b/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp index 91352d9d..99bec2c9 100644 --- a/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp +++ b/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/menus/juce_MenuBarComponent.h b/modules/juce_gui_basics/menus/juce_MenuBarComponent.h index 25df6903..602e7bf0 100644 --- a/modules/juce_gui_basics/menus/juce_MenuBarComponent.h +++ b/modules/juce_gui_basics/menus/juce_MenuBarComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp b/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp index cc921dc4..d56dae64 100644 --- a/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp +++ b/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/menus/juce_MenuBarModel.h b/modules/juce_gui_basics/menus/juce_MenuBarModel.h index 07d6cdb6..89c98961 100644 --- a/modules/juce_gui_basics/menus/juce_MenuBarModel.h +++ b/modules/juce_gui_basics/menus/juce_MenuBarModel.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp index a03e01b6..ef413750 100644 --- a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp +++ b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -87,7 +87,7 @@ struct HeaderItemComponent : public PopupMenu::CustomComponent std::unique_ptr createAccessibilityHandler() override { - return nullptr; + return createIgnoredAccessibilityHandler (*this); } const Options& options; @@ -187,29 +187,6 @@ struct ItemComponent : public Component PopupMenu::Item item; private: - class ValueInterface : public AccessibilityValueInterface - { - public: - ValueInterface() = default; - - bool isReadOnly() const override { return true; } - - double getCurrentValue() const override - { - return 1.0; - } - - String getCurrentValueAsString() const override - { - return TRANS ("Checked"); - } - - void setValue (double) override {} - void setValueAsString (const String&) override {} - - AccessibleValueRange getRange() const override { return {}; } - }; - //============================================================================== class ItemAccessibilityHandler : public AccessibilityHandler { @@ -218,9 +195,7 @@ private: : AccessibilityHandler (itemComponentToWrap, isAccessibilityHandlerRequired (itemComponentToWrap.item) ? AccessibilityRole::menuItem : AccessibilityRole::ignored, - getAccessibilityActions (*this, itemComponentToWrap), - AccessibilityHandler::Interfaces { itemComponentToWrap.item.isTicked ? std::make_unique() - : nullptr }), + getAccessibilityActions (*this, itemComponentToWrap)), itemComponent (itemComponentToWrap) { } @@ -242,7 +217,7 @@ private: } if (itemComponent.item.isTicked) - state = state.withChecked(); + state = state.withCheckable().withChecked(); return state.isFocused() ? state.withSelected() : state; } @@ -300,7 +275,8 @@ private: std::unique_ptr createAccessibilityHandler() override { - return item.isSeparator ? nullptr : std::make_unique (*this); + return item.isSeparator ? createIgnoredAccessibilityHandler (*this) + : std::make_unique (*this); } //============================================================================== @@ -541,10 +517,14 @@ struct MenuWindow : public Component auto resultID = options.hasWatchedComponentBeenDeleted() ? 0 : getResultItemID (item); exitModalState (resultID); - exitingModalState = true; - if (makeInvisible && deletionChecker != nullptr) - setVisible (false); + if (deletionChecker != nullptr) + { + exitingModalState = true; + + if (makeInvisible) + setVisible (false); + } if (resultID != 0 && item != nullptr @@ -2049,6 +2029,17 @@ PopupMenu::Options PopupMenu::Options::withInitiallySelectedItem (int idOfItemTo Component* PopupMenu::createWindow (const Options& options, ApplicationCommandManager** managerOfChosenCommand) const { + #if JUCE_WINDOWS + const auto scope = [&]() -> std::unique_ptr + { + if (auto* target = options.getTargetComponent()) + if (auto* handle = target->getWindowHandle()) + return std::make_unique (handle); + + return nullptr; + }(); + #endif + return items.isEmpty() ? nullptr : new HelperClasses::MenuWindow (*this, nullptr, options, ! options.getTargetScreenArea().isEmpty(), diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.h b/modules/juce_gui_basics/menus/juce_PopupMenu.h index 6bb4dcaa..be05c9af 100644 --- a/modules/juce_gui_basics/menus/juce_PopupMenu.h +++ b/modules/juce_gui_basics/menus/juce_PopupMenu.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp b/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp index 7c084864..009657d6 100644 --- a/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp +++ b/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/misc/juce_BubbleComponent.h b/modules/juce_gui_basics/misc/juce_BubbleComponent.h index 33a49c35..43700942 100644 --- a/modules/juce_gui_basics/misc/juce_BubbleComponent.h +++ b/modules/juce_gui_basics/misc/juce_BubbleComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/misc/juce_DropShadower.cpp b/modules/juce_gui_basics/misc/juce_DropShadower.cpp index cbd05cc7..44604f2c 100644 --- a/modules/juce_gui_basics/misc/juce_DropShadower.cpp +++ b/modules/juce_gui_basics/misc/juce_DropShadower.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -38,6 +38,17 @@ public: if (comp->isOnDesktop()) { + #if JUCE_WINDOWS + const auto scope = [&]() -> std::unique_ptr + { + if (comp != nullptr) + if (auto* handle = comp->getWindowHandle()) + return std::make_unique (handle); + + return nullptr; + }(); + #endif + setSize (1, 1); // to keep the OS happy by not having zero-size windows addToDesktop (ComponentPeer::windowIgnoresMouseClicks | ComponentPeer::windowIsTemporary @@ -82,8 +93,7 @@ public: ParentVisibilityChangedListener (Component& r, ComponentListener& l) : root (&r), listener (&l) { - if (auto* firstParent = root->getParentComponent()) - updateParentHierarchy (firstParent); + updateParentHierarchy(); if ((SystemStats::getOperatingSystemType() & SystemStats::Windows) != 0) { @@ -99,16 +109,16 @@ public: comp->removeComponentListener (this); } - void componentVisibilityChanged (Component&) override + void componentVisibilityChanged (Component& component) override { - listener->componentVisibilityChanged (*root); + if (root != &component) + listener->componentVisibilityChanged (*root); } void componentParentHierarchyChanged (Component& component) override { if (root == &component) - if (auto* firstParent = root->getParentComponent()) - updateParentHierarchy (firstParent); + updateParentHierarchy(); } bool isWindowOnVirtualDesktop() const noexcept { return isOnVirtualDesktop; } @@ -129,13 +139,13 @@ private: WeakReference ref; }; - void updateParentHierarchy (Component* rootComponent) + void updateParentHierarchy() { const auto lastSeenComponents = std::exchange (observedComponents, [&] { std::set result; - for (auto node = rootComponent; node != nullptr; node = node->getParentComponent()) + for (auto node = root; node != nullptr; node = node->getParentComponent()) result.emplace (*node); return result; diff --git a/modules/juce_gui_basics/misc/juce_DropShadower.h b/modules/juce_gui_basics/misc/juce_DropShadower.h index 84384c4b..816b7852 100644 --- a/modules/juce_gui_basics/misc/juce_DropShadower.h +++ b/modules/juce_gui_basics/misc/juce_DropShadower.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/misc/juce_FocusOutline.cpp b/modules/juce_gui_basics/misc/juce_FocusOutline.cpp index b2171b6c..ad30f265 100644 --- a/modules/juce_gui_basics/misc/juce_FocusOutline.cpp +++ b/modules/juce_gui_basics/misc/juce_FocusOutline.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/misc/juce_FocusOutline.h b/modules/juce_gui_basics/misc/juce_FocusOutline.h index 9bd94030..fa1fc411 100644 --- a/modules/juce_gui_basics/misc/juce_FocusOutline.h +++ b/modules/juce_gui_basics/misc/juce_FocusOutline.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp b/modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp index 599d9fac..c36306d2 100644 --- a/modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp +++ b/modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -29,12 +29,12 @@ namespace juce /* ============================================================================== - In accordance with the terms of the JUCE 6 End-Use License Agreement, the + In accordance with the terms of the JUCE 7 End-Use License Agreement, the JUCE Code in SECTION A cannot be removed, changed or otherwise rendered ineffective unless you have a JUCE Indie or Pro license, or are using JUCE under the GPL v3 license. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence ============================================================================== */ diff --git a/modules/juce_gui_basics/misc/juce_JUCESplashScreen.h b/modules/juce_gui_basics/misc/juce_JUCESplashScreen.h index ef0996da..4d52410f 100644 --- a/modules/juce_gui_basics/misc/juce_JUCESplashScreen.h +++ b/modules/juce_gui_basics/misc/juce_JUCESplashScreen.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,12 +26,12 @@ /* ============================================================================== - In accordance with the terms of the JUCE 6 End-Use License Agreement, the + In accordance with the terms of the JUCE 7 End-Use License Agreement, the JUCE Code in SECTION A cannot be removed, changed or otherwise rendered ineffective unless you have a JUCE Indie or Pro license, or are using JUCE under the GPL v3 license. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence ============================================================================== */ diff --git a/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp b/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp index 75dbdf96..813bd931 100644 --- a/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp +++ b/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_ComponentDragger.h b/modules/juce_gui_basics/mouse/juce_ComponentDragger.h index b4374038..d4abd231 100644 --- a/modules/juce_gui_basics/mouse/juce_ComponentDragger.h +++ b/modules/juce_gui_basics/mouse/juce_ComponentDragger.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp b/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp index dd5633a9..e534e190 100644 --- a/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp +++ b/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -59,6 +59,7 @@ public: startTimer (200); setInterceptsMouseClicks (false, false); + setWantsKeyboardFocus (true); setAlwaysOnTop (true); } @@ -200,7 +201,12 @@ public: { if (key == KeyPress::escapeKey) { - dismissWithAnimation (true); + const auto wasVisible = isVisible(); + setVisible (false); + + if (wasVisible) + dismissWithAnimation (true); + deleteSelf(); return true; } @@ -466,8 +472,7 @@ void DragAndDropContainer::startDragging (const var& sourceDescription, dragImageComponent->setOpaque (true); dragImageComponent->addToDesktop (ComponentPeer::windowIgnoresMouseClicks - | ComponentPeer::windowIsTemporary - | ComponentPeer::windowIgnoresKeyPresses); + | ComponentPeer::windowIsTemporary); } else { @@ -484,6 +489,7 @@ void DragAndDropContainer::startDragging (const var& sourceDescription, dragImageComponent->sourceDetails.localPosition = sourceComponent->getLocalPoint (nullptr, lastMouseDown); dragImageComponent->updateLocation (false, lastMouseDown); + dragImageComponent->grabKeyboardFocus(); #if JUCE_WINDOWS // Under heavy load, the layered window's paint callback can often be lost by the OS, diff --git a/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h b/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h index ef38dc08..ed5d48aa 100644 --- a/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h +++ b/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h b/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h index a160b2ca..8a8ead16 100644 --- a/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h +++ b/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h b/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h index 6431651d..fc1eca91 100644 --- a/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h +++ b/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_LassoComponent.h b/modules/juce_gui_basics/mouse/juce_LassoComponent.h index a28b8724..383ba538 100644 --- a/modules/juce_gui_basics/mouse/juce_LassoComponent.h +++ b/modules/juce_gui_basics/mouse/juce_LassoComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp b/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp index 0e82864b..0be0e0c4 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp +++ b/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_MouseCursor.h b/modules/juce_gui_basics/mouse/juce_MouseCursor.h index 50140a43..2db3a5df 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseCursor.h +++ b/modules/juce_gui_basics/mouse/juce_MouseCursor.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp b/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp index 47fd8b15..6a450950 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp +++ b/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_MouseEvent.h b/modules/juce_gui_basics/mouse/juce_MouseEvent.h index 729a95d7..12ec11f1 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseEvent.h +++ b/modules/juce_gui_basics/mouse/juce_MouseEvent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp b/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp index a69dc64e..ae47b79f 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp +++ b/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h b/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h index 404cbc34..1f484237 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h +++ b/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp b/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp index a8ed7b02..24d0e63a 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp +++ b/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_MouseInputSource.h b/modules/juce_gui_basics/mouse/juce_MouseInputSource.h index 07a7358e..945295b0 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseInputSource.h +++ b/modules/juce_gui_basics/mouse/juce_MouseInputSource.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_MouseListener.cpp b/modules/juce_gui_basics/mouse/juce_MouseListener.cpp index e9cf1126..228cc96a 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseListener.cpp +++ b/modules/juce_gui_basics/mouse/juce_MouseListener.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_MouseListener.h b/modules/juce_gui_basics/mouse/juce_MouseListener.h index ca95126b..5094ab33 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseListener.h +++ b/modules/juce_gui_basics/mouse/juce_MouseListener.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_PointerState.h b/modules/juce_gui_basics/mouse/juce_PointerState.h index 767d6f01..2b516792 100644 --- a/modules/juce_gui_basics/mouse/juce_PointerState.h +++ b/modules/juce_gui_basics/mouse/juce_PointerState.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h b/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h index 05ae0039..f670992b 100644 --- a/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h +++ b/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h b/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h index d3f4e243..074de9b0 100644 --- a/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h +++ b/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/mouse/juce_TooltipClient.h b/modules/juce_gui_basics/mouse/juce_TooltipClient.h index 601e0ea9..a0976b45 100644 --- a/modules/juce_gui_basics/mouse/juce_TooltipClient.h +++ b/modules/juce_gui_basics/mouse/juce_TooltipClient.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h b/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h index a519fd32..4a88bc68 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h +++ b/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,7 +26,32 @@ namespace juce { -namespace AccessibilityTextHelpers +template +struct CharPtrIteratorTraits +{ + using difference_type = int; + using value_type = decltype (*std::declval()); + using pointer = value_type*; + using reference = value_type; + using iterator_category = std::bidirectional_iterator_tag; +}; + +} // namespace juce + +namespace std +{ + +template <> struct iterator_traits : juce::CharPtrIteratorTraits {}; +template <> struct iterator_traits : juce::CharPtrIteratorTraits {}; +template <> struct iterator_traits : juce::CharPtrIteratorTraits {}; +template <> struct iterator_traits : juce::CharPtrIteratorTraits {}; + +} // namespace std + +namespace juce +{ + +struct AccessibilityTextHelpers { enum class BoundaryType { @@ -42,61 +67,169 @@ namespace AccessibilityTextHelpers backwards }; - static int findTextBoundary (const AccessibilityTextInterface& textInterface, - int currentPosition, - BoundaryType boundary, - Direction direction) + enum class ExtendSelection { - const auto numCharacters = textInterface.getTotalNumCharacters(); - const auto isForwards = (direction == Direction::forwards); + no, + yes + }; - const auto offsetWithDirecton = [isForwards] (int input) { return isForwards ? input : -input; }; + /* Indicates whether a function may return the current text position, in the case that the + position already falls on a text unit boundary. + */ + enum class IncludeThisBoundary + { + no, //< Always search for the following boundary, even if the current position falls on a boundary + yes //< Return the current position if it falls on a boundary + }; - switch (boundary) + /* Indicates whether a word boundary should include any whitespaces that follow the + non-whitespace characters. + */ + enum class IncludeWhitespaceAfterWords + { + no, //< The word ends on the first whitespace character + yes //< The word ends after the last whitespace character + }; + + /* Like std::distance, but always does an O(N) count rather than an O(1) count, and doesn't + require the iterators to have any member type aliases. + */ + template + static int countDifference (Iter from, Iter to) + { + int distance = 0; + + while (from != to) { - case BoundaryType::character: - return jlimit (0, numCharacters, isForwards ? currentPosition + 1 : currentPosition); + ++from; + ++distance; + } - case BoundaryType::word: - case BoundaryType::line: + return distance; + } + + /* Returns the number of characters between ptr and the next word end in a specific + direction. + + If ptr is inside a word, the result will be the distance to the end of the same + word. + */ + template + static int findNextWordEndOffset (CharPtr begin, + CharPtr end, + CharPtr ptr, + Direction direction, + IncludeThisBoundary includeBoundary, + IncludeWhitespaceAfterWords includeWhitespace) + { + const auto move = [&] (auto b, auto e, auto iter) + { + const auto isSpace = [] (juce_wchar c) { return CharacterFunctions::isWhitespace (c); }; + + const auto start = [&] { - const auto text = [&]() -> String - { - if (isForwards) - return textInterface.getText ({ currentPosition, textInterface.getTotalNumCharacters() }); + if (iter == b && includeBoundary == IncludeThisBoundary::yes) + return b; + + const auto nudged = iter - (iter != b && includeBoundary == IncludeThisBoundary::yes ? 1 : 0); + + return includeWhitespace == IncludeWhitespaceAfterWords::yes + ? std::find_if (nudged, e, isSpace) + : std::find_if_not (nudged, e, isSpace); + }(); - const auto str = textInterface.getText ({ 0, currentPosition }); + const auto found = includeWhitespace == IncludeWhitespaceAfterWords::yes + ? std::find_if_not (start, e, isSpace) + : std::find_if (start, e, isSpace); - auto start = str.getCharPointer(); - auto end = start.findTerminatingNull(); - const auto size = getAddressDifference (end.getAddress(), start.getAddress()); + return countDifference (iter, found); + }; + + return direction == Direction::forwards ? move (begin, end, ptr) + : -move (std::make_reverse_iterator (end), + std::make_reverse_iterator (begin), + std::make_reverse_iterator (ptr)); + } + + /* Returns the number of characters between ptr and the beginning of the next line in a + specific direction. + */ + template + static int findNextLineOffset (CharPtr begin, + CharPtr end, + CharPtr ptr, + Direction direction, + IncludeThisBoundary includeBoundary) + { + const auto findNewline = [] (auto from, auto to) { return std::find (from, to, juce_wchar { '\n' }); }; - String reversed; + if (direction == Direction::forwards) + { + if (ptr != begin && includeBoundary == IncludeThisBoundary::yes && *(ptr - 1) == '\n') + return 0; - if (size > 0) - { - reversed.preallocateBytes ((size_t) size); + const auto newline = findNewline (ptr, end); + return countDifference (ptr, newline) + (newline == end ? 0 : 1); + } - auto destPtr = reversed.getCharPointer(); + const auto rbegin = std::make_reverse_iterator (ptr); + const auto rend = std::make_reverse_iterator (begin); - for (;;) - { - destPtr.write (*--end); + return -countDifference (rbegin, findNewline (rbegin + (rbegin == rend || includeBoundary == IncludeThisBoundary::yes ? 0 : 1), rend)); + } - if (end == start) - break; - } + /* Unfortunately, the method of computing end-points of text units depends on context, and on + the current platform. - destPtr.writeNull(); - } + Some examples of different behaviour: + - On Android, updating the cursor/selection always searches for the next text unit boundary; + but on Windows, ExpandToEnclosingUnit() should not move the starting point of the + selection if it already at a unit boundary. This means that we need both inclusive and + exclusive methods for finding the next text boundary. + - On Android, moving the cursor by 'words' should move to the first space following a + non-space character in the requested direction. On Windows, a 'word' includes trailing + whitespace, but not preceding whitespace. This means that we need a way of specifying + whether whitespace should be included when navigating by words. + */ + static int findTextBoundary (const AccessibilityTextInterface& textInterface, + int currentPosition, + BoundaryType boundary, + Direction direction, + IncludeThisBoundary includeBoundary, + IncludeWhitespaceAfterWords includeWhitespace) + { + const auto numCharacters = textInterface.getTotalNumCharacters(); + const auto isForwards = (direction == Direction::forwards); + const auto currentClamped = jlimit (0, numCharacters, currentPosition); - return reversed; - }(); + switch (boundary) + { + case BoundaryType::character: + { + const auto offset = includeBoundary == IncludeThisBoundary::yes ? 0 + : (isForwards ? 1 : -1); + return jlimit (0, numCharacters, currentPosition + offset); + } - auto tokens = (boundary == BoundaryType::line ? StringArray::fromLines (text) - : StringArray::fromTokens (text, false)); + case BoundaryType::word: + { + const auto str = textInterface.getText ({ 0, numCharacters }); + return currentClamped + findNextWordEndOffset (str.begin(), + str.end(), + str.begin() + currentClamped, + direction, + includeBoundary, + includeWhitespace); + } - return currentPosition + offsetWithDirecton (tokens[0].length()); + case BoundaryType::line: + { + const auto str = textInterface.getText ({ 0, numCharacters }); + return currentClamped + findNextLineOffset (str.begin(), + str.end(), + str.begin() + currentClamped, + direction, + includeBoundary); } case BoundaryType::document: @@ -106,6 +239,31 @@ namespace AccessibilityTextHelpers jassertfalse; return -1; } -} + + /* Adjusts the current text selection range, using an algorithm appropriate for cursor movement + on Android. + */ + static Range findNewSelectionRangeAndroid (const AccessibilityTextInterface& textInterface, + BoundaryType boundaryType, + ExtendSelection extend, + Direction direction) + { + const auto oldPos = textInterface.getTextInsertionOffset(); + const auto cursorPos = findTextBoundary (textInterface, + oldPos, + boundaryType, + direction, + IncludeThisBoundary::no, + IncludeWhitespaceAfterWords::no); + + if (extend == ExtendSelection::no) + return { cursorPos, cursorPos }; + + const auto currentSelection = textInterface.getSelection(); + const auto start = currentSelection.getStart(); + const auto end = currentSelection.getEnd(); + return Range::between (cursorPos, oldPos == start ? end : start); + } +}; } // namespace juce diff --git a/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp b/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp new file mode 100644 index 00000000..1b527f10 --- /dev/null +++ b/modules/juce_gui_basics/native/accessibility/juce_AccessibilityTextHelpers_test.cpp @@ -0,0 +1,155 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2020 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 6 End-User License + Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + + End User License Agreement: www.juce.com/juce-6-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +struct AccessibilityTextHelpersTest : public UnitTest +{ + AccessibilityTextHelpersTest() + : UnitTest ("AccessibilityTextHelpers", UnitTestCategories::gui) {} + + void runTest() override + { + using ATH = AccessibilityTextHelpers; + + beginTest ("Android find word end"); + { + const auto testMultiple = [this] (String str, + int start, + const std::vector& collection) + { + auto it = collection.begin(); + + for (const auto direction : { ATH::Direction::forwards, ATH::Direction::backwards }) + { + for (const auto includeBoundary : { ATH::IncludeThisBoundary::no, ATH::IncludeThisBoundary::yes }) + { + for (const auto includeWhitespace : { ATH::IncludeWhitespaceAfterWords::no, ATH::IncludeWhitespaceAfterWords::yes }) + { + const auto actual = ATH::findNextWordEndOffset (str.begin(), str.end(), str.begin() + start, direction, includeBoundary, includeWhitespace); + const auto expected = *it++; + expect (expected == actual); + } + } + } + }; + + // Character Indices 0 3 56 13 50 51 + // | | || | | | + const auto string = String ("hello world \r\n with some spaces in this sentence ") + String (CharPointer_UTF8 ("\xe2\x88\xae E\xe2\x8b\x85""da = Q")); + // Direction forwards forwards forwards forwards backwards backwards backwards backwards + // IncludeBoundary no no yes yes no no yes yes + // IncludeWhitespace no yes no yes no yes no yes + testMultiple (string, 0, { 5, 6, 5, 0, 0, 0, 0, 0 }); + testMultiple (string, 3, { 2, 3, 2, 3, -3, -3, -3, -3 }); + testMultiple (string, 5, { 6, 1, 0, 1, -5, -5, -5, 0 }); + testMultiple (string, 6, { 5, 9, 5, 0, -6, -1, 0, -1 }); + testMultiple (string, 13, { 6, 2, 6, 2, -7, -2, -7, -2 }); + testMultiple (string, 50, { 1, 2, 1, 0, -9, -1, 0, -1 }); + testMultiple (string, 51, { 5, 1, 0, 1, -1, -2, -1, 0 }); + + testMultiple (" a b ", 0, { 3, 2, 0, 2, 0, 0, 0, 0 }); + testMultiple (" a b ", 1, { 2, 1, 2, 1, -1, -1, -1, -1 }); + } + + beginTest ("Android text range adjustment"); + { + const auto testMultiple = [this] (String str, + Range initial, + auto boundary, + const std::vector>& collection) + { + auto it = collection.begin(); + + for (auto extend : { ATH::ExtendSelection::no, ATH::ExtendSelection::yes }) + { + for (auto direction : { ATH::Direction::forwards, ATH::Direction::backwards }) + { + for (auto insert : { CursorPosition::begin, CursorPosition::end }) + { + const MockAccessibilityTextInterface mock { str, initial, insert }; + const auto actual = ATH::findNewSelectionRangeAndroid (mock, boundary, extend, direction); + const auto expected = *it++; + expect (expected == actual); + } + } + } + }; + + // Extend no no no no yes yes yes yes + // Direction forwards forwards backwards backwards forwards forwards backwards backwards + // Insert begin end begin end begin end begin end + testMultiple ("hello world", { 5, 5 }, ATH::BoundaryType::character, { { 6, 6 }, { 6, 6 }, { 4, 4 }, { 4, 4 }, { 5, 6 }, { 5, 6 }, { 4, 5 }, { 4, 5 } }); + testMultiple ("hello world", { 0, 0 }, ATH::BoundaryType::character, { { 1, 1 }, { 1, 1 }, { 0, 0 }, { 0, 0 }, { 0, 1 }, { 0, 1 }, { 0, 0 }, { 0, 0 } }); + testMultiple ("hello world", { 11, 11 }, ATH::BoundaryType::character, { { 11, 11 }, { 11, 11 }, { 10, 10 }, { 10, 10 }, { 11, 11 }, { 11, 11 }, { 10, 11 }, { 10, 11 } }); + testMultiple ("hello world", { 4, 5 }, ATH::BoundaryType::character, { { 5, 5 }, { 6, 6 }, { 3, 3 }, { 4, 4 }, { 5, 5 }, { 4, 6 }, { 3, 5 }, { 4, 4 } }); + testMultiple ("hello world", { 0, 1 }, ATH::BoundaryType::character, { { 1, 1 }, { 2, 2 }, { 0, 0 }, { 0, 0 }, { 1, 1 }, { 0, 2 }, { 0, 1 }, { 0, 0 } }); + testMultiple ("hello world", { 10, 11 }, ATH::BoundaryType::character, { { 11, 11 }, { 11, 11 }, { 9, 9 }, { 10, 10 }, { 11, 11 }, { 10, 11 }, { 9, 11 }, { 10, 10 } }); + + testMultiple ("foo bar baz", { 0, 0 }, ATH::BoundaryType::word, { { 3, 3 }, { 3, 3 }, { 0, 0 }, { 0, 0 }, { 0, 3 }, { 0, 3 }, { 0, 0 }, { 0, 0 } }); + testMultiple ("foo bar baz", { 1, 6 }, ATH::BoundaryType::word, { { 3, 3 }, { 8, 8 }, { 0, 0 }, { 5, 5 }, { 3, 6 }, { 1, 8 }, { 0, 6 }, { 1, 5 } }); + testMultiple ("foo bar baz", { 3, 3 }, ATH::BoundaryType::word, { { 8, 8 }, { 8, 8 }, { 0, 0 }, { 0, 0 }, { 3, 8 }, { 3, 8 }, { 0, 3 }, { 0, 3 } }); + testMultiple ("foo bar baz", { 3, 5 }, ATH::BoundaryType::word, { { 8, 8 }, { 8, 8 }, { 0, 0 }, { 0, 0 }, { 5, 8 }, { 3, 8 }, { 0, 5 }, { 0, 3 } }); + + testMultiple ("foo bar\n\n\na b\nc d e", { 0, 0 }, ATH::BoundaryType::line, { { 8, 8 }, { 8, 8 }, { 0, 0 }, { 0, 0 }, { 0, 8 }, { 0, 8 }, { 0, 0 }, { 0, 0 } }); + testMultiple ("foo bar\n\n\na b\nc d e", { 7, 7 }, ATH::BoundaryType::line, { { 8, 8 }, { 8, 8 }, { 0, 0 }, { 0, 0 }, { 7, 8 }, { 7, 8 }, { 0, 7 }, { 0, 7 } }); + testMultiple ("foo bar\n\n\na b\nc d e", { 8, 8 }, ATH::BoundaryType::line, { { 9, 9 }, { 9, 9 }, { 0, 0 }, { 0, 0 }, { 8, 9 }, { 8, 9 }, { 0, 8 }, { 0, 8 } }); + + testMultiple ("foo bar\r\na b\r\nxyz", { 0, 0 }, ATH::BoundaryType::line, { { 9, 9 }, { 9, 9 }, { 0, 0 }, { 0, 0 }, { 0, 9 }, { 0, 9 }, { 0, 0 }, { 0, 0 } }); + testMultiple ("foo bar\r\na b\r\nxyz", { 10, 10 }, ATH::BoundaryType::line, { { 14, 14 }, { 14, 14 }, { 9, 9 }, { 9, 9 }, { 10, 14 }, { 10, 14 }, { 9, 10 }, { 9, 10 } }); + } + } + + enum class CursorPosition { begin, end }; + + class MockAccessibilityTextInterface : public AccessibilityTextInterface + { + public: + MockAccessibilityTextInterface (String stringIn, Range selectionIn, CursorPosition insertIn) + : string (stringIn), selection (selectionIn), insert (insertIn) {} + + bool isDisplayingProtectedText() const override { return false; } + bool isReadOnly() const override { return false; } + int getTotalNumCharacters() const override { return string.length(); } + Range getSelection() const override { return selection; } + int getTextInsertionOffset() const override { return insert == CursorPosition::begin ? selection.getStart() : selection.getEnd(); } + String getText (Range range) const override { return string.substring (range.getStart(), range.getEnd()); } + RectangleList getTextBounds (Range) const override { return {}; } + int getOffsetAtPoint (Point) const override { return 0; } + + void setSelection (Range newRange) override { selection = newRange; } + void setText (const String& newText) override { string = newText; } + + private: + String string; + Range selection; + CursorPosition insert; + }; +}; + +static AccessibilityTextHelpersTest accessibilityTextHelpersTest; + +} // namespace juce diff --git a/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp b/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp index 53ae2a67..6eeae8d6 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp +++ b/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -59,7 +59,10 @@ namespace juce #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ STATICMETHOD (obtain, "obtain", "(I)Landroid/view/accessibility/AccessibilityEvent;") \ METHOD (setPackageName, "setPackageName", "(Ljava/lang/CharSequence;)V") \ - METHOD (setSource, "setSource", "(Landroid/view/View;I)V") \ + METHOD (setSource, "setSource","(Landroid/view/View;I)V") \ + METHOD (setAction, "setAction", "(I)V") \ + METHOD (setFromIndex, "setFromIndex", "(I)V") \ + METHOD (setToIndex, "setToIndex", "(I)V") \ DECLARE_JNI_CLASS (AndroidAccessibilityEvent, "android/view/accessibility/AccessibilityEvent") #undef JNI_CLASS_MEMBERS @@ -74,13 +77,14 @@ namespace { constexpr int HOST_VIEW_ID = -1; - constexpr int TYPE_VIEW_CLICKED = 0x00000001, - TYPE_VIEW_SELECTED = 0x00000004, - TYPE_VIEW_ACCESSIBILITY_FOCUSED = 0x00008000, - TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 0x00010000, - TYPE_WINDOW_CONTENT_CHANGED = 0x00000800, - TYPE_VIEW_TEXT_SELECTION_CHANGED = 0x00002000, - TYPE_VIEW_TEXT_CHANGED = 0x00000010; + constexpr int TYPE_VIEW_CLICKED = 0x00000001, + TYPE_VIEW_SELECTED = 0x00000004, + TYPE_VIEW_ACCESSIBILITY_FOCUSED = 0x00008000, + TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 0x00010000, + TYPE_WINDOW_CONTENT_CHANGED = 0x00000800, + TYPE_VIEW_TEXT_SELECTION_CHANGED = 0x00002000, + TYPE_VIEW_TEXT_CHANGED = 0x00000010, + TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 0x00020000; constexpr int CONTENT_CHANGE_TYPE_SUBTREE = 0x00000001, CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 0x00000004; @@ -198,8 +202,6 @@ static jobject getSourceView (const AccessibilityHandler& handler) return nullptr; } -void sendAccessibilityEventImpl (const AccessibilityHandler& handler, int eventType, int contentChangeTypes); - //============================================================================== class AccessibilityNativeHandle { @@ -377,7 +379,7 @@ public: { env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.setText, - javaString (textInterface->getText ({ 0, textInterface->getTotalNumCharacters() })).get()); + javaString (textInterface->getAllText()).get()); const auto isReadOnly = textInterface->isReadOnly(); @@ -481,10 +483,15 @@ public: case ACTION_CLICK: { + // Invoking the action may delete this handler + const WeakReference savedHandle { this }; + if ((accessibilityHandler.getCurrentState().isCheckable() && accessibilityHandler.getActions().invoke (AccessibilityActionType::toggle)) || accessibilityHandler.getActions().invoke (AccessibilityActionType::press)) { - sendAccessibilityEventImpl (accessibilityHandler, TYPE_VIEW_CLICKED, 0); + if (savedHandle != nullptr) + sendAccessibilityEventImpl (accessibilityHandler, TYPE_VIEW_CLICKED, 0); + return true; } @@ -556,7 +563,10 @@ public: return env->CallIntMethod (arguments, AndroidBundle.getInt, key.get()); }; - return { getKey (selectionStartKey), getKey (selectionEndKey) }; + const auto start = getKey (selectionStartKey); + const auto end = getKey (selectionEndKey); + + return Range::between (start, end); } return {}; @@ -636,6 +646,78 @@ public: bool isInPopulateNodeInfo() const noexcept { return inPopulateNodeInfo; } + static bool areAnyAccessibilityClientsActive() + { + auto* env = getEnv(); + auto appContext = getAppContext(); + + if (appContext.get() != nullptr) + { + LocalRef accessibilityManager (env->CallObjectMethod (appContext.get(), AndroidContext.getSystemService, + javaString ("accessibility").get())); + + if (accessibilityManager != nullptr) + return env->CallBooleanMethod (accessibilityManager.get(), AndroidAccessibilityManager.isEnabled); + } + + return false; + } + + template + static void sendAccessibilityEventExtendedImpl (const AccessibilityHandler& handler, + int eventType, + ModificationCallback&& modificationCallback) + { + if (! areAnyAccessibilityClientsActive()) + return; + + if (const auto sourceView = getSourceView (handler)) + { + const auto* nativeImpl = handler.getNativeImplementation(); + + if (nativeImpl == nullptr || nativeImpl->isInPopulateNodeInfo()) + return; + + auto* env = getEnv(); + auto appContext = getAppContext(); + + if (appContext.get() == nullptr) + return; + + LocalRef event (env->CallStaticObjectMethod (AndroidAccessibilityEvent, + AndroidAccessibilityEvent.obtain, + eventType)); + + env->CallVoidMethod (event, + AndroidAccessibilityEvent.setPackageName, + env->CallObjectMethod (appContext.get(), + AndroidContext.getPackageName)); + + env->CallVoidMethod (event, + AndroidAccessibilityEvent.setSource, + sourceView, + nativeImpl->getVirtualViewId()); + + modificationCallback (event); + + env->CallBooleanMethod (sourceView, + AndroidViewGroup.requestSendAccessibilityEvent, + sourceView, + event.get()); + } + } + + static void sendAccessibilityEventImpl (const AccessibilityHandler& handler, int eventType, int contentChangeTypes) + { + sendAccessibilityEventExtendedImpl (handler, eventType, [contentChangeTypes] (auto event) + { + if (contentChangeTypes != 0 && accessibilityEventSetContentChangeTypes != nullptr) + getEnv()->CallVoidMethod (event, + accessibilityEventSetContentChangeTypes, + contentChangeTypes); + }); + } + private: static std::unordered_map virtualViewIdMap; @@ -654,7 +736,7 @@ private: const auto valueString = [this]() -> String { if (auto* textInterface = accessibilityHandler.getTextInterface()) - return textInterface->getText ({ 0, textInterface->getTotalNumCharacters() }); + return textInterface->getAllText(); if (auto* valueInterface = accessibilityHandler.getValueInterface()) return valueInterface->getCurrentValueAsString(); @@ -674,66 +756,68 @@ private: bool moveCursor (jobject arguments, bool forwards) { - if (auto* textInterface = accessibilityHandler.getTextInterface()) - { - const auto granularityKey = javaString ("ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT"); - const auto extendSelectionKey = javaString ("ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN"); + using ATH = AccessibilityTextHelpers; - auto* env = getEnv(); + auto* textInterface = accessibilityHandler.getTextInterface(); - const auto boundaryType = [&] - { - const auto granularity = env->CallIntMethod (arguments, - AndroidBundle.getInt, - granularityKey.get()); + if (textInterface == nullptr) + return false; - using BoundaryType = AccessibilityTextHelpers::BoundaryType; + const auto granularityKey = javaString ("ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT"); + const auto extendSelectionKey = javaString ("ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN"); - switch (granularity) - { - case MOVEMENT_GRANULARITY_CHARACTER: return BoundaryType::character; - case MOVEMENT_GRANULARITY_WORD: return BoundaryType::word; - case MOVEMENT_GRANULARITY_LINE: return BoundaryType::line; - case MOVEMENT_GRANULARITY_PARAGRAPH: - case MOVEMENT_GRANULARITY_PAGE: return BoundaryType::document; - } - - jassertfalse; - return BoundaryType::character; - }(); + auto* env = getEnv(); - using Direction = AccessibilityTextHelpers::Direction; + const auto boundaryType = [&] + { + const auto granularity = env->CallIntMethod (arguments, AndroidBundle.getInt, granularityKey.get()); - const auto cursorPos = AccessibilityTextHelpers::findTextBoundary (*textInterface, - textInterface->getTextInsertionOffset(), - boundaryType, - forwards ? Direction::forwards - : Direction::backwards); + using BoundaryType = ATH::BoundaryType; - const auto newSelection = [&]() -> Range + switch (granularity) { - const auto currentSelection = textInterface->getSelection(); - const auto extendSelection = env->CallBooleanMethod (arguments, - AndroidBundle.getBoolean, - extendSelectionKey.get()); + case MOVEMENT_GRANULARITY_CHARACTER: return BoundaryType::character; + case MOVEMENT_GRANULARITY_WORD: return BoundaryType::word; + case MOVEMENT_GRANULARITY_LINE: return BoundaryType::line; + case MOVEMENT_GRANULARITY_PARAGRAPH: + case MOVEMENT_GRANULARITY_PAGE: return BoundaryType::document; + } - if (! extendSelection) - return { cursorPos, cursorPos }; + jassertfalse; + return BoundaryType::character; + }(); - const auto start = currentSelection.getStart(); - const auto end = currentSelection.getEnd(); + const auto direction = forwards + ? ATH::Direction::forwards + : ATH::Direction::backwards; - if (forwards) - return { start, jmax (start, cursorPos) }; + const auto extend = env->CallBooleanMethod (arguments, AndroidBundle.getBoolean, extendSelectionKey.get()) + ? ATH::ExtendSelection::yes + : ATH::ExtendSelection::no; - return { jmin (start, cursorPos), end }; - }(); + const auto oldSelection = textInterface->getSelection(); + const auto newSelection = ATH::findNewSelectionRangeAndroid (*textInterface, boundaryType, extend, direction); + textInterface->setSelection (newSelection); - textInterface->setSelection (newSelection); - return true; - } + // Required for Android to read back the text that the cursor moved over + sendAccessibilityEventExtendedImpl (accessibilityHandler, TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY, [&] (auto event) + { + env->CallVoidMethod (event, + AndroidAccessibilityEvent.setAction, + forwards ? ACTION_NEXT_AT_MOVEMENT_GRANULARITY : ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY); - return false; + env->CallVoidMethod (event, + AndroidAccessibilityEvent.setFromIndex, + oldSelection.getStart() != newSelection.getStart() ? oldSelection.getStart() + : oldSelection.getEnd()); + + env->CallVoidMethod (event, + AndroidAccessibilityEvent.setToIndex, + oldSelection.getStart() != newSelection.getStart() ? newSelection.getStart() + : newSelection.getEnd()); + }); + + return true; } AccessibilityHandler& accessibilityHandler; @@ -742,6 +826,8 @@ private: //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AccessibilityNativeHandle) + + JUCE_DECLARE_WEAK_REFERENCEABLE (AccessibilityNativeHandle) }; std::unordered_map AccessibilityNativeHandle::virtualViewIdMap; @@ -758,67 +844,6 @@ AccessibilityNativeHandle* AccessibilityHandler::getNativeImplementation() const return nativeImpl.get(); } -static bool areAnyAccessibilityClientsActive() -{ - auto* env = getEnv(); - auto appContext = getAppContext(); - - if (appContext.get() != nullptr) - { - LocalRef accessibilityManager (env->CallObjectMethod (appContext.get(), AndroidContext.getSystemService, - javaString ("accessibility").get())); - - if (accessibilityManager != nullptr) - return env->CallBooleanMethod (accessibilityManager.get(), AndroidAccessibilityManager.isEnabled); - } - - return false; -} - -void sendAccessibilityEventImpl (const AccessibilityHandler& handler, int eventType, int contentChangeTypes) -{ - if (! areAnyAccessibilityClientsActive()) - return; - - if (const auto sourceView = getSourceView (handler)) - { - const auto* nativeImpl = handler.getNativeImplementation(); - - if (nativeImpl == nullptr || nativeImpl->isInPopulateNodeInfo()) - return; - - auto* env = getEnv(); - auto appContext = getAppContext(); - - if (appContext.get() == nullptr) - return; - - LocalRef event (env->CallStaticObjectMethod (AndroidAccessibilityEvent, - AndroidAccessibilityEvent.obtain, - eventType)); - - env->CallVoidMethod (event, - AndroidAccessibilityEvent.setPackageName, - env->CallObjectMethod (appContext.get(), - AndroidContext.getPackageName)); - - env->CallVoidMethod (event, - AndroidAccessibilityEvent.setSource, - sourceView, - nativeImpl->getVirtualViewId()); - - if (contentChangeTypes != 0 && accessibilityEventSetContentChangeTypes != nullptr) - env->CallVoidMethod (event, - accessibilityEventSetContentChangeTypes, - contentChangeTypes); - - env->CallBooleanMethod (sourceView, - AndroidViewGroup.requestSendAccessibilityEvent, - sourceView, - event.get()); - } -} - void notifyAccessibilityEventInternal (const AccessibilityHandler& handler, InternalAccessibilityEvent eventType) { @@ -827,7 +852,7 @@ void notifyAccessibilityEventInternal (const AccessibilityHandler& handler, || eventType == InternalAccessibilityEvent::elementMovedOrResized) { if (auto* parent = handler.getParent()) - sendAccessibilityEventImpl (*parent, TYPE_WINDOW_CONTENT_CHANGED, CONTENT_CHANGE_TYPE_SUBTREE); + AccessibilityNativeHandle::sendAccessibilityEventImpl (*parent, TYPE_WINDOW_CONTENT_CHANGED, CONTENT_CHANGE_TYPE_SUBTREE); return; } @@ -852,7 +877,7 @@ void notifyAccessibilityEventInternal (const AccessibilityHandler& handler, }(); if (notification != 0) - sendAccessibilityEventImpl (handler, notification, 0); + AccessibilityNativeHandle::sendAccessibilityEventImpl (handler, notification, 0); } void AccessibilityHandler::notifyAccessibilityEvent (AccessibilityEvent eventType) const @@ -885,13 +910,13 @@ void AccessibilityHandler::notifyAccessibilityEvent (AccessibilityEvent eventTyp return 0; }(); - sendAccessibilityEventImpl (*this, notification, contentChangeTypes); + AccessibilityNativeHandle::sendAccessibilityEventImpl (*this, notification, contentChangeTypes); } void AccessibilityHandler::postAnnouncement (const String& announcementString, AnnouncementPriority) { - if (! areAnyAccessibilityClientsActive()) + if (! AccessibilityNativeHandle::areAnyAccessibilityClientsActive()) return; const auto rootView = [] diff --git a/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm b/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm index 3efbc9dc..e1a5d1d1 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -41,31 +41,6 @@ namespace juce #define JUCE_IOS_CONTAINER_API_AVAILABLE 1 #endif -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") - -constexpr auto juceUIAccessibilityContainerTypeNone = - #if JUCE_IOS_CONTAINER_API_AVAILABLE - UIAccessibilityContainerTypeNone; - #else - 0; - #endif - -constexpr auto juceUIAccessibilityContainerTypeDataTable = - #if JUCE_IOS_CONTAINER_API_AVAILABLE - UIAccessibilityContainerTypeDataTable; - #else - 1; - #endif - -constexpr auto juceUIAccessibilityContainerTypeList = - #if JUCE_IOS_CONTAINER_API_AVAILABLE - UIAccessibilityContainerTypeList; - #else - 2; - #endif - -JUCE_END_IGNORE_WARNINGS_GCC_LIKE - #define JUCE_NATIVE_ACCESSIBILITY_INCLUDED 1 //============================================================================== @@ -164,7 +139,12 @@ private: if (auto* handler = getHandler (self)) { if (handler->getTableInterface() != nullptr) - return juceUIAccessibilityContainerTypeDataTable; + { + if (@available (iOS 11.0, *)) + return UIAccessibilityContainerTypeDataTable; + + return 1; // UIAccessibilityContainerTypeDataTable + } const auto role = handler->getRole(); @@ -172,11 +152,17 @@ private: || role == AccessibilityRole::list || role == AccessibilityRole::tree) { - return juceUIAccessibilityContainerTypeList; + if (@available (iOS 11.0, *)) + return UIAccessibilityContainerTypeList; + + return 2; // UIAccessibilityContainerTypeList } } - return juceUIAccessibilityContainerTypeNone; + if (@available (iOS 11.0, *)) + return UIAccessibilityContainerTypeNone; + + return 0; // UIAccessibilityContainerTypeNone } }; diff --git a/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm b/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm index 6e3bfafd..bf3c38c9 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,6 +23,7 @@ ============================================================================== */ +API_AVAILABLE (macos (10.10)) static void juceFreeAccessibilityPlatformSpecificData (NSAccessibilityElement*) {} namespace juce @@ -35,16 +36,17 @@ namespace juce #define JUCE_NATIVE_ACCESSIBILITY_INCLUDED 1 -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") - //============================================================================== class AccessibilityHandler::AccessibilityNativeImpl { public: explicit AccessibilityNativeImpl (AccessibilityHandler& handler) - : accessibilityElement (AccessibilityElement::create (handler)) - {} + { + if (@available (macOS 10.10, *)) + accessibilityElement = AccessibilityElement::create (handler); + } + API_AVAILABLE (macos (10.10)) NSAccessibilityElement* getAccessibilityElement() const noexcept { return accessibilityElement.get(); @@ -52,7 +54,7 @@ public: private: //============================================================================== - class AccessibilityElement : public AccessibleObjCClass> + class API_AVAILABLE (macos (10.10)) AccessibilityElement : public AccessibleObjCClass> { public: static Holder create (AccessibilityHandler& handler) @@ -278,7 +280,7 @@ private: if (auto* handler = getHandler (self)) { if (handler->getCurrentState().isCheckable()) - return handler->getCurrentState().isChecked() ? @(1) : @(0); + return juceStringToNS (handler->getCurrentState().isChecked() ? TRANS ("On") : TRANS ("Off")); return getAccessibilityValueFromInterfaces (*handler); } @@ -830,6 +832,7 @@ private: }; //============================================================================== + API_AVAILABLE (macos (10.10)) AccessibilityElement::Holder accessibilityElement; //============================================================================== @@ -839,7 +842,10 @@ private: //============================================================================== AccessibilityNativeHandle* AccessibilityHandler::getNativeImplementation() const { - return (AccessibilityNativeHandle*) nativeImpl->getAccessibilityElement(); + if (@available (macOS 10.10, *)) + return (AccessibilityNativeHandle*) nativeImpl->getAccessibilityElement(); + + return nullptr; } static bool areAnyAccessibilityClientsActive() @@ -873,12 +879,15 @@ static void sendHandlerNotification (const AccessibilityHandler& handler, if (! areAnyAccessibilityClientsActive() || notification == NSAccessibilityNotificationName{}) return; - if (id accessibilityElement = (id) handler.getNativeImplementation()) + if (@available (macOS 10.9, *)) { - sendAccessibilityEvent (accessibilityElement, notification, - (notification == NSAccessibilityLayoutChangedNotification - ? @{ NSAccessibilityUIElementsKey: @[ accessibilityElement ] } - : nil)); + if (id accessibilityElement = (id) handler.getNativeImplementation()) + { + sendAccessibilityEvent (accessibilityElement, notification, + (notification == NSAccessibilityLayoutChangedNotification + ? @{ NSAccessibilityUIElementsKey: @[ accessibilityElement ] } + : nil)); + } } } @@ -937,10 +946,13 @@ void AccessibilityHandler::postAnnouncement (const String& announcementString, A if (! areAnyAccessibilityClientsActive()) return; - if (@available (macOS 10.10, *)) - { + if (@available (macOS 10.9, *)) + { auto nsPriority = [priority] { + // The below doesn't get noticed by the @available check above + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability") + switch (priority) { case AnnouncementPriority::low: return NSAccessibilityPriorityLow; @@ -950,6 +962,8 @@ void AccessibilityHandler::postAnnouncement (const String& announcementString, A jassertfalse; return NSAccessibilityPriorityLow; + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE }(); sendAccessibilityEvent ((id) [NSApp mainWindow], @@ -959,6 +973,4 @@ void AccessibilityHandler::postAnnouncement (const String& announcementString, A } } -JUCE_END_IGNORE_WARNINGS_GCC_LIKE - } // namespace juce diff --git a/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm b/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm index 15e79845..6eb5b692 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp b/modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp index 78d521eb..9be3ac5e 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -206,10 +206,14 @@ void AccessibilityHandler::notifyAccessibilityEvent (AccessibilityEvent eventTyp { if (auto* valueInterface = getValueInterface()) { - VARIANT newValue; - VariantHelpers::setString (valueInterface->getCurrentValueAsString(), &newValue); + const auto propertyType = getRole() == AccessibilityRole::slider ? UIA_RangeValueValuePropertyId + : UIA_ValueValuePropertyId; - sendAccessibilityPropertyChangedEvent (*this, UIA_ValueValuePropertyId, newValue); + const auto value = getRole() == AccessibilityRole::slider + ? VariantHelpers::getWithValue (valueInterface->getCurrentValue()) + : VariantHelpers::getWithValue (valueInterface->getCurrentValueAsString()); + + sendAccessibilityPropertyChangedEvent (*this, propertyType, value); } return; @@ -284,12 +288,12 @@ void AccessibilityHandler::postAnnouncement (const String& announcementString, A //============================================================================== namespace WindowsAccessibility { - long getUiaRootObjectId() + static long getUiaRootObjectId() { return static_cast (UiaRootObjectId); } - bool handleWmGetObject (AccessibilityHandler* handler, WPARAM wParam, LPARAM lParam, LRESULT* res) + static bool handleWmGetObject (AccessibilityHandler* handler, WPARAM wParam, LPARAM lParam, LRESULT* res) { if (isStartingUpOrShuttingDown() || (handler == nullptr || ! isHandlerValid (*handler))) return false; @@ -308,7 +312,7 @@ namespace WindowsAccessibility return false; } - void revokeUIAMapEntriesForWindow (HWND hwnd) + static void revokeUIAMapEntriesForWindow (HWND hwnd) { if (auto* uiaWrapper = WindowsUIAWrapper::getInstanceWithoutCreating()) uiaWrapper->returnRawElementProvider (hwnd, 0, 0, nullptr); diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp b/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp index 816f998f..de17aae6 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h b/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h index 83d85876..a00e6bad 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h b/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h index 6af77ae0..b03fe8cd 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h index 86613cc2..de1772f0 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h index c63f4d9e..251a3c5a 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h index cc10e6f8..6359f74b 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h index 6538ca37..a8769b3c 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAHelpers.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -28,6 +28,17 @@ namespace juce namespace VariantHelpers { + namespace Detail + { + template + inline VARIANT getWithValueGeneric (Fn&& setter, ValueType value) + { + VARIANT result{}; + setter (value, &result); + return result; + } + } + inline void clear (VARIANT* variant) { variant->vt = VT_EMPTY; @@ -56,6 +67,9 @@ namespace VariantHelpers variant->vt = VT_R8; variant->dblVal = value; } + + inline VARIANT getWithValue (double value) { return Detail::getWithValueGeneric (&setDouble, value); } + inline VARIANT getWithValue (const String& value) { return Detail::getWithValueGeneric (&setString, value); } } inline JUCE_COMRESULT addHandlersToArray (const std::vector& handlers, SAFEARRAY** pRetVal) diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h index fcdf2a21..e991abb6 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h index e9294ee7..35bfe1a3 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviderBase.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h index 84e266f3..06bede9d 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAProviders.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h index 4636048f..4b0c743a 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h index 3cc1f86d..dc0427a8 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h index 9111e306..7a6224c8 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -246,17 +246,22 @@ private: if (auto* textInterface = owner->getHandler().getTextInterface()) { - const auto boundaryType = getBoundaryType (unit); - - const auto start = AccessibilityTextHelpers::findTextBoundary (*textInterface, - selectionRange.getStart(), - boundaryType, - AccessibilityTextHelpers::Direction::backwards); + using ATH = AccessibilityTextHelpers; - const auto end = AccessibilityTextHelpers::findTextBoundary (*textInterface, - start, - boundaryType, - AccessibilityTextHelpers::Direction::forwards); + const auto boundaryType = getBoundaryType (unit); + const auto start = ATH::findTextBoundary (*textInterface, + selectionRange.getStart(), + boundaryType, + ATH::Direction::backwards, + ATH::IncludeThisBoundary::yes, + ATH::IncludeWhitespaceAfterWords::no); + + const auto end = ATH::findTextBoundary (*textInterface, + start, + boundaryType, + ATH::Direction::forwards, + ATH::IncludeThisBoundary::no, + ATH::IncludeWhitespaceAfterWords::yes); selectionRange = Range (start, end); @@ -411,19 +416,39 @@ private: JUCE_COMRESULT Move (ComTypes::TextUnit unit, int count, int* pRetVal) override { - return owner->withTextInterface (pRetVal, [&] (const AccessibilityTextInterface&) + return owner->withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface) { - if (count > 0) - { - MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_End, unit, count, pRetVal); - MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_Start, unit, count, pRetVal); - } - else if (count < 0) + using ATH = AccessibilityTextHelpers; + + const auto boundaryType = getBoundaryType (unit); + const auto previousUnitBoundary = ATH::findTextBoundary (textInterface, + selectionRange.getStart(), + boundaryType, + ATH::Direction::backwards, + ATH::IncludeThisBoundary::yes, + ATH::IncludeWhitespaceAfterWords::no); + + auto numMoved = 0; + auto movedEndpoint = previousUnitBoundary; + + for (; numMoved < std::abs (count); ++numMoved) { - MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_Start, unit, count, pRetVal); - MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_End, unit, count, pRetVal); + const auto nextEndpoint = ATH::findTextBoundary (textInterface, + movedEndpoint, + boundaryType, + count > 0 ? ATH::Direction::forwards : ATH::Direction::backwards, + ATH::IncludeThisBoundary::no, + count > 0 ? ATH::IncludeWhitespaceAfterWords::yes : ATH::IncludeWhitespaceAfterWords::no); + + if (nextEndpoint == movedEndpoint) + break; + + movedEndpoint = nextEndpoint; } + *pRetVal = numMoved; + + ExpandToEnclosingUnit (unit); return S_OK; }); } @@ -461,34 +486,37 @@ private: if (count == 0 || textInterface.getTotalNumCharacters() == 0) return S_OK; - auto endpointToMove = (endpoint == ComTypes::TextPatternRangeEndpoint_Start ? selectionRange.getStart() - : selectionRange.getEnd()); + const auto endpointToMove = (endpoint == ComTypes::TextPatternRangeEndpoint_Start ? selectionRange.getStart() + : selectionRange.getEnd()); - const auto direction = (count > 0 ? AccessibilityTextHelpers::Direction::forwards - : AccessibilityTextHelpers::Direction::backwards); + using ATH = AccessibilityTextHelpers; - const auto boundaryType = getBoundaryType (unit); + const auto direction = (count > 0 ? ATH::Direction::forwards + : ATH::Direction::backwards); - // handle case where endpoint is on a boundary - if (AccessibilityTextHelpers::findTextBoundary (textInterface, endpointToMove, boundaryType, direction) == endpointToMove) - endpointToMove += (direction == AccessibilityTextHelpers::Direction::forwards ? 1 : -1); + const auto boundaryType = getBoundaryType (unit); + auto movedEndpoint = endpointToMove; - int numMoved; - for (numMoved = 0; numMoved < std::abs (count); ++numMoved) + int numMoved = 0; + for (; numMoved < std::abs (count); ++numMoved) { - auto nextEndpoint = AccessibilityTextHelpers::findTextBoundary (textInterface, - endpointToMove, - boundaryType, - direction); - - if (nextEndpoint == endpointToMove) + auto nextEndpoint = ATH::findTextBoundary (textInterface, + movedEndpoint, + boundaryType, + direction, + ATH::IncludeThisBoundary::no, + direction == ATH::Direction::forwards ? ATH::IncludeWhitespaceAfterWords::yes + : ATH::IncludeWhitespaceAfterWords::no); + + if (nextEndpoint == movedEndpoint) break; - endpointToMove = nextEndpoint; + movedEndpoint = nextEndpoint; } *pRetVal = numMoved; - setEndpointChecked (endpoint, endpointToMove); + + setEndpointChecked (endpoint, movedEndpoint); return S_OK; }); diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h index 8283a193..07263159 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h index 2e1194db..4ecdecfe 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h index 32702e69..09559570 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h index 71bf8e7f..d3abd8cd 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h b/modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h index beaf8f1f..9b7cf878 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java b/modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java index c31ad585..fc0371a9 100644 --- a/modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java +++ b/modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderCursor.java b/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderCursor.java index 5cae807f..56ba7172 100644 --- a/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderCursor.java +++ b/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderCursor.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java b/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java index 50241255..a89dc646 100644 --- a/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java +++ b/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceActivity.java b/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceActivity.java index f62ff4d6..0d5f75d4 100644 --- a/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceActivity.java +++ b/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceActivity.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -33,6 +33,7 @@ public class JuceActivity extends Activity { //============================================================================== private native void appNewIntent (Intent intent); + private native void appOnResume(); @Override protected void onNewIntent (Intent intent) @@ -42,4 +43,12 @@ public class JuceActivity extends Activity appNewIntent (intent); } + + @Override + protected void onResume() + { + super.onResume(); + + appOnResume(); + } } diff --git a/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceSharingContentProvider.java b/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceSharingContentProvider.java index 15f62b14..c6832949 100644 --- a/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceSharingContentProvider.java +++ b/modules/juce_gui_basics/native/javaopt/app/com/rmsl/juce/JuceSharingContentProvider.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/juce_MultiTouchMapper.h b/modules/juce_gui_basics/native/juce_MultiTouchMapper.h index d6e1493c..e5502096 100644 --- a/modules/juce_gui_basics/native/juce_MultiTouchMapper.h +++ b/modules/juce_gui_basics/native/juce_MultiTouchMapper.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h b/modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h index d3c88930..af607a5b 100644 --- a/modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h +++ b/modules/juce_gui_basics/native/juce_ScopedDPIAwarenessDisabler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/juce_android_ContentSharer.cpp b/modules/juce_gui_basics/native/juce_android_ContentSharer.cpp index 57c86d0e..ba3f3376 100644 --- a/modules/juce_gui_basics/native/juce_android_ContentSharer.cpp +++ b/modules/juce_gui_basics/native/juce_android_ContentSharer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -337,7 +337,7 @@ private: canSpecifyMimeTypes = fileExtension.isNotEmpty(); if (canSpecifyMimeTypes) - mimeTypes.addArray (getMimeTypesForFileExtension (fileExtension)); + mimeTypes.addArray (MimeTypeTable::getMimeTypesForFileExtension (fileExtension)); else mimeTypes.clear(); @@ -597,8 +597,8 @@ public: if (extension.isEmpty()) return nullptr; - return juceStringArrayToJava (filterMimeTypes (getMimeTypesForFileExtension (extension), - juceString (mimeTypeFilter.get()))); + return juceStringArrayToJava (filterMimeTypes (MimeTypeTable::getMimeTypesForFileExtension (extension), + juceString (mimeTypeFilter.get()))); } void sharingFinished (int resultCode) diff --git a/modules/juce_gui_basics/native/juce_android_FileChooser.cpp b/modules/juce_gui_basics/native/juce_android_FileChooser.cpp index b354224e..53c2456e 100644 --- a/modules/juce_gui_basics/native/juce_android_FileChooser.cpp +++ b/modules/juce_gui_basics/native/juce_android_FileChooser.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,19 @@ namespace juce { +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getItemCount, "getItemCount", "()I") \ + METHOD (getItemAt, "getItemAt", "(I)Landroid/content/ClipData$Item;") + +DECLARE_JNI_CLASS (ClipData, "android/content/ClipData") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getUri, "getUri", "()Landroid/net/Uri;") + +DECLARE_JNI_CLASS (ClipDataItem, "android/content/ClipData$Item") +#undef JNI_CLASS_MEMBERS + class FileChooser::Native : public FileChooser::Pimpl { public: @@ -40,6 +53,7 @@ public: auto sdkVersion = getAndroidSDKVersion(); auto saveMode = ((flags & FileBrowserComponent::saveMode) != 0); auto selectsDirectories = ((flags & FileBrowserComponent::canSelectDirectories) != 0); + auto canSelectMultiple = ((flags & FileBrowserComponent::canSelectMultipleItems) != 0); // You cannot save a directory jassert (! (saveMode && selectsDirectories)); @@ -85,6 +99,13 @@ public: uri.get()); } + if (canSelectMultiple && sdkVersion >= 18) + { + env->CallObjectMethod (intent.get(), + AndroidIntent.putExtraBool, + javaString ("android.intent.extra.ALLOW_MULTIPLE").get(), + true); + } if (! selectsDirectories) { @@ -169,22 +190,41 @@ public: currentFileChooser = nullptr; auto* env = getEnv(); - Array chosenURLs; - - if (resultCode == /*Activity.RESULT_OK*/ -1 && intentData != nullptr) + const auto getUrls = [&]() -> Array { - LocalRef uri (env->CallObjectMethod (intentData.get(), AndroidIntent.getData)); + if (resultCode != /*Activity.RESULT_OK*/ -1 || intentData == nullptr) + return {}; - if (uri != nullptr) - { - auto jStr = (jstring) env->CallObjectMethod (uri, JavaObject.toString); + Array chosenURLs; - if (jStr != nullptr) + const auto addUrl = [env, &chosenURLs] (jobject uri) + { + if (auto jStr = (jstring) env->CallObjectMethod (uri, JavaObject.toString)) chosenURLs.add (URL (juceString (env, jStr))); + }; + + if (LocalRef clipData { env->CallObjectMethod (intentData.get(), AndroidIntent.getClipData) }) + { + const auto count = env->CallIntMethod (clipData.get(), ClipData.getItemCount); + + for (auto i = 0; i < count; ++i) + { + if (LocalRef item { env->CallObjectMethod (clipData.get(), ClipData.getItemAt, i) }) + { + if (LocalRef itemUri { env->CallObjectMethod (item.get(), ClipDataItem.getUri) }) + addUrl (itemUri.get()); + } + } } - } + else if (LocalRef uri { env->CallObjectMethod (intentData.get(), AndroidIntent.getData )}) + { + addUrl (uri.get()); + } + + return chosenURLs; + }; - owner.finished (chosenURLs); + owner.finished (getUrls()); } static Native* currentFileChooser; @@ -200,7 +240,7 @@ public: { auto extension = wildcard.fromLastOccurrenceOf (".", false, false); - result.addArray (getMimeTypesForFileExtension (extension)); + result.addArray (MimeTypeTable::getMimeTypesForFileExtension (extension)); } } diff --git a/modules/juce_gui_basics/native/juce_android_Windowing.cpp b/modules/juce_gui_basics/native/juce_android_Windowing.cpp index 7609d018..718effc4 100644 --- a/modules/juce_gui_basics/native/juce_android_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_android_Windowing.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -126,12 +126,18 @@ static const uint8 javaComponentPeerView[] = //============================================================================== #if JUCE_PUSH_NOTIFICATIONS && JUCE_MODULE_AVAILABLE_juce_gui_extra - extern bool juce_handleNotificationIntent (void*); - extern void juce_firebaseDeviceNotificationsTokenRefreshed (void*); - extern void juce_firebaseRemoteNotificationReceived (void*); - extern void juce_firebaseRemoteMessagesDeleted(); - extern void juce_firebaseRemoteMessageSent(void*); - extern void juce_firebaseRemoteMessageSendError (void*, void*); + bool juce_handleNotificationIntent (void*); + void juce_firebaseDeviceNotificationsTokenRefreshed (void*); + void juce_firebaseRemoteNotificationReceived (void*); + void juce_firebaseRemoteMessagesDeleted(); + void juce_firebaseRemoteMessageSent(void*); + void juce_firebaseRemoteMessageSendError (void*, void*); +#endif + +#if JUCE_IN_APP_PURCHASES && JUCE_MODULE_AVAILABLE_juce_product_unlocking + void juce_handleOnResume(); +#else + static void juce_handleOnResume() {} #endif //============================================================================== @@ -750,11 +756,11 @@ public: { case ACTION_HOVER_ENTER: case ACTION_HOVER_MOVE: - sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_ENTER, 0); + AccessibilityNativeHandle::sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_ENTER, 0); break; case ACTION_HOVER_EXIT: - sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_EXIT, 0); + AccessibilityNativeHandle::sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_EXIT, 0); break; } } @@ -936,11 +942,13 @@ public: void dismissPendingTextInput() override { + closeInputMethodContext(); + view.callVoidMethod (ComponentPeerView.showKeyboard, javaString ("").get()); if (! isTimerRunning()) startTimer (500); - } + } //============================================================================== void handlePaintCallback (jobject canvas, jobject paint) @@ -2091,7 +2099,8 @@ const int KeyPress::rewindKey = extendedKeyModifier + 72; struct JuceActivityNewIntentListener { #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - CALLBACK (appNewIntent, "appNewIntent", "(Landroid/content/Intent;)V") + CALLBACK (appNewIntent, "appNewIntent", "(Landroid/content/Intent;)V") \ + CALLBACK (appOnResume, "appOnResume", "()V") DECLARE_JNI_CLASS (JavaActivity, JUCE_PUSH_NOTIFICATIONS_ACTIVITY) #undef JNI_CLASS_MEMBERS @@ -2100,6 +2109,11 @@ const int KeyPress::rewindKey = extendedKeyModifier + 72; { juce_handleNotificationIntent (static_cast (intentData)); } + + static void JNICALL appOnResume (JNIEnv*, jobject) + { + juce_handleOnResume(); + } }; JuceActivityNewIntentListener::JavaActivity_Class JuceActivityNewIntentListener::JavaActivity; diff --git a/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp b/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp index 3747121e..f15365b6 100644 --- a/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp +++ b/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/juce_ios_FileChooser.mm b/modules/juce_gui_basics/native/juce_ios_FileChooser.mm index f3b50115..5da0b68e 100644 --- a/modules/juce_gui_basics/native/juce_ios_FileChooser.mm +++ b/modules/juce_gui_basics/native/juce_ios_FileChooser.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm index 5f7ffdf4..3a622646 100644 --- a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,6 +23,13 @@ ============================================================================== */ +#include "juce_mac_CGMetalLayerRenderer.h" + +#if TARGET_OS_SIMULATOR && JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS + #warning JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS uses parts of the Metal API that are currently unsupported in the simulator - falling back to JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS=0 + #undef JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS +#endif + #if defined (__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 #define JUCE_HAS_IOS_POINTER_SUPPORT 1 #else @@ -112,16 +119,30 @@ enum class MouseEventFlags using namespace juce; +struct CADisplayLinkDeleter +{ + void operator() (CADisplayLink* displayLink) const noexcept + { + [displayLink invalidate]; + [displayLink release]; + } +}; + @interface JuceUIView : UIView { @public UIViewComponentPeer* owner; UITextView* hiddenTextView; + std::unique_ptr displayLink; } - (JuceUIView*) initWithOwner: (UIViewComponentPeer*) owner withFrame: (CGRect) frame; - (void) dealloc; ++ (Class) layerClass; + +- (void) displayLinkCallback: (CADisplayLink*) dl; + - (void) drawRect: (CGRect) r; - (void) touchesBegan: (NSSet*) touches withEvent: (UIEvent*) event; @@ -192,8 +213,7 @@ struct UIViewPeerControllerReceiver }; class UIViewComponentPeer : public ComponentPeer, - public FocusChangeListener, - public UIViewPeerControllerReceiver + private UIViewPeerControllerReceiver { public: UIViewComponentPeer (Component&, int windowStyleFlags, UIView* viewToAttachTo); @@ -231,7 +251,10 @@ public: void setIcon (const Image& newIcon) override; StringArray getAvailableRenderingEngines() override { return StringArray ("CoreGraphics Renderer"); } + void displayLinkCallback(); + void drawRect (CGRect); + void drawRectWithContext (CGContextRef, CGRect); bool canBecomeKeyWindow(); //============================================================================== @@ -240,10 +263,10 @@ public: bool isFocused() const override; void grabFocus() override; void textInputRequired (Point, TextInputTarget&) override; + void dismissPendingTextInput() override; BOOL textViewReplaceCharacters (Range, const String&); - void updateHiddenTextContent (TextInputTarget*); - void globalFocusChanged (Component*) override; + void updateHiddenTextContent (TextInputTarget&); void updateScreenBounds(); @@ -308,6 +331,9 @@ private: } }; + std::unique_ptr metalRenderer; + RectangleList deferredRepaints; + //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UIViewComponentPeer) }; @@ -460,6 +486,11 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; [super initWithFrame: frame]; owner = peer; + displayLink.reset ([CADisplayLink displayLinkWithTarget: self + selector: @selector (displayLinkCallback:)]); + [displayLink.get() addToRunLoop: [NSRunLoop mainRunLoop] + forMode: NSDefaultRunLoopMode]; + hiddenTextView = [[UITextView alloc] initWithFrame: CGRectZero]; [self addSubview: hiddenTextView]; hiddenTextView.delegate = self; @@ -494,9 +525,28 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; [hiddenTextView removeFromSuperview]; [hiddenTextView release]; + displayLink = nullptr; + [super dealloc]; } +//============================================================================== ++ (Class) layerClass +{ + #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS + if (@available (iOS 12, *)) + return [CAMetalLayer class]; + #endif + + return [CALayer class]; +} + +- (void) displayLinkCallback: (CADisplayLink*) dl +{ + if (owner != nullptr) + owner->displayLinkCallback(); +} + //============================================================================== - (void) drawRect: (CGRect) r { @@ -666,11 +716,14 @@ UIViewComponentPeer::UIViewComponentPeer (Component& comp, int windowStyleFlags, view.opaque = component.isOpaque(); view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent: 0]; - #if JUCE_COREGRAPHICS_DRAW_ASYNC - if (! getComponentAsyncLayerBackedViewDisabled (component)) - [[view layer] setDrawsAsynchronously: YES]; + #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS + if (@available (iOS 12, *)) + metalRenderer = std::make_unique ((CAMetalLayer*) view.layer, comp); #endif + if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0) + [[view layer] setDrawsAsynchronously: YES]; + if (isSharedWindow) { window = [viewToAttachTo window]; @@ -700,8 +753,6 @@ UIViewComponentPeer::UIViewComponentPeer (Component& comp, int windowStyleFlags, setTitle (component.getName()); setVisible (component.isVisible()); - - Desktop::getInstance().addFocusChangeListener (this); } static UIViewComponentPeer* currentlyFocusedPeer = nullptr; @@ -712,7 +763,6 @@ UIViewComponentPeer::~UIViewComponentPeer() currentlyFocusedPeer = nullptr; currentTouches.deleteAllTouchesForPeer (this); - Desktop::getInstance().removeFocusChangeListener (this); view->owner = nullptr; [view removeFromSuperview]; @@ -1076,8 +1126,18 @@ void UIViewComponentPeer::grabFocus() } } -void UIViewComponentPeer::textInputRequired (Point, TextInputTarget&) +void UIViewComponentPeer::textInputRequired (Point pos, TextInputTarget& target) { + view->hiddenTextView.frame = CGRectMake (pos.x, pos.y, 0, 0); + + updateHiddenTextContent (target); + [view->hiddenTextView becomeFirstResponder]; +} + +void UIViewComponentPeer::dismissPendingTextInput() +{ + closeInputMethodContext(); + [view->hiddenTextView resignFirstResponder]; } static UIKeyboardType getUIKeyboardType (TextInputTarget::VirtualKeyboardType type) noexcept @@ -1096,11 +1156,11 @@ static UIKeyboardType getUIKeyboardType (TextInputTarget::VirtualKeyboardType ty return UIKeyboardTypeDefault; } -void UIViewComponentPeer::updateHiddenTextContent (TextInputTarget* target) +void UIViewComponentPeer::updateHiddenTextContent (TextInputTarget& target) { - view->hiddenTextView.keyboardType = getUIKeyboardType (target->getKeyboardType()); - view->hiddenTextView.text = juceStringToNS (target->getTextInRange (Range (0, target->getHighlightedRegion().getStart()))); - view->hiddenTextView.selectedRange = NSMakeRange ((NSUInteger) target->getHighlightedRegion().getStart(), 0); + view->hiddenTextView.keyboardType = getUIKeyboardType (target.getKeyboardType()); + view->hiddenTextView.text = juceStringToNS (target.getTextInRange (Range (0, target.getHighlightedRegion().getStart()))); + view->hiddenTextView.selectedRange = NSMakeRange ((NSUInteger) target.getHighlightedRegion().getStart(), 0); } BOOL UIViewComponentPeer::textViewReplaceCharacters (Range range, const String& text) @@ -1121,29 +1181,49 @@ BOOL UIViewComponentPeer::textViewReplaceCharacters (Range range, const Str target->insertTextAtCaret (text); if (deletionChecker != nullptr) - updateHiddenTextContent (target); + updateHiddenTextContent (*target); } return NO; } -void UIViewComponentPeer::globalFocusChanged (Component*) +//============================================================================== +void UIViewComponentPeer::displayLinkCallback() { - if (auto* target = findCurrentTextInputTarget()) + if (deferredRepaints.isEmpty()) + return; + + auto dispatchRectangles = [this] () { - if (auto* comp = dynamic_cast (target)) + // We shouldn't need this preprocessor guard, but when running in the simulator + // CAMetalLayer is flagged as requiring iOS 13 + #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS + if (metalRenderer != nullptr) { - auto pos = component.getLocalPoint (comp, Point()); - view->hiddenTextView.frame = CGRectMake (pos.x, pos.y, 0, 0); + if (@available (iOS 12, *)) + { + return metalRenderer->drawRectangleList ((CAMetalLayer*) view.layer, + (float) view.contentScaleFactor, + view.frame, + component, + [this] (CGContextRef ctx, CGRect r) { drawRectWithContext (ctx, r); }, + deferredRepaints); + } - updateHiddenTextContent (target); - [view->hiddenTextView becomeFirstResponder]; + // The creation of metalRenderer should already be guarded with @available (iOS 12, *). + jassertfalse; + return false; } - } - else - { - [view->hiddenTextView resignFirstResponder]; - } + #endif + + for (const auto& r : deferredRepaints) + [view setNeedsDisplayInRect: convertToCGRect (r)]; + + return true; + }; + + if (dispatchRectangles()) + deferredRepaints.clear(); } //============================================================================== @@ -1152,8 +1232,11 @@ void UIViewComponentPeer::drawRect (CGRect r) if (r.size.width < 1.0f || r.size.height < 1.0f) return; - CGContextRef cg = UIGraphicsGetCurrentContext(); + drawRectWithContext (UIGraphicsGetCurrentContext(), r); +} +void UIViewComponentPeer::drawRectWithContext (CGContextRef cg, CGRect) +{ if (! component.isOpaque()) CGContextClearRect (cg, CGContextGetClipBoundingBox (cg)); @@ -1210,9 +1293,12 @@ void Desktop::allowedOrientationsChanged() void UIViewComponentPeer::repaint (const Rectangle& area) { if (insideDrawRect || ! MessageManager::getInstance()->isThisTheMessageThread()) + { (new AsyncRepaintMessage (this, area))->post(); - else - [view setNeedsDisplayInRect: convertToCGRect (area)]; + return; + } + + deferredRepaints.add (area.toFloat()); } void UIViewComponentPeer::performAnyPendingRepaintsNow() diff --git a/modules/juce_gui_basics/native/juce_ios_Windowing.mm b/modules/juce_gui_basics/native/juce_ios_Windowing.mm index bedbfc43..434b39e6 100644 --- a/modules/juce_gui_basics/native/juce_ios_Windowing.mm +++ b/modules/juce_gui_basics/native/juce_ios_Windowing.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp b/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp index 28350215..c12bc5f6 100644 --- a/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp +++ b/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/juce_linux_Windowing.cpp b/modules/juce_gui_basics/native/juce_linux_Windowing.cpp index 58cd7163..7eb7176e 100644 --- a/modules/juce_gui_basics/native/juce_linux_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_linux_Windowing.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -92,14 +92,8 @@ public: } //============================================================================== - void setBounds (const Rectangle& newBounds, bool isNowFullScreen) override + void forceSetBounds (const Rectangle& correctedNewBounds, bool isNowFullScreen) { - const auto correctedNewBounds = newBounds.withSize (jmax (1, newBounds.getWidth()), - jmax (1, newBounds.getHeight())); - - if (bounds == correctedNewBounds && fullScreen == isNowFullScreen) - return; - bounds = correctedNewBounds; updateScaleFactorFromNewBounds (bounds, false); @@ -120,6 +114,15 @@ public: } } + void setBounds (const Rectangle& newBounds, bool isNowFullScreen) override + { + const auto correctedNewBounds = newBounds.withSize (jmax (1, newBounds.getWidth()), + jmax (1, newBounds.getHeight())); + + if (bounds != correctedNewBounds || fullScreen != isNowFullScreen) + forceSetBounds (correctedNewBounds, isNowFullScreen); + } + Point getScreenPosition (bool physical) const { auto physicalParentPosition = XWindowSystem::getInstance()->getPhysicalParentScreenPosition(); @@ -154,12 +157,12 @@ public: Point localToGlobal (Point relativePosition) override { - return relativePosition + getScreenPosition (false).toFloat(); + return localToGlobal (*this, relativePosition); } Point globalToLocal (Point screenPosition) override { - return screenPosition - getScreenPosition (false).toFloat(); + return globalToLocal (*this, screenPosition); } using ComponentPeer::localToGlobal; @@ -238,8 +241,11 @@ public: if (! c->isVisible()) continue; - if (auto* peer = c->getPeer()) - if (peer->contains (localPos + bounds.getPosition() - peer->getBounds().getPosition(), true)) + auto* otherPeer = c->getPeer(); + jassert (otherPeer == nullptr || dynamic_cast (c->getPeer()) != nullptr); + + if (auto* peer = static_cast (otherPeer)) + if (peer->contains (globalToLocal (*peer, localToGlobal (*this, localPos.toFloat())).roundToInt(), true)) return false; } @@ -374,7 +380,13 @@ public: else if (! windowBorder || ((*windowBorder).getTopAndBottom() == 0 && (*windowBorder).getLeftAndRight() == 0)) { - windowBorder = XWindowSystem::getInstance()->getBorderSize (windowH); + windowBorder = [&]() + { + if (auto unscaledBorderSize = XWindowSystem::getInstance()->getBorderSize (windowH)) + return OptionalBorderSize { (*unscaledBorderSize).multipliedBy (1.0 / currentScaleFactor) }; + + return OptionalBorderSize {}; + }(); } } @@ -434,12 +446,31 @@ private: if (! totalArea.isEmpty()) { - if (image.isNull() || image.getWidth() < totalArea.getWidth() + const auto wasImageNull = image.isNull(); + + if (wasImageNull || image.getWidth() < totalArea.getWidth() || image.getHeight() < totalArea.getHeight()) { image = XWindowSystem::getInstance()->createImage (isSemiTransparentWindow, totalArea.getWidth(), totalArea.getHeight(), useARGBImagesForRendering); + if (wasImageNull) + { + // After calling createImage() XWindowSystem::getWindowBounds() will return + // changed coordinates that look like the result of some position + // defaulting mechanism. If we handle a configureNotifyEvent after + // createImage() and before we would issue new, valid coordinates, we will + // apply these default, unwanted coordinates to our window. To avoid that + // we immediately send another positioning message to guarantee that the + // next configureNotifyEvent will read valid values. + // + // This issue only occurs right after peer creation, when the image is + // null. Updating when only the width or height is changed would lead to + // incorrect behaviour. + peer.forceSetBounds (ScalingHelpers::scaledScreenPosToUnscaled (peer.component, + peer.component.getBoundsInParent()), + peer.isFullScreen()); + } } startTimer (repaintTimerPeriod); @@ -481,6 +512,19 @@ private: JUCE_DECLARE_NON_COPYABLE (LinuxRepaintManager) }; + //============================================================================== + template + static Point localToGlobal (This& t, Point relativePosition) + { + return relativePosition + t.getScreenPosition (false).toFloat(); + } + + template + static Point globalToLocal (This& t, Point screenPosition) + { + return screenPosition - t.getScreenPosition (false).toFloat(); + } + //============================================================================== void settingChanged (const XWindowSystemUtilities::XSetting& settingThatHasChanged) override { @@ -899,12 +943,14 @@ Image juce_createIconForFile (const File&) return {}; } +void juce_LinuxAddRepaintListener (ComponentPeer* peer, Component* dummy); void juce_LinuxAddRepaintListener (ComponentPeer* peer, Component* dummy) { if (auto* linuxPeer = dynamic_cast (peer)) linuxPeer->addOpenGLRepaintListener (dummy); } +void juce_LinuxRemoveRepaintListener (ComponentPeer* peer, Component* dummy); void juce_LinuxRemoveRepaintListener (ComponentPeer* peer, Component* dummy) { if (auto* linuxPeer = dynamic_cast (peer)) diff --git a/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h b/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h new file mode 100644 index 00000000..ba039295 --- /dev/null +++ b/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h @@ -0,0 +1,365 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +// The CoreGraphicsMetalLayerRenderer requires macOS 10.14 and iOS 12. +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") + +namespace juce +{ + +//============================================================================== +class CoreGraphicsMetalLayerRenderer +{ +public: + //============================================================================== + CoreGraphicsMetalLayerRenderer (CAMetalLayer* layer, const Component& comp) + { + device.reset (MTLCreateSystemDefaultDevice()); + + layer.device = device.get(); + layer.framebufferOnly = NO; + layer.pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB; + layer.opaque = comp.isOpaque(); + layer.allowsNextDrawableTimeout = NO; + + commandQueue.reset ([device.get() newCommandQueue]); + + memoryBlitEvent.reset ([device.get() newSharedEvent]); + } + + ~CoreGraphicsMetalLayerRenderer() + { + stopGpuCommandSubmission = true; + [memoryBlitCommandBuffer.get() waitUntilCompleted]; + } + + template + bool drawRectangleList (CAMetalLayer* layer, + float scaleFactor, + CGRect viewFrame, + const Component& comp, + Callback&& drawRectWithContext, + const RectangleList& dirtyRegions) + { + if (resources != nullptr) + { + // If we haven't finished blitting the CPU texture to the GPU then + // report that we have been unable to draw anything. + if (memoryBlitEvent.get().signaledValue != memoryBlitCounter + 1) + return false; + + ++memoryBlitCounter; + } + + layer.contentsScale = scaleFactor; + const auto drawableSizeTansform = CGAffineTransformMakeScale (layer.contentsScale, + layer.contentsScale); + const auto transformedFrameSize = CGSizeApplyAffineTransform (viewFrame.size, drawableSizeTansform); + + const auto componentHeight = comp.getHeight(); + + if (! CGSizeEqualToSize (layer.drawableSize, transformedFrameSize)) + { + layer.drawableSize = transformedFrameSize; + resources = std::make_unique (device.get(), layer, componentHeight); + } + + auto gpuTexture = resources->getGpuTexture(); + + if (gpuTexture == nullptr) + { + jassertfalse; + return false; + } + + auto cgContext = resources->getCGContext(); + + for (auto rect : dirtyRegions) + { + const auto cgRect = convertToCGRect (rect); + + CGContextSaveGState (cgContext); + + CGContextClipToRect (cgContext, cgRect); + drawRectWithContext (cgContext, cgRect); + + CGContextRestoreGState (cgContext); + } + + resources->signalBufferModifiedByCpu(); + + auto sharedTexture = resources->getSharedTexture(); + + memoryBlitCommandBuffer.reset ([commandQueue.get() commandBuffer]); + + // Command buffers are usually considered temporary, and are automatically released by + // the operating system when the rendering pipeline is finsihed. However, we want to keep + // this one alive so that we can wait for pipeline completion in the destructor. + [memoryBlitCommandBuffer.get() retain]; + + auto blitCommandEncoder = [memoryBlitCommandBuffer.get() blitCommandEncoder]; + [blitCommandEncoder copyFromTexture: sharedTexture + sourceSlice: 0 + sourceLevel: 0 + sourceOrigin: MTLOrigin{} + sourceSize: MTLSize { sharedTexture.width, sharedTexture.height, 1 } + toTexture: gpuTexture + destinationSlice: 0 + destinationLevel: 0 + destinationOrigin: MTLOrigin{}]; + [blitCommandEncoder endEncoding]; + + // Signal that the GPU has finished using the CPU texture + [memoryBlitCommandBuffer.get() encodeSignalEvent: memoryBlitEvent.get() + value: memoryBlitCounter + 1]; + + [memoryBlitCommandBuffer.get() addScheduledHandler: ^(id) + { + // We're on a Metal thread, so we can make a blocking nextDrawable call + // without stalling the message thread. + + // Check if we can do an early exit. + if (stopGpuCommandSubmission) + return; + + @autoreleasepool + { + id drawable = [layer nextDrawable]; + + id presentationCommandBuffer = [commandQueue.get() commandBuffer]; + + auto presentationBlitCommandEncoder = [presentationCommandBuffer blitCommandEncoder]; + [presentationBlitCommandEncoder copyFromTexture: gpuTexture + sourceSlice: 0 + sourceLevel: 0 + sourceOrigin: MTLOrigin{} + sourceSize: MTLSize { gpuTexture.width, gpuTexture.height, 1 } + toTexture: drawable.texture + destinationSlice: 0 + destinationLevel: 0 + destinationOrigin: MTLOrigin{}]; + [presentationBlitCommandEncoder endEncoding]; + + [presentationCommandBuffer addScheduledHandler: ^(id) + { + [drawable present]; + }]; + + [presentationCommandBuffer commit]; + } + }]; + + [memoryBlitCommandBuffer.get() commit]; + + return true; + } + +private: + //============================================================================== + static auto alignTo (size_t n, size_t alignment) + { + return ((n + alignment - 1) / alignment) * alignment; + } + + //============================================================================== + struct TextureDeleter + { + void operator() (id texture) const noexcept + { + [texture setPurgeableState: MTLPurgeableStateEmpty]; + [texture release]; + } + }; + + using TextureUniquePtr = std::unique_ptr>, TextureDeleter>; + + //============================================================================== + class GpuTexturePool + { + public: + GpuTexturePool (id metalDevice, MTLTextureDescriptor* descriptor) + { + for (auto& t : textureCache) + t.reset ([metalDevice newTextureWithDescriptor: descriptor]); + } + + id take() const + { + auto iter = std::find_if (textureCache.begin(), textureCache.end(), + [] (const TextureUniquePtr& t) { return [t.get() retainCount] == 1; }); + return iter == textureCache.end() ? nullptr : (*iter).get(); + } + + private: + std::array textureCache; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GpuTexturePool) + JUCE_DECLARE_NON_MOVEABLE (GpuTexturePool) + }; + + //============================================================================== + class Resources + { + public: + Resources (id metalDevice, CAMetalLayer* layer, int componentHeight) + { + const auto bytesPerRow = alignTo ((size_t) layer.drawableSize.width * 4, 256); + + const auto allocationSize = cpuRenderMemory.ensureSize (bytesPerRow * (size_t) layer.drawableSize.height); + + buffer.reset ([metalDevice newBufferWithBytesNoCopy: cpuRenderMemory.get() + length: allocationSize + options: + #if JUCE_MAC + MTLResourceStorageModeManaged + #else + MTLResourceStorageModeShared + #endif + deallocator: nullptr]); + + auto* textureDesc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat: layer.pixelFormat + width: (NSUInteger) layer.drawableSize.width + height: (NSUInteger) layer.drawableSize.height + mipmapped: NO]; + textureDesc.storageMode = + #if JUCE_MAC + MTLStorageModeManaged; + #else + MTLStorageModeShared; + #endif + textureDesc.usage = MTLTextureUsageShaderRead; + + sharedTexture.reset ([buffer.get() newTextureWithDescriptor: textureDesc + offset: 0 + bytesPerRow: bytesPerRow]); + + cgContext.reset (CGBitmapContextCreate (cpuRenderMemory.get(), + (size_t) layer.drawableSize.width, + (size_t) layer.drawableSize.height, + 8, // Bits per component + bytesPerRow, + CGColorSpaceCreateWithName (kCGColorSpaceSRGB), + (uint32_t) kCGImageAlphaPremultipliedFirst | (uint32_t) kCGBitmapByteOrder32Host)); + + CGContextScaleCTM (cgContext.get(), layer.contentsScale, layer.contentsScale); + CGContextConcatCTM (cgContext.get(), CGAffineTransformMake (1, 0, 0, -1, 0, componentHeight)); + + textureDesc.storageMode = MTLStorageModePrivate; + gpuTexturePool = std::make_unique (metalDevice, textureDesc); + } + + CGContextRef getCGContext() const noexcept { return cgContext.get(); } + id getSharedTexture() const noexcept { return sharedTexture.get(); } + id getGpuTexture() noexcept { return gpuTexturePool == nullptr ? nullptr : gpuTexturePool->take(); } + + void signalBufferModifiedByCpu() + { + #if JUCE_MAC + [buffer.get() didModifyRange: { 0, buffer.get().length }]; + #endif + } + + private: + class AlignedMemory + { + public: + AlignedMemory() = default; + + void* get() + { + return allocation != nullptr ? allocation->data : nullptr; + } + + size_t ensureSize (size_t newSize) + { + const auto alignedSize = alignTo (newSize, pagesize); + + if (alignedSize > size) + { + size = std::max (alignedSize, alignTo ((size_t) (size * growthFactor), pagesize)); + allocation = std::make_unique (pagesize, size); + } + + return size; + } + + private: + static constexpr float growthFactor = 1.3f; + + const size_t pagesize = (size_t) getpagesize(); + + struct AllocationWrapper + { + AllocationWrapper (size_t alignment, size_t allocationSize) + { + if (posix_memalign (&data, alignment, allocationSize) != 0) + jassertfalse; + } + + ~AllocationWrapper() + { + ::free (data); + } + + void* data = nullptr; + }; + + std::unique_ptr allocation; + size_t size = 0; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AlignedMemory) + JUCE_DECLARE_NON_MOVEABLE (AlignedMemory) + }; + + AlignedMemory cpuRenderMemory; + + detail::ContextPtr cgContext; + + ObjCObjectHandle> buffer; + TextureUniquePtr sharedTexture; + std::unique_ptr gpuTexturePool; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Resources) + JUCE_DECLARE_NON_MOVEABLE (Resources) + }; + + //============================================================================== + std::unique_ptr resources; + + ObjCObjectHandle> device; + ObjCObjectHandle> commandQueue; + ObjCObjectHandle> memoryBlitCommandBuffer; + ObjCObjectHandle> memoryBlitEvent; + + uint64_t memoryBlitCounter = 0; + std::atomic stopGpuCommandSubmission { false }; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreGraphicsMetalLayerRenderer) + JUCE_DECLARE_NON_MOVEABLE (CoreGraphicsMetalLayerRenderer) +}; + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +} diff --git a/modules/juce_gui_basics/native/juce_mac_FileChooser.mm b/modules/juce_gui_basics/native/juce_mac_FileChooser.mm index f89921f2..81d8b6d7 100644 --- a/modules/juce_gui_basics/native/juce_mac_FileChooser.mm +++ b/modules/juce_gui_basics/native/juce_mac_FileChooser.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -112,10 +112,13 @@ public: preview->addToDesktop (0, (void*) nsViewPreview); preview->setVisible (true); - if (! isSave) + if (@available (macOS 10.11, *)) { - auto* openPanel = static_cast (panel); - [openPanel setAccessoryViewDisclosed: YES]; + if (! isSave) + { + auto* openPanel = static_cast (panel); + [openPanel setAccessoryViewDisclosed: YES]; + } } } diff --git a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm index e5143fb1..38f89b78 100644 --- a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm +++ b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm b/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm index 3be7bd36..4d537008 100644 --- a/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm +++ b/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 902e8f13..0725c6d3 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,6 +23,8 @@ ============================================================================== */ +#include "juce_mac_CGMetalLayerRenderer.h" + @interface NSEvent (DeviceDelta) - (float)deviceDeltaX; - (float)deviceDeltaY; @@ -31,16 +33,36 @@ //============================================================================== namespace juce { - typedef void (*AppFocusChangeCallback)(); - extern AppFocusChangeCallback appFocusChangeCallback; - typedef bool (*CheckEventBlockedByModalComps) (NSEvent*); - extern CheckEventBlockedByModalComps isEventBlockedByModalComps; -} -namespace juce -{ +using AppFocusChangeCallback = void (*)(); +extern AppFocusChangeCallback appFocusChangeCallback; +using CheckEventBlockedByModalComps = bool (*) (NSEvent*); +extern CheckEventBlockedByModalComps isEventBlockedByModalComps; //============================================================================== +static void resetTrackingArea (NSView* view) +{ + const auto trackingAreas = [view trackingAreas]; + + jassert ([trackingAreas count] <= 1); + + for (NSTrackingArea* area in trackingAreas) + [view removeTrackingArea: area]; + + const auto options = NSTrackingMouseEnteredAndExited + | NSTrackingMouseMoved + | NSTrackingEnabledDuringMouseDrag + | NSTrackingActiveAlways + | NSTrackingInVisibleRect; + + const NSUniquePtr trackingArea { [[NSTrackingArea alloc] initWithRect: [view bounds] + options: options + owner: view + userInfo: nil] }; + + [view addTrackingArea: trackingArea.get()]; +} + static constexpr int translateVirtualToAsciiKeyCode (int keyCode) noexcept { switch (keyCode) @@ -101,8 +123,7 @@ static constexpr int translateVirtualToAsciiKeyCode (int keyCode) noexcept constexpr int extendedKeyModifier = 0x30000; //============================================================================== -class NSViewComponentPeer : public ComponentPeer, - private Timer +class NSViewComponentPeer : public ComponentPeer { public: NSViewComponentPeer (Component& comp, const int windowStyleFlags, NSView* viewToAttachTo) @@ -121,16 +142,7 @@ public: [view registerForDraggedTypes: getSupportedDragTypes()]; - const auto options = NSTrackingMouseEnteredAndExited - | NSTrackingMouseMoved - | NSTrackingEnabledDuringMouseDrag - | NSTrackingActiveAlways - | NSTrackingInVisibleRect; - const NSUniquePtr trackingArea { [[NSTrackingArea alloc] initWithRect: r - options: options - owner: view - userInfo: nil] }; - [view addTrackingArea: trackingArea.get()]; + resetTrackingArea (view); notificationCenter = [NSNotificationCenter defaultCenter]; @@ -141,8 +153,8 @@ public: [view setPostsFrameChangedNotifications: YES]; - #if USE_COREGRAPHICS_RENDERING && JUCE_COREGRAPHICS_DRAW_ASYNC - if (! getComponentAsyncLayerBackedViewDisabled (component)) + #if USE_COREGRAPHICS_RENDERING + if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0) { if (@available (macOS 10.8, *)) { @@ -152,6 +164,8 @@ public: } #endif + createCVDisplayLink(); + if (isSharedWindow) { window = [viewToAttachTo window]; @@ -246,6 +260,9 @@ public: ~NSViewComponentPeer() override { + CVDisplayLinkStop (displayLink); + dispatch_source_cancel (displaySource); + [notificationCenter removeObserver: view]; setOwner (view, nullptr); @@ -783,11 +800,13 @@ public: name: NSWindowWillMiniaturizeNotification object: currentWindow]; - #if JUCE_COREGRAPHICS_DRAW_ASYNC [notificationCenter removeObserver: view name: NSWindowDidBecomeKeyNotification object: currentWindow]; - #endif + + [notificationCenter removeObserver: view + name: NSWindowDidChangeScreenNotification + object: currentWindow]; } if (isSharedWindow && [view window] == window && newWindow == nullptr) @@ -919,6 +938,11 @@ public: JUCE_END_IGNORE_WARNINGS_GCC_LIKE }(); + drawRectWithContext (cg, r); + } + + void drawRectWithContext (CGContextRef cg, NSRect r) + { if (! component.isOpaque()) CGContextClearRect (cg, CGContextGetClipBoundingBox (cg)); @@ -937,10 +961,12 @@ public: }; #if USE_COREGRAPHICS_RENDERING && JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS - // This option invokes a separate paint call for each rectangle of the clip region. - // It's a long story, but this is a basically a workaround for a CGContext not having - // a way of finding whether a rectangle falls within its clip region - if (usingCoreGraphics) + // This was a workaround for a CGContext not having a way of finding whether a rectangle + // falls within its clip region. However Apple removed the capability of + // [view getRectsBeingDrawn: ...] sometime around 10.13, so on later versions of macOS + // numRects will always be 1 and you'll need to use a CoreGraphicsMetalLayerRenderer + // to avoid CoreGraphics consolidating disparate rects. + if (usingCoreGraphics && metalRenderer == nullptr) { const NSRect* rects = nullptr; NSInteger numRects = 0; @@ -953,7 +979,7 @@ public: NSRect rect = rects[i]; CGContextSaveGState (cg); CGContextClipToRect (cg, CGRectMake (rect.origin.x, rect.origin.y, rect.size.width, rect.size.height)); - drawRectWithContext (cg, rect, displayScale); + renderRect (cg, rect, displayScale); CGContextRestoreGState (cg); } @@ -963,11 +989,11 @@ public: } #endif - drawRectWithContext (cg, r, displayScale); + renderRect (cg, r, displayScale); invalidateTransparentWindowShadow(); } - void drawRectWithContext (CGContextRef cg, NSRect r, float displayScale) + void renderRect (CGContextRef cg, NSRect r, float displayScale) { #if USE_COREGRAPHICS_RENDERING if (usingCoreGraphics) @@ -1025,48 +1051,89 @@ public: // a few when there's a lot of activity. // As a work around for this, we use a RectangleList to do our own coalescing of regions before // asynchronously asking the OS to repaint them. - deferredRepaints.add ((float) area.getX(), (float) area.getY(), - (float) area.getWidth(), (float) area.getHeight()); + deferredRepaints.add (area.toFloat()); + } - if (isTimerRunning()) + static bool shouldThrottleRepaint() + { + return areAnyWindowsInLiveResize(); + } + + void setNeedsDisplayRectangles() + { + if (deferredRepaints.isEmpty()) return; auto now = Time::getMillisecondCounter(); auto msSinceLastRepaint = (lastRepaintTime >= now) ? now - lastRepaintTime : (std::numeric_limits::max() - lastRepaintTime) + now; - static uint32 minimumRepaintInterval = 1000 / 30; // 30fps + constexpr uint32 minimumRepaintInterval = 1000 / 30; // 30fps // When windows are being resized, artificially throttling high-frequency repaints helps // to stop the event queue getting clogged, and keeps everything working smoothly. // For some reason Logic also needs this throttling to record parameter events correctly. if (msSinceLastRepaint < minimumRepaintInterval && shouldThrottleRepaint()) - { - startTimer (static_cast (minimumRepaintInterval - msSinceLastRepaint)); return; - } - setNeedsDisplayRectangles(); - } + #if USE_COREGRAPHICS_RENDERING && JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS + // We require macOS 10.14 to use the Metal layer renderer + if (@available (macOS 10.14, *)) + { + const auto& comp = getComponent(); - static bool shouldThrottleRepaint() - { - return areAnyWindowsInLiveResize() || ! JUCEApplication::isStandaloneApp(); - } + // If we are resizing we need to fall back to synchronous drawing to avoid artefacts + if (areAnyWindowsInLiveResize()) + { + if (metalRenderer != nullptr) + { + metalRenderer.reset(); + view.wantsLayer = NO; + view.layer = nil; + deferredRepaints = comp.getLocalBounds().toFloat(); + } + } + else + { + if (metalRenderer == nullptr) + { + view.wantsLayer = YES; + view.layerContentsRedrawPolicy = NSViewLayerContentsRedrawDuringViewResize; + view.layerContentsPlacement = NSViewLayerContentsPlacementTopLeft; + view.layer = [CAMetalLayer layer]; + metalRenderer = std::make_unique ((CAMetalLayer*) view.layer, getComponent()); + deferredRepaints = comp.getLocalBounds().toFloat(); + } + } + } + #endif - void timerCallback() override - { - setNeedsDisplayRectangles(); - stopTimer(); - } + auto dispatchRectangles = [this] () + { + if (@available (macOS 10.14, *)) + { + if (metalRenderer != nullptr) + { + return metalRenderer->drawRectangleList ((CAMetalLayer*) view.layer, + (float) [[view window] backingScaleFactor], + view.frame, + getComponent(), + [this] (CGContextRef ctx, CGRect r) { drawRectWithContext (ctx, r); }, + deferredRepaints); + } + } - void setNeedsDisplayRectangles() - { - for (auto& i : deferredRepaints) - [view setNeedsDisplayInRect: makeNSRect (i)]; + for (auto& i : deferredRepaints) + [view setNeedsDisplayInRect: makeNSRect (i)]; + + return true; + }; - lastRepaintTime = Time::getMillisecondCounter(); - deferredRepaints.clear(); + if (dispatchRectangles()) + { + lastRepaintTime = Time::getMillisecondCounter(); + deferredRepaints.clear(); + } } void performAnyPendingRepaintsNow() override @@ -1170,6 +1237,12 @@ public: void redirectMovedOrResized() { handleMovedOrResized(); + setNeedsDisplayRectangles(); + } + + void windowDidChangeScreen() + { + updateCVDisplayLinkScreen(); } void viewMovedToWindow() @@ -1206,6 +1279,13 @@ public: selector: resignKeySelector name: NSWindowDidResignKeyNotification object: currentWindow]; + + [notificationCenter addObserver: view + selector: @selector (windowDidChangeScreen:) + name: NSWindowDidChangeScreenNotification + object: currentWindow]; + + updateCVDisplayLinkScreen(); } } @@ -1326,35 +1406,7 @@ public: // has a Z label). Therefore, we need to query the current keyboard // layout to figure out what character the key would have produced // if the shift key was not pressed - String unmodified; - - #if JUCE_SUPPORT_CARBON - if (auto currentKeyboard = CFUniquePtr (TISCopyCurrentKeyboardInputSource())) - { - if (auto layoutData = (CFDataRef) TISGetInputSourceProperty (currentKeyboard, - kTISPropertyUnicodeKeyLayoutData)) - { - if (auto* layoutPtr = (const UCKeyboardLayout*) CFDataGetBytePtr (layoutData)) - { - UInt32 keysDown = 0; - UniChar buffer[4]; - UniCharCount actual; - - if (UCKeyTranslate (layoutPtr, [ev keyCode], kUCKeyActionDown, 0, LMGetKbdType(), - kUCKeyTranslateNoDeadKeysBit, &keysDown, sizeof (buffer) / sizeof (UniChar), - &actual, buffer) == 0) - unmodified = String (CharPointer_UTF16 (reinterpret_cast (buffer)), 4); - } - } - } - - // did the above layout conversion fail - if (unmodified.isEmpty()) - #endif - { - unmodified = nsStringToJuce ([ev charactersIgnoringModifiers]); - } - + String unmodified = nsStringToJuce ([ev charactersIgnoringModifiers]); auto keyCode = (int) unmodified[0]; if (keyCode == 0x19) // (backwards-tab) @@ -1558,7 +1610,7 @@ public: void grabFocus() override { - if (window != nil && [window canBecomeKeyWindow]) + if (window != nil) { [window makeKeyWindow]; [window makeFirstResponder: view]; @@ -1569,7 +1621,7 @@ public: void textInputRequired (Point, TextInputTarget&) override {} - void dismissPendingTextInput() override + void closeInputMethodContext() override { stringBeingComposed.clear(); const auto* inputContext = [NSTextInputContext currentInputContext]; @@ -1789,12 +1841,60 @@ private: void setFullScreenSizeConstraints (const ComponentBoundsConstrainer& c) { - const auto minSize = NSMakeSize (static_cast (c.getMinimumWidth()), - 0.0f); - [window setMinFullScreenContentSize: minSize]; - [window setMaxFullScreenContentSize: NSMakeSize (100000, 100000)]; + if (@available (macOS 10.11, *)) + { + const auto minSize = NSMakeSize (static_cast (c.getMinimumWidth()), + 0.0f); + [window setMinFullScreenContentSize: minSize]; + [window setMaxFullScreenContentSize: NSMakeSize (100000, 100000)]; + } + } + + //============================================================================== + void onDisplaySourceCallback() + { + setNeedsDisplayRectangles(); + } + + void onDisplayLinkCallback() + { + dispatch_source_merge_data (displaySource, 1); } + static CVReturn displayLinkCallback (CVDisplayLinkRef, const CVTimeStamp*, const CVTimeStamp*, + CVOptionFlags, CVOptionFlags*, void* context) + { + static_cast (context)->onDisplayLinkCallback(); + return kCVReturnSuccess; + } + + void updateCVDisplayLinkScreen() + { + auto viewDisplayID = (CGDirectDisplayID) [[window.screen.deviceDescription objectForKey: @"NSScreenNumber"] unsignedIntegerValue]; + auto result = CVDisplayLinkSetCurrentCGDisplay (displayLink, viewDisplayID); + jassertquiet (result == kCVReturnSuccess); + } + + void createCVDisplayLink() + { + displaySource = dispatch_source_create (DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, dispatch_get_main_queue()); + dispatch_source_set_event_handler (displaySource, ^(){ onDisplaySourceCallback(); }); + dispatch_resume (displaySource); + + auto cvReturn = CVDisplayLinkCreateWithActiveCGDisplays (&displayLink); + jassertquiet (cvReturn == kCVReturnSuccess); + + cvReturn = CVDisplayLinkSetOutputCallback (displayLink, &displayLinkCallback, this); + jassertquiet (cvReturn == kCVReturnSuccess); + + CVDisplayLinkStart (displayLink); + } + + CVDisplayLinkRef displayLink = nullptr; + dispatch_source_t displaySource = nullptr; + + std::unique_ptr metalRenderer; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NSViewComponentPeer) }; @@ -1840,6 +1940,7 @@ struct JuceNSViewClass : public NSViewComponentPeerWrapper> { addMethod (@selector (isOpaque), isOpaque); addMethod (@selector (drawRect:), drawRect); + addMethod (@selector (updateTrackingAreas), updateTrackingAreas); addMethod (@selector (mouseDown:), mouseDown); addMethod (@selector (mouseUp:), mouseUp); addMethod (@selector (mouseDragged:), mouseDragged); @@ -1857,6 +1958,7 @@ struct JuceNSViewClass : public NSViewComponentPeerWrapper> addMethod (@selector (acceptsFirstMouse:), acceptsFirstMouse); addMethod (@selector (windowWillMiniaturize:), windowWillMiniaturize); addMethod (@selector (windowDidDeminiaturize:), windowDidDeminiaturize); + addMethod (@selector (windowDidChangeScreen:), windowDidChangeScreen); addMethod (@selector (wantsDefaultClipping), wantsDefaultClipping); addMethod (@selector (worksWhenModal), worksWhenModal); addMethod (@selector (viewDidMoveToWindow), viewDidMoveToWindow); @@ -1922,6 +2024,13 @@ struct JuceNSViewClass : public NSViewComponentPeerWrapper> } private: + static void updateTrackingAreas (id self, SEL) + { + sendSuperclassMessage (self, @selector (updateTrackingAreas)); + + resetTrackingArea (static_cast (self)); + } + static void mouseDown (id self, SEL s, NSEvent* ev) { if (JUCEApplicationBase::isStandaloneApp()) @@ -2023,6 +2132,12 @@ private: } } + static void windowDidChangeScreen (id self, SEL, NSNotification*) + { + if (auto* p = getOwner (self)) + p->windowDidChangeScreen(); + } + static BOOL isOpaque (id self, SEL) { auto* owner = getOwner (self); diff --git a/modules/juce_gui_basics/native/juce_mac_Windowing.mm b/modules/juce_gui_basics/native/juce_mac_Windowing.mm index b3c3fa2b..f8bcabbc 100644 --- a/modules/juce_gui_basics/native/juce_mac_Windowing.mm +++ b/modules/juce_gui_basics/native/juce_mac_Windowing.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp b/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp index 91a2314a..e64459fa 100644 --- a/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp +++ b/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -212,7 +212,7 @@ namespace DragAndDropHelpers }; //============================================================================== - HDROP createHDrop (const StringArray& fileNames) + static HDROP createHDrop (const StringArray& fileNames) { size_t totalBytes = 0; for (int i = fileNames.size(); --i >= 0;) diff --git a/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp b/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp index d00412b3..4c3df9e4 100644 --- a/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp +++ b/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h b/modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h index c8990a74..2684295c 100644 --- a/modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h +++ b/modules/juce_gui_basics/native/juce_win32_ScopedThreadDPIAwarenessSetter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index 4ffc09d9..8d75d83f 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -61,7 +61,7 @@ void* getUser32Function (const char*); #if JUCE_DEBUG int numActiveScopedDpiAwarenessDisablers = 0; - bool isInScopedDPIAwarenessDisabler() { return numActiveScopedDpiAwarenessDisablers > 0; } + static bool isInScopedDPIAwarenessDisabler() { return numActiveScopedDpiAwarenessDisablers > 0; } extern HWND juce_messageWindowHandle; #endif @@ -472,17 +472,18 @@ static bool isPerMonitorDPIAwareWindow (HWND nativeWindow) #endif } -static bool isPerMonitorDPIAwareThread() +static bool isPerMonitorDPIAwareThread (GetThreadDPIAwarenessContextFunc getThreadDPIAwarenessContextIn = getThreadDPIAwarenessContext, + GetAwarenessFromDpiAwarenessContextFunc getAwarenessFromDPIAwarenessContextIn = getAwarenessFromDPIAwarenessContext) { #if ! JUCE_WIN_PER_MONITOR_DPI_AWARE return false; #else setDPIAwareness(); - if (getThreadDPIAwarenessContext != nullptr - && getAwarenessFromDPIAwarenessContext != nullptr) + if (getThreadDPIAwarenessContextIn != nullptr + && getAwarenessFromDPIAwarenessContextIn != nullptr) { - return (getAwarenessFromDPIAwarenessContext (getThreadDPIAwarenessContext()) + return (getAwarenessFromDPIAwarenessContextIn (getThreadDPIAwarenessContextIn()) == DPI_Awareness::DPI_Awareness_Per_Monitor_Aware); } @@ -576,12 +577,17 @@ ScopedThreadDPIAwarenessSetter::~ScopedThreadDPIAwarenessSetter() = default; ScopedDPIAwarenessDisabler::ScopedDPIAwarenessDisabler() { - if (! isPerMonitorDPIAwareThread()) + static auto localGetThreadDpiAwarenessContext = (GetThreadDPIAwarenessContextFunc) getUser32Function ("GetThreadDpiAwarenessContext"); + static auto localGetAwarenessFromDpiAwarenessContextFunc = (GetAwarenessFromDpiAwarenessContextFunc) getUser32Function ("GetAwarenessFromDpiAwarenessContext"); + + if (! isPerMonitorDPIAwareThread (localGetThreadDpiAwarenessContext, localGetAwarenessFromDpiAwarenessContextFunc)) return; - if (setThreadDPIAwarenessContext != nullptr) + static auto localSetThreadDPIAwarenessContext = (SetThreadDPIAwarenessContextFunc) getUser32Function ("SetThreadDpiAwarenessContext"); + + if (localSetThreadDPIAwarenessContext != nullptr) { - previousContext = setThreadDPIAwarenessContext (DPI_AWARENESS_CONTEXT_UNAWARE); + previousContext = localSetThreadDPIAwarenessContext (DPI_AWARENESS_CONTEXT_UNAWARE); #if JUCE_DEBUG ++numActiveScopedDpiAwarenessDisablers; @@ -593,7 +599,10 @@ ScopedDPIAwarenessDisabler::~ScopedDPIAwarenessDisabler() { if (previousContext != nullptr) { - setThreadDPIAwarenessContext ((DPI_AWARENESS_CONTEXT) previousContext); + static auto localSetThreadDPIAwarenessContext = (SetThreadDPIAwarenessContextFunc) getUser32Function ("SetThreadDpiAwarenessContext"); + + if (localSetThreadDPIAwarenessContext != nullptr) + localSetThreadDPIAwarenessContext ((DPI_AWARENESS_CONTEXT) previousContext); #if JUCE_DEBUG --numActiveScopedDpiAwarenessDisablers; @@ -649,6 +658,7 @@ static Point convertLogicalScreenPointToPhysical (Point p, HWND h) noe return p; } +JUCE_API double getScaleFactorForWindow (HWND h); JUCE_API double getScaleFactorForWindow (HWND h) { // NB. Using a local function here because we need to call this method from the plug-in wrappers @@ -830,6 +840,7 @@ Desktop::DisplayOrientation Desktop::getCurrentOrientation() const return upright; } +int64 getMouseEventTime(); int64 getMouseEventTime() { static int64 eventTimeOffset = 0; @@ -1102,7 +1113,7 @@ Image createSnapshotOfNativeWindow (void* nativeWindowHandle) //============================================================================== namespace IconConverters { - Image createImageFromHICON (HICON icon) + static Image createImageFromHICON (HICON icon) { if (icon == nullptr) return {}; @@ -1210,6 +1221,7 @@ namespace IconConverters return {}; } + HICON createHICONFromImage (const Image& image, const BOOL isIcon, int hotspotX, int hotspotY); HICON createHICONFromImage (const Image& image, const BOOL isIcon, int hotspotX, int hotspotY) { auto nativeBitmap = new WindowsBitmapImage (Image::ARGB, image.getWidth(), image.getHeight(), true); @@ -1233,7 +1245,7 @@ namespace IconConverters DeleteObject (mask); return hi; } -} +} // namespace IconConverters //============================================================================== JUCE_IUNKNOWNCLASS (ITipInvocation, "37c994e7-432b-4834-a2f7-dce1f13b834b") @@ -1252,93 +1264,6 @@ __CRT_UUID_DECL (juce::ITipInvocation, 0x37c994e7, 0x432b, 0x4834, 0xa2, 0xf7, 0 namespace juce { -struct OnScreenKeyboard : public DeletedAtShutdown, - private Timer -{ - void activate() - { - shouldBeActive = true; - startTimer (10); - } - - void deactivate() - { - shouldBeActive = false; - startTimer (10); - } - - JUCE_DECLARE_SINGLETON_SINGLETHREADED (OnScreenKeyboard, false) - -private: - OnScreenKeyboard() - { - tipInvocation.CoCreateInstance (ITipInvocation::getCLSID(), CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER); - } - - ~OnScreenKeyboard() override - { - clearSingletonInstance(); - } - - void timerCallback() override - { - stopTimer(); - - if (reentrant || tipInvocation == nullptr) - return; - - const ScopedValueSetter setter (reentrant, true, false); - - auto isActive = isKeyboardVisible(); - - if (isActive != shouldBeActive) - { - if (! isActive) - { - tipInvocation->Toggle (GetDesktopWindow()); - } - else - { - if (auto hwnd = FindWindow (L"IPTip_Main_Window", nullptr)) - PostMessage (hwnd, WM_SYSCOMMAND, (int) SC_CLOSE, 0); - } - } - } - - bool isVisible() - { - if (auto hwnd = FindWindowEx (nullptr, nullptr, L"ApplicationFrameWindow", nullptr)) - return FindWindowEx (hwnd, nullptr, L"Windows.UI.Core.CoreWindow", L"Microsoft Text Input Application") != nullptr; - - return false; - } - - bool isVisibleLegacy() - { - if (auto hwnd = FindWindow (L"IPTip_Main_Window", nullptr)) - { - auto style = GetWindowLong (hwnd, GWL_STYLE); - return (style & WS_DISABLED) == 0 && (style & WS_VISIBLE) != 0; - } - - return false; - } - - bool isKeyboardVisible() - { - if (isVisible()) - return true; - - // isVisible() may fail on Win10 versions < 1709 so try the old method too - return isVisibleLegacy(); - } - - bool shouldBeActive = false, reentrant = false; - ComSmartPtr tipInvocation; -}; - -JUCE_IMPLEMENT_SINGLETON (OnScreenKeyboard) - //============================================================================== struct HSTRING_PRIVATE; typedef HSTRING_PRIVATE* HSTRING; @@ -1398,7 +1323,7 @@ struct UWPUIViewSettings return; LPCWSTR uwpClassName = L"Windows.UI.ViewManagement.UIViewSettings"; - HSTRING uwpClassId; + HSTRING uwpClassId = nullptr; if (createHString (uwpClassName, (::UINT32) wcslen (uwpClassName), &uwpClassId) != S_OK || uwpClassId == nullptr) @@ -1418,30 +1343,6 @@ struct UWPUIViewSettings } } - bool isTabletModeActivatedForWindow (::HWND hWnd) const - { - if (viewSettingsInterop == nullptr) - return false; - - ComSmartPtr viewSettings; - - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") - - if (viewSettingsInterop->GetForWindow (hWnd, __uuidof (IUIViewSettings), - (void**) viewSettings.resetAndGetPointerAddress()) == S_OK - && viewSettings != nullptr) - { - IUIViewSettings::UserInteractionMode mode; - - if (viewSettings->GetUserInteractionMode (&mode) == S_OK) - return mode == IUIViewSettings::Touch; - } - - JUCE_END_IGNORE_WARNINGS_GCC_LIKE - - return false; - } - private: //============================================================================== struct ComBaseModule @@ -1471,8 +1372,252 @@ private: WindowsDeleteStringFuncPtr deleteHString; }; +//============================================================================== +static HMONITOR getMonitorFromOutput (ComSmartPtr output) +{ + DXGI_OUTPUT_DESC desc = {}; + return (FAILED (output->GetDesc (&desc)) || ! desc.AttachedToDesktop) + ? nullptr + : desc.Monitor; +} + +struct VBlankListener +{ + virtual void onVBlank() = 0; +}; + +//============================================================================== +class VSyncThread : private Thread, + private AsyncUpdater +{ +public: + VSyncThread (ComSmartPtr out, + HMONITOR mon, + VBlankListener& listener) + : Thread ("VSyncThread"), + output (out), + monitor (mon) + { + listeners.push_back (listener); + startThread (10); + } + + ~VSyncThread() override + { + stopThread (-1); + cancelPendingUpdate(); + } + + void updateMonitor() + { + monitor = getMonitorFromOutput (output); + } + + HMONITOR getMonitor() const noexcept { return monitor; } + + void addListener (VBlankListener& listener) + { + listeners.push_back (listener); + } + + bool removeListener (const VBlankListener& listener) + { + auto it = std::find_if (listeners.cbegin(), + listeners.cend(), + [&listener] (const auto& l) { return &(l.get()) == &listener; }); + + if (it != listeners.cend()) + { + listeners.erase (it); + return true; + } + + return false; + } + + bool hasNoListeners() const noexcept + { + return listeners.empty(); + } + + bool hasListener (const VBlankListener& listener) const noexcept + { + return std::any_of (listeners.cbegin(), + listeners.cend(), + [&listener] (const auto& l) { return &(l.get()) == &listener; }); + } + +private: + //============================================================================== + void run() override + { + while (! threadShouldExit()) + { + if (output->WaitForVBlank() == S_OK) + triggerAsyncUpdate(); + else + Thread::sleep (1); + } + } + + void handleAsyncUpdate() override + { + for (auto& listener : listeners) + listener.get().onVBlank(); + } + + //============================================================================== + ComSmartPtr output; + HMONITOR monitor = nullptr; + std::vector> listeners; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSyncThread) + JUCE_DECLARE_NON_MOVEABLE (VSyncThread) +}; + +//============================================================================== +class VBlankDispatcher : public DeletedAtShutdown +{ +public: + void updateDisplay (VBlankListener& listener, HMONITOR monitor) + { + if (monitor == nullptr) + { + removeListener (listener); + return; + } + + auto threadWithListener = threads.end(); + auto threadWithMonitor = threads.end(); + + for (auto it = threads.begin(); it != threads.end(); ++it) + { + if ((*it)->hasListener (listener)) + threadWithListener = it; + + if ((*it)->getMonitor() == monitor) + threadWithMonitor = it; + + if (threadWithListener != threads.end() + && threadWithMonitor != threads.end()) + { + if (threadWithListener == threadWithMonitor) + return; + + (*threadWithMonitor)->addListener (listener); + + // This may invalidate iterators, so be careful! + removeListener (threadWithListener, listener); + return; + } + } + + if (threadWithMonitor != threads.end()) + { + (*threadWithMonitor)->addListener (listener); + return; + } + + if (threadWithListener != threads.end()) + removeListener (threadWithListener, listener); + + for (auto adapter : adapters) + { + UINT i = 0; + ComSmartPtr output; + + while (adapter->EnumOutputs (i, output.resetAndGetPointerAddress()) != DXGI_ERROR_NOT_FOUND) + { + if (getMonitorFromOutput (output) == monitor) + { + threads.emplace_back (std::make_unique (output, monitor, listener)); + return; + } + + ++i; + } + } + } + + void removeListener (const VBlankListener& listener) + { + for (auto it = threads.begin(); it != threads.end(); ++it) + if (removeListener (it, listener)) + return; + } + + void reconfigureDisplays() + { + adapters.clear(); + + ComSmartPtr factory; + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") + CreateDXGIFactory (__uuidof (IDXGIFactory), (void**)factory.resetAndGetPointerAddress()); + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + UINT i = 0; + ComSmartPtr adapter; + + while (factory->EnumAdapters (i, adapter.resetAndGetPointerAddress()) != DXGI_ERROR_NOT_FOUND) + { + adapters.push_back (adapter); + ++i; + } + + for (auto& thread : threads) + thread->updateMonitor(); + + threads.erase (std::remove_if (threads.begin(), + threads.end(), + [] (const auto& thread) { return thread->getMonitor() == nullptr; }), + threads.end()); + } + + JUCE_DECLARE_SINGLETON_SINGLETHREADED (VBlankDispatcher, true) + +private: + //============================================================================== + using Threads = std::vector>; + + VBlankDispatcher() + { + reconfigureDisplays(); + } + + ~VBlankDispatcher() override + { + threads.clear(); + clearSingletonInstance(); + } + + // This may delete the corresponding thread and invalidate iterators, + // so be careful! + bool removeListener (Threads::iterator it, const VBlankListener& listener) + { + if ((*it)->removeListener (listener)) + { + if ((*it)->hasNoListeners()) + threads.erase (it); + + return true; + } + + return false; + } + + //============================================================================== + std::vector> adapters; + Threads threads; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VBlankDispatcher) + JUCE_DECLARE_NON_MOVEABLE (VBlankDispatcher) +}; + +JUCE_IMPLEMENT_SINGLETON (VBlankDispatcher) + //============================================================================== class HWNDComponentPeer : public ComponentPeer, + private VBlankListener, private Timer #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client , public ModifierKeyReceiver @@ -1497,8 +1642,6 @@ public: setTitle (component.getName()); updateShadower(); - OnScreenKeyboard::getInstance(); - getNativeRealtimeModifiers = [] { HWNDComponentPeer::updateKeyModifiers(); @@ -1512,10 +1655,15 @@ public: return ModifierKeys::currentModifiers; }; + + if (updateCurrentMonitor()) + VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor); } ~HWNDComponentPeer() override { + VBlankDispatcher::getInstance()->removeListener (*this); + // do this first to avoid messages arriving for this window before it's destroyed JuceWindowIdentifier::setAsJUCEWindow (hwnd, false); @@ -1857,36 +2005,61 @@ public: void textInputRequired (Point, TextInputTarget&) override { if (! hasCreatedCaret) + hasCreatedCaret = CreateCaret (hwnd, (HBITMAP) 1, 0, 0); + + if (hasCreatedCaret) { - hasCreatedCaret = true; - CreateCaret (hwnd, (HBITMAP) 1, 0, 0); + SetCaretPos (0, 0); + ShowCaret (hwnd); } - ShowCaret (hwnd); - SetCaretPos (0, 0); + ImmAssociateContext (hwnd, nullptr); - if (uwpViewSettings.isTabletModeActivatedForWindow (hwnd)) - OnScreenKeyboard::getInstance()->activate(); + // MSVC complains about the nullptr argument, but the docs for this + // function say that the second argument is ignored when the third + // argument is IACE_DEFAULT. + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6387) + ImmAssociateContextEx (hwnd, nullptr, IACE_DEFAULT); + JUCE_END_IGNORE_WARNINGS_MSVC } - void dismissPendingTextInput() override + void closeInputMethodContext() override { imeHandler.handleSetContext (hwnd, false); + } + + void dismissPendingTextInput() override + { + closeInputMethodContext(); + + ImmAssociateContext (hwnd, nullptr); - if (uwpViewSettings.isTabletModeActivatedForWindow (hwnd)) - OnScreenKeyboard::getInstance()->deactivate(); + if (std::exchange (hasCreatedCaret, false)) + DestroyCaret(); } void repaint (const Rectangle& area) override { - auto r = RECTFromRectangle ((area.toDouble() * getPlatformScaleFactor()).getSmallestIntegerContainer()); - InvalidateRect (hwnd, &r, FALSE); + deferredRepaints.add ((area.toDouble() * getPlatformScaleFactor()).getSmallestIntegerContainer()); + } + + void dispatchDeferredRepaints() + { + for (auto deferredRect : deferredRepaints) + { + auto r = RECTFromRectangle (deferredRect); + InvalidateRect (hwnd, &r, FALSE); + } + + deferredRepaints.clear(); } void performAnyPendingRepaintsNow() override { if (component.isVisible()) { + dispatchDeferredRepaints(); + WeakReference localRef (&component); MSG m; @@ -1896,6 +2069,12 @@ public: } } + //============================================================================== + void onVBlank() override + { + dispatchDeferredRepaints(); + } + //============================================================================== static HWNDComponentPeer* getOwnerOfWindow (HWND h) noexcept { @@ -2146,6 +2325,7 @@ private: double scaleFactor = 1.0; bool inDpiChange = 0, inHandlePositionChanged = 0; + HMONITOR currentMonitor = nullptr; bool isAccessibilityActive = false; @@ -3469,6 +3649,12 @@ private: return 0; } + bool updateCurrentMonitor() + { + auto monitor = MonitorFromWindow (hwnd, MONITOR_DEFAULTTONULL); + return std::exchange (currentMonitor, monitor) != monitor; + } + bool handlePositionChanged() { auto pos = getCurrentMousePos(); @@ -3486,6 +3672,9 @@ private: handleMovedOrResized(); + if (updateCurrentMonitor()) + VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor); + return ! dontRepaint; // to allow non-accelerated openGL windows to draw themselves correctly. } @@ -3639,6 +3828,11 @@ private: setWindowPos (hwnd, ScalingHelpers::scaledScreenPosToUnscaled (component, Desktop::getInstance().getDisplays() .getDisplayForRect (component.getScreenBounds())->userArea), SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOSENDCHANGING); + + auto* dispatcher = VBlankDispatcher::getInstance(); + dispatcher->reconfigureDisplays(); + updateCurrentMonitor(); + dispatcher->updateDisplay (*this, currentMonitor); } //============================================================================== @@ -4102,13 +4296,18 @@ private: { if (compositionInProgress && ! windowIsActive) { - compositionInProgress = false; - if (HIMC hImc = ImmGetContext (hWnd)) { ImmNotifyIME (hImc, NI_COMPOSITIONSTR, CPS_COMPLETE, 0); ImmReleaseContext (hWnd, hImc); } + + // If the composition is still in progress, calling ImmNotifyIME may call back + // into handleComposition to let us know that the composition has finished. + // We need to set compositionInProgress *after* calling handleComposition, so that + // the text replaces the current selection, rather than being inserted after the + // caret. + compositionInProgress = false; } } @@ -4398,6 +4597,8 @@ private: IMEHandler imeHandler; bool shouldIgnoreModalDismiss = false; + RectangleList deferredRepaints; + //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HWNDComponentPeer) }; @@ -4410,6 +4611,7 @@ ComponentPeer* Component::createNewPeer (int styleFlags, void* parentHWND) return new HWNDComponentPeer (*this, styleFlags, (HWND) parentHWND, false); } +JUCE_API ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component& component, void* parentHWND); JUCE_API ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component& component, void* parentHWND) { return new HWNDComponentPeer (component, ComponentPeer::windowIgnoresMouseClicks, @@ -4449,6 +4651,7 @@ bool KeyPress::isKeyCurrentlyDown (const int keyCode) } // (This internal function is used by the plugin client module) +bool offerKeyMessageToJUCEWindow (MSG& m); bool offerKeyMessageToJUCEWindow (MSG& m) { return HWNDComponentPeer::offerKeyMessageToJUCEWindow (m); } //============================================================================== diff --git a/modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp b/modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp index 3e24e1f2..3d07128b 100644 --- a/modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp +++ b/modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp b/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp index aecb639f..4b2e24ee 100644 --- a/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp +++ b/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h b/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h index 3cb38606..74d70fa6 100644 --- a/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h +++ b/modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp index 2ea80990..087f881b 100644 --- a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp +++ b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -566,6 +566,7 @@ enum { static int trappedErrorCode = 0; + extern "C" int errorTrapHandler (Display*, XErrorEvent* err); extern "C" int errorTrapHandler (Display*, XErrorEvent* err) { trappedErrorCode = err->error_code; @@ -1870,7 +1871,9 @@ Rectangle XWindowSystem::getWindowBounds (::Window windowH, ::Window parent } else { - parentScreenPosition = Point (rootX, rootY); + // XGetGeometry returns wx and wy relative to the parent window's origin. + // XTranslateCoordinates returns rootX and rootY relative to the root window. + parentScreenPosition = Point (rootX - wx, rootY - wy); } } @@ -3220,11 +3223,13 @@ void XWindowSystem::destroyXDisplay() } //============================================================================== +::Window juce_createKeyProxyWindow (ComponentPeer* peer); ::Window juce_createKeyProxyWindow (ComponentPeer* peer) { return XWindowSystem::getInstance()->createKeyProxy ((::Window) peer->getNativeHandle()); } +void juce_deleteKeyProxyWindow (::Window keyProxy); void juce_deleteKeyProxyWindow (::Window keyProxy) { XWindowSystem::getInstance()->deleteKeyProxy (keyProxy); diff --git a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h index 587b81e1..0659adbe 100644 --- a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h +++ b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_MarkerList.cpp b/modules/juce_gui_basics/positioning/juce_MarkerList.cpp index 1436bd74..0cfee9f6 100644 --- a/modules/juce_gui_basics/positioning/juce_MarkerList.cpp +++ b/modules/juce_gui_basics/positioning/juce_MarkerList.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_MarkerList.h b/modules/juce_gui_basics/positioning/juce_MarkerList.h index 4f6f029b..ea52e28e 100644 --- a/modules/juce_gui_basics/positioning/juce_MarkerList.h +++ b/modules/juce_gui_basics/positioning/juce_MarkerList.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp b/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp index 50637355..30af07bc 100644 --- a/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp +++ b/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h b/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h index 173ac41c..35287fd6 100644 --- a/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h +++ b/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp b/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp index 1293d643..be1322b2 100644 --- a/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp +++ b/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h b/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h index 65a86e3b..0df29a7d 100644 --- a/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h +++ b/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp b/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp index ded1936f..64bac8a5 100644 --- a/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp +++ b/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h b/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h index 74a237aa..586581e9 100644 --- a/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h +++ b/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp b/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp index 90f99473..e37a5c66 100644 --- a/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp +++ b/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_RelativePoint.h b/modules/juce_gui_basics/positioning/juce_RelativePoint.h index 7fb0b24c..5bd097a3 100644 --- a/modules/juce_gui_basics/positioning/juce_RelativePoint.h +++ b/modules/juce_gui_basics/positioning/juce_RelativePoint.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp b/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp index 93fadc5f..04748c84 100644 --- a/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp +++ b/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_RelativePointPath.h b/modules/juce_gui_basics/positioning/juce_RelativePointPath.h index 72f1333b..78d249d5 100644 --- a/modules/juce_gui_basics/positioning/juce_RelativePointPath.h +++ b/modules/juce_gui_basics/positioning/juce_RelativePointPath.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp b/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp index 9012bafe..a8ce138a 100644 --- a/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp +++ b/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h b/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h index b659d146..51f4fbac 100644 --- a/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h +++ b/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp b/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp index 026e9aa4..b180eb79 100644 --- a/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp +++ b/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h b/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h index 1b5721c0..06ca6cd2 100644 --- a/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h +++ b/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp b/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp index 55473ea0..5db8b954 100644 --- a/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp +++ b/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h b/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h index c650f015..eb258b8d 100644 --- a/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h +++ b/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp b/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp index efe17046..eaa5baed 100644 --- a/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp +++ b/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h b/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h index d616ce15..67ce49db 100644 --- a/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h +++ b/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp b/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp index e8a872a5..77e51fa5 100644 --- a/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp +++ b/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h b/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h index a26d3174..8a2e764c 100644 --- a/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h +++ b/modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp b/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp index fd82089a..6fc0eb3f 100644 --- a/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp +++ b/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_PropertyComponent.h b/modules/juce_gui_basics/properties/juce_PropertyComponent.h index c9e035ce..e637c81e 100644 --- a/modules/juce_gui_basics/properties/juce_PropertyComponent.h +++ b/modules/juce_gui_basics/properties/juce_PropertyComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp b/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp index 701147e9..65741ad9 100644 --- a/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp +++ b/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_PropertyPanel.h b/modules/juce_gui_basics/properties/juce_PropertyPanel.h index b1272839..4ffd6f14 100644 --- a/modules/juce_gui_basics/properties/juce_PropertyPanel.h +++ b/modules/juce_gui_basics/properties/juce_PropertyPanel.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp b/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp index 9371e9e2..8ceca7e0 100644 --- a/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp +++ b/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h b/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h index be13018e..3a3354ee 100644 --- a/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h +++ b/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp b/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp index 08c8ad93..27663aa1 100644 --- a/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp +++ b/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h b/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h index 5f3fe448..16d88ef3 100644 --- a/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h +++ b/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_ComboBox.cpp b/modules/juce_gui_basics/widgets/juce_ComboBox.cpp index 95ad57dd..e0ff54a4 100644 --- a/modules/juce_gui_basics/widgets/juce_ComboBox.cpp +++ b/modules/juce_gui_basics/widgets/juce_ComboBox.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_ComboBox.h b/modules/juce_gui_basics/widgets/juce_ComboBox.h index 8275b8f0..49171024 100644 --- a/modules/juce_gui_basics/widgets/juce_ComboBox.h +++ b/modules/juce_gui_basics/widgets/juce_ComboBox.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp b/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp index ea7cbc55..56d56d10 100644 --- a/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp +++ b/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_ImageComponent.h b/modules/juce_gui_basics/widgets/juce_ImageComponent.h index b3abbb70..56a1432f 100644 --- a/modules/juce_gui_basics/widgets/juce_ImageComponent.h +++ b/modules/juce_gui_basics/widgets/juce_ImageComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_Label.cpp b/modules/juce_gui_basics/widgets/juce_Label.cpp index f6546789..9f24a20b 100644 --- a/modules/juce_gui_basics/widgets/juce_Label.cpp +++ b/modules/juce_gui_basics/widgets/juce_Label.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -208,9 +208,6 @@ void Label::editorShown (TextEditor* textEditor) void Label::editorAboutToBeHidden (TextEditor* textEditor) { - if (auto* peer = getPeer()) - peer->dismissPendingTextInput(); - Component::BailOutChecker checker (this); listeners.callChecked (checker, [this, textEditor] (Label::Listener& l) { l.editorHidden (this, *textEditor); }); diff --git a/modules/juce_gui_basics/widgets/juce_Label.h b/modules/juce_gui_basics/widgets/juce_Label.h index c7c54ff7..875cae0e 100644 --- a/modules/juce_gui_basics/widgets/juce_Label.h +++ b/modules/juce_gui_basics/widgets/juce_Label.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_ListBox.cpp b/modules/juce_gui_basics/widgets/juce_ListBox.cpp index 0d488e72..b2c8f8c1 100644 --- a/modules/juce_gui_basics/widgets/juce_ListBox.cpp +++ b/modules/juce_gui_basics/widgets/juce_ListBox.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -51,6 +51,19 @@ static AccessibilityActions getListRowAccessibilityActions (RowComponentType& ro .addAction (AccessibilityActionType::toggle, std::move (onToggle)); } +void ListBox::checkModelPtrIsValid() const +{ + #if ! JUCE_DISABLE_ASSERTIONS + // If this is hit, the model was destroyed while the ListBox was still using it. + // You should ensure that the model remains alive for as long as the ListBox holds a pointer to it. + // If this assertion is hit in the destructor of a ListBox instance, do one of the following: + // - Adjust the order in which your destructors run, so that the ListBox destructor runs + // before the destructor of your ListBoxModel, or + // - Call ListBox::setModel (nullptr) before destroying your ListBoxModel. + jassert ((model == nullptr) == (weakModelPtr.lock() == nullptr)); + #endif +} + class ListBox::RowComponent : public Component, public TooltipClient { @@ -513,7 +526,7 @@ struct ListBoxMouseMoveSelector : public MouseListener //============================================================================== ListBox::ListBox (const String& name, ListBoxModel* const m) - : Component (name), model (m) + : Component (name) { viewport.reset (new ListViewport (*this)); addAndMakeVisible (viewport.get()); @@ -521,6 +534,8 @@ ListBox::ListBox (const String& name, ListBoxModel* const m) setWantsKeyboardFocus (true); setFocusContainerType (FocusContainerType::focusContainer); colourChanged(); + + setModel (m); } ListBox::~ListBox() @@ -529,11 +544,20 @@ ListBox::~ListBox() viewport.reset(); } +void ListBox::assignModelPtr (ListBoxModel* const newModel) +{ + model = newModel; + + #if ! JUCE_DISABLE_ASSERTIONS + weakModelPtr = model != nullptr ? model->sharedState : nullptr; + #endif +} + void ListBox::setModel (ListBoxModel* const newModel) { if (model != newModel) { - model = newModel; + assignModelPtr (newModel); repaint(); updateContent(); } @@ -597,6 +621,7 @@ Viewport* ListBox::getViewport() const noexcept //============================================================================== void ListBox::updateContent() { + checkModelPtrIsValid(); hasDoneInitialUpdate = true; totalItems = (model != nullptr) ? model->getNumRows() : 0; @@ -633,6 +658,8 @@ void ListBox::selectRowInternal (const int row, bool deselectOthersFirst, bool isMouseClick) { + checkModelPtrIsValid(); + if (! multipleSelection) deselectOthersFirst = true; @@ -668,6 +695,8 @@ void ListBox::selectRowInternal (const int row, void ListBox::deselectRow (const int row) { + checkModelPtrIsValid(); + if (selected.contains (row)) { selected.removeRange ({ row, row + 1 }); @@ -686,6 +715,8 @@ void ListBox::deselectRow (const int row) void ListBox::setSelectedRows (const SparseSet& setOfRowsToBeSelected, const NotificationType sendNotificationEventToModel) { + checkModelPtrIsValid(); + selected = setOfRowsToBeSelected; selected.removeRange ({ totalItems, std::numeric_limits::max() }); @@ -733,6 +764,8 @@ void ListBox::flipRowSelection (const int row) void ListBox::deselectAllRows() { + checkModelPtrIsValid(); + if (! selected.isEmpty()) { selected.clear(); @@ -862,6 +895,8 @@ void ListBox::scrollToEnsureRowIsOnscreen (const int row) //============================================================================== bool ListBox::keyPressed (const KeyPress& key) { + checkModelPtrIsValid(); + const int numVisibleRows = viewport->getHeight() / getRowHeight(); const bool multiple = multipleSelection @@ -967,6 +1002,8 @@ void ListBox::mouseWheelMove (const MouseEvent& e, const MouseWheelDetails& whee void ListBox::mouseUp (const MouseEvent& e) { + checkModelPtrIsValid(); + if (e.mouseWasClicked() && model != nullptr) model->backgroundClicked (e); } @@ -1116,6 +1153,8 @@ std::unique_ptr ListBox::createAccessibilityHandler() int getNumRows() const override { + listBox.checkModelPtrIsValid(); + if (listBox.model == nullptr) return 0; diff --git a/modules/juce_gui_basics/widgets/juce_ListBox.h b/modules/juce_gui_basics/widgets/juce_ListBox.h index 34532c66..cb2907e1 100644 --- a/modules/juce_gui_basics/widgets/juce_ListBox.h +++ b/modules/juce_gui_basics/widgets/juce_ListBox.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -163,8 +163,14 @@ public: /** You can override this to return a custom mouse cursor for each row. */ virtual MouseCursor getMouseCursorForRow (int row); -}; +private: + #if ! JUCE_DISABLE_ASSERTIONS + friend class ListBox; + struct Empty {}; + std::shared_ptr sharedState = std::make_shared(); + #endif +}; //============================================================================== /** @@ -187,6 +193,11 @@ public: The model pointer passed-in can be null, in which case you can set it later with setModel(). + + The ListBoxModel instance must stay alive for as long as the ListBox + holds a pointer to it. Be careful to destroy the ListBox before the + ListBoxModel, or to call ListBox::setModel (nullptr) before destroying + the ListBoxModel. */ ListBox (const String& componentName = String(), ListBoxModel* model = nullptr); @@ -194,14 +205,25 @@ public: /** Destructor. */ ~ListBox() override; - //============================================================================== - /** Changes the current data model to display. */ + /** Changes the current data model to display. + + The ListBoxModel instance must stay alive for as long as the ListBox + holds a pointer to it. Be careful to destroy the ListBox before the + ListBoxModel, or to call ListBox::setModel (nullptr) before destroying + the ListBoxModel. + */ void setModel (ListBoxModel* newModel); /** Returns the current list model. */ - ListBoxModel* getModel() const noexcept { return model; } + ListBoxModel* getModel() const noexcept + { + #if ! JUCE_DISABLE_ASSERTIONS + checkModelPtrIsValid(); + #endif + return model; + } //============================================================================== /** Causes the list to refresh its content. @@ -584,7 +606,7 @@ private: JUCE_PUBLIC_IN_DLL_BUILD (class RowComponent) friend class ListViewport; friend class TableListBox; - ListBoxModel* model; + ListBoxModel* model = nullptr; std::unique_ptr viewport; std::unique_ptr headerComponent; std::unique_ptr mouseMoveSelector; @@ -594,6 +616,12 @@ private: int lastRowSelected = -1; bool multipleSelection = false, alwaysFlipSelection = false, hasDoneInitialUpdate = false, selectOnMouseDown = true; + #if ! JUCE_DISABLE_ASSERTIONS + std::weak_ptr weakModelPtr; + #endif + + void assignModelPtr (ListBoxModel*); + void checkModelPtrIsValid() const; std::unique_ptr createAccessibilityHandler() override; bool hasAccessibleHeaderComponent() const; void selectRowInternal (int rowNumber, bool dontScrollToShowThisRow, diff --git a/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp b/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp index a2edcb4c..7c956e1c 100644 --- a/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp +++ b/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_ProgressBar.h b/modules/juce_gui_basics/widgets/juce_ProgressBar.h index 1a499871..ea7bc35b 100644 --- a/modules/juce_gui_basics/widgets/juce_ProgressBar.h +++ b/modules/juce_gui_basics/widgets/juce_ProgressBar.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_Slider.cpp b/modules/juce_gui_basics/widgets/juce_Slider.cpp index 18c41641..1e9b6ad7 100644 --- a/modules/juce_gui_basics/widgets/juce_Slider.cpp +++ b/modules/juce_gui_basics/widgets/juce_Slider.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,6 +26,14 @@ namespace juce { +static double getStepSize (const Slider& slider) +{ + const auto interval = slider.getInterval(); + + return interval != 0.0 ? interval + : slider.getRange().getLength() * 0.01; +} + class Slider::Pimpl : public AsyncUpdater, // this needs to be public otherwise it will cause an // error when JUCE_DLL_BUILD=1 private Value::Listener @@ -991,6 +999,38 @@ public: popupDisplay.reset(); } + bool keyPressed (const KeyPress& key) + { + if (key.getModifiers().isAnyModifierKeyDown()) + return false; + + const auto getInterval = [this] + { + if (auto* accessibility = owner.getAccessibilityHandler()) + if (auto* valueInterface = accessibility->getValueInterface()) + return valueInterface->getRange().getInterval(); + + return getStepSize (owner); + }; + + const auto valueChange = [&] + { + if (key == KeyPress::rightKey || key == KeyPress::upKey) + return getInterval(); + + if (key == KeyPress::leftKey || key == KeyPress::downKey) + return -getInterval(); + + return 0.0; + }(); + + if (valueChange == 0.0) + return false; + + setValue (getValue() + valueChange, sendNotificationSync); + return true; + } + void showPopupDisplay() { if (style == IncDecButtons) @@ -1661,6 +1701,9 @@ void Slider::mouseExit (const MouseEvent&) { pimpl->mouseExit(); } // it is shown when dragging the mouse over a slider and releasing void Slider::mouseEnter (const MouseEvent&) { pimpl->mouseMove(); } +/** @internal */ +bool Slider::keyPressed (const KeyPress& k) { return pimpl->keyPressed (k); } + void Slider::modifierKeysChanged (const ModifierKeys& modifiers) { if (isEnabled()) @@ -1734,18 +1777,10 @@ private: AccessibleValueRange getRange() const override { return { { slider.getMinimum(), slider.getMaximum() }, - getStepSize() }; + getStepSize (slider) }; } private: - double getStepSize() const - { - auto interval = slider.getInterval(); - - return interval != 0.0 ? interval - : slider.getRange().getLength() * 0.01; - } - Slider& slider; const bool useMaxValue; diff --git a/modules/juce_gui_basics/widgets/juce_Slider.h b/modules/juce_gui_basics/widgets/juce_Slider.h index df95a5f2..c05cc33a 100644 --- a/modules/juce_gui_basics/widgets/juce_Slider.h +++ b/modules/juce_gui_basics/widgets/juce_Slider.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -991,6 +991,8 @@ public: void mouseExit (const MouseEvent&) override; /** @internal */ void mouseEnter (const MouseEvent&) override; + /** @internal */ + bool keyPressed (const KeyPress&) override; //============================================================================== #ifndef DOXYGEN diff --git a/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp b/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp index 94cabd58..6a787d95 100644 --- a/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp +++ b/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -38,7 +38,7 @@ public: void paint (Graphics& g) override { - g.drawImageAt (image, 0, 0); + g.drawImage (image, getLocalBounds().toFloat()); } Image image; @@ -694,7 +694,7 @@ void TableHeaderComponent::beginDrag (const MouseEvent& e) auto temp = columnIdBeingDragged; columnIdBeingDragged = 0; - dragOverlayComp.reset (new DragOverlayComp (createComponentSnapshot (columnRect, false))); + dragOverlayComp.reset (new DragOverlayComp (createComponentSnapshot (columnRect, false, 2.0f))); addAndMakeVisible (dragOverlayComp.get()); columnIdBeingDragged = temp; diff --git a/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h b/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h index 624bb5b8..8a6034de 100644 --- a/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h +++ b/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_TableListBox.cpp b/modules/juce_gui_basics/widgets/juce_TableListBox.cpp index 6f7d5c2c..f513b3c5 100644 --- a/modules/juce_gui_basics/widgets/juce_TableListBox.cpp +++ b/modules/juce_gui_basics/widgets/juce_TableListBox.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -346,7 +346,7 @@ private: TableListBox::TableListBox (const String& name, TableListBoxModel* const m) : ListBox (name, nullptr), model (m) { - ListBox::model = this; + ListBox::assignModelPtr (this); setHeader (std::make_unique
(*this)); } diff --git a/modules/juce_gui_basics/widgets/juce_TableListBox.h b/modules/juce_gui_basics/widgets/juce_TableListBox.h index 44026657..141fdd2d 100644 --- a/modules/juce_gui_basics/widgets/juce_TableListBox.h +++ b/modules/juce_gui_basics/widgets/juce_TableListBox.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_TextEditor.cpp b/modules/juce_gui_basics/widgets/juce_TextEditor.cpp index d5f98c2f..5c2055be 100644 --- a/modules/juce_gui_basics/widgets/juce_TextEditor.cpp +++ b/modules/juce_gui_basics/widgets/juce_TextEditor.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -868,6 +868,12 @@ struct TextEditor::TextHolderComponent : public Component, TextEditor& owner; +private: + std::unique_ptr createAccessibilityHandler() override + { + return createIgnoredAccessibilityHandler (*this); + } + JUCE_DECLARE_NON_COPYABLE (TextHolderComponent) }; @@ -894,6 +900,11 @@ struct TextEditor::TextEditorViewport : public Viewport } private: + std::unique_ptr createAccessibilityHandler() override + { + return createIgnoredAccessibilityHandler (*this); + } + TextEditor& owner; int lastWordWrapWidth = 0; bool reentrant = false; @@ -933,13 +944,13 @@ TextEditor::TextEditor (const String& name, juce_wchar passwordChar) setWantsKeyboardFocus (true); recreateCaret(); + + juce::Desktop::getInstance().addGlobalMouseListener (this); } TextEditor::~TextEditor() { - if (wasFocused) - if (auto* peer = getPeer()) - peer->dismissPendingTextInput(); + juce::Desktop::getInstance().removeGlobalMouseListener (this); textValue.removeListener (textHolder); textValue.referTo (Value()); @@ -1017,9 +1028,17 @@ void TextEditor::setReadOnly (bool shouldBeReadOnly) readOnly = shouldBeReadOnly; enablementChanged(); invalidateAccessibilityHandler(); + + if (auto* peer = getPeer()) + peer->refreshTextInputTarget(); } } +void TextEditor::setClicksOutsideDismissVirtualKeyboard (bool newValue) +{ + clicksOutsideDismissVirtualKeyboard = newValue; +} + bool TextEditor::isReadOnly() const noexcept { return readOnly || ! isEnabled(); @@ -1027,7 +1046,7 @@ bool TextEditor::isReadOnly() const noexcept bool TextEditor::isTextInputActive() const { - return ! isReadOnly(); + return ! isReadOnly() && (! clicksOutsideDismissVirtualKeyboard || mouseDownInEditor); } void TextEditor::setReturnKeyStartsNewLine (bool shouldStartNewLine) @@ -1322,13 +1341,7 @@ void TextEditor::timerCallbackInt() void TextEditor::checkFocus() { if (! wasFocused && hasKeyboardFocus (false) && ! isCurrentlyBlockedByAnotherModalComponent()) - { wasFocused = true; - - if (auto* peer = getPeer()) - if (! isReadOnly()) - peer->textInputRequired (peer->globalToLocal (getScreenPosition()), *this); - } } void TextEditor::repaintText (Range range) @@ -1827,6 +1840,11 @@ void TextEditor::performPopupMenuAction (const int menuItemID) //============================================================================== void TextEditor::mouseDown (const MouseEvent& e) { + mouseDownInEditor = e.originalComponent == this; + + if (! mouseDownInEditor) + return; + beginDragAutoRepeat (100); newTransaction(); @@ -1838,7 +1856,7 @@ void TextEditor::mouseDown (const MouseEvent& e) e.mods.isShiftDown()); if (auto* peer = getPeer()) - peer->dismissPendingTextInput(); + peer->closeInputMethodContext(); } else { @@ -1865,6 +1883,9 @@ void TextEditor::mouseDown (const MouseEvent& e) void TextEditor::mouseDrag (const MouseEvent& e) { + if (! mouseDownInEditor) + return; + if (wasFocused || ! selectAllTextWhenFocused) if (! (popupMenuEnabled && e.mods.isPopupMenu())) moveCaretTo (getTextIndexAt (e.x, e.y), true); @@ -1872,6 +1893,9 @@ void TextEditor::mouseDrag (const MouseEvent& e) void TextEditor::mouseUp (const MouseEvent& e) { + if (! mouseDownInEditor) + return; + newTransaction(); textHolder->restartTimer(); @@ -1884,6 +1908,9 @@ void TextEditor::mouseUp (const MouseEvent& e) void TextEditor::mouseDoubleClick (const MouseEvent& e) { + if (! mouseDownInEditor) + return; + int tokenEnd = getTextIndexAt (e.x, e.y); int tokenStart = 0; @@ -1950,6 +1977,9 @@ void TextEditor::mouseDoubleClick (const MouseEvent& e) void TextEditor::mouseWheelMove (const MouseEvent& e, const MouseWheelDetails& wheel) { + if (! mouseDownInEditor) + return; + if (! viewport->useMouseWheelMoveIfNeeded (e, wheel)) Component::mouseWheelMove (e, wheel); } @@ -1961,7 +1991,7 @@ bool TextEditor::moveCaretWithTransaction (const int newPos, const bool selectin moveCaretTo (newPos, selecting); if (auto* peer = getPeer()) - peer->dismissPendingTextInput(); + peer->closeInputMethodContext(); return true; } @@ -2214,9 +2244,6 @@ void TextEditor::focusLost (FocusChangeType) underlinedSections.clear(); - if (auto* peer = getPeer()) - peer->dismissPendingTextInput(); - updateCaretPosition(); postCommandMessage (TextEditorDefs::focusLossMessageId); @@ -2668,10 +2695,10 @@ void TextEditor::coalesceSimilarSections() } //============================================================================== -class TextEditorAccessibilityHandler : public AccessibilityHandler +class TextEditor::EditorAccessibilityHandler : public AccessibilityHandler { public: - explicit TextEditorAccessibilityHandler (TextEditor& textEditorToWrap) + explicit EditorAccessibilityHandler (TextEditor& textEditorToWrap) : AccessibilityHandler (textEditorToWrap, textEditorToWrap.isReadOnly() ? AccessibilityRole::staticText : AccessibilityRole::editableText, {}, @@ -2699,10 +2726,20 @@ private: void setSelection (Range r) override { + if (r == textEditor.getHighlightedRegion()) + return; + if (r.isEmpty()) + { textEditor.setCaretPosition (r.getStart()); + } else - textEditor.setHighlightedRegion (r); + { + const auto cursorAtStart = r.getEnd() == textEditor.getHighlightedRegion().getStart() + || r.getEnd() == textEditor.getHighlightedRegion().getEnd(); + textEditor.moveCaretTo (cursorAtStart ? r.getEnd() : r.getStart(), false); + textEditor.moveCaretTo (cursorAtStart ? r.getStart() : r.getEnd(), true); + } } String getText (Range r) const override @@ -2748,12 +2785,12 @@ private: TextEditor& textEditor; //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TextEditorAccessibilityHandler) + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EditorAccessibilityHandler) }; std::unique_ptr TextEditor::createAccessibilityHandler() { - return std::make_unique (*this); + return std::make_unique (*this); } } // namespace juce diff --git a/modules/juce_gui_basics/widgets/juce_TextEditor.h b/modules/juce_gui_basics/widgets/juce_TextEditor.h index ce544248..d817e5ec 100644 --- a/modules/juce_gui_basics/widgets/juce_TextEditor.h +++ b/modules/juce_gui_basics/widgets/juce_TextEditor.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -665,8 +665,24 @@ public: void setInputRestrictions (int maxTextLength, const String& allowedCharacters = String()); + /** Sets the type of virtual keyboard that should be displayed when this editor has + focus. + */ void setKeyboardType (VirtualKeyboardType type) noexcept { keyboardType = type; } + /** Sets the behaviour of mouse/touch interactions outside this component. + + If true, then presses outside of the TextEditor will dismiss the virtual keyboard. + If false, then the virtual keyboard will remain onscreen for as long as the TextEditor has + keyboard focus. + */ + void setClicksOutsideDismissVirtualKeyboard (bool); + + /** Returns true if the editor is configured to hide the virtual keyboard when the mouse is + pressed on another component. + */ + bool getClicksOutsideDismissVirtualKeyboard() const { return clicksOutsideDismissVirtualKeyboard; } + //============================================================================== /** This abstract base class is implemented by LookAndFeel classes to provide TextEditor drawing functionality. @@ -744,6 +760,7 @@ private: struct TextEditorViewport; struct InsertAction; struct RemoveAction; + class EditorAccessibilityHandler; std::unique_ptr viewport; TextHolderComponent* textHolder; @@ -765,6 +782,8 @@ private: bool valueTextNeedsUpdating = false; bool consumeEscAndReturnKeys = true; bool underlineWhitespace = true; + bool mouseDownInEditor = false; + bool clicksOutsideDismissVirtualKeyboard = false; UndoManager undoManager; std::unique_ptr caret; diff --git a/modules/juce_gui_basics/widgets/juce_Toolbar.cpp b/modules/juce_gui_basics/widgets/juce_Toolbar.cpp index 6a8c08e5..f32a5a69 100644 --- a/modules/juce_gui_basics/widgets/juce_Toolbar.cpp +++ b/modules/juce_gui_basics/widgets/juce_Toolbar.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_Toolbar.h b/modules/juce_gui_basics/widgets/juce_Toolbar.h index 992f1bf4..eceb4255 100644 --- a/modules/juce_gui_basics/widgets/juce_Toolbar.h +++ b/modules/juce_gui_basics/widgets/juce_Toolbar.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp b/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp index e42f0e61..9c921740 100644 --- a/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp +++ b/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -247,7 +247,7 @@ std::unique_ptr ToolbarItemComponent::createAccessibilityH && itemId != ToolbarItemFactory::flexibleSpacerId); if (! shouldItemBeAccessible) - return nullptr; + return createIgnoredAccessibilityHandler (*this); return std::make_unique (*this, AccessibilityRole::button); } diff --git a/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h b/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h index e15b9c5f..862d537c 100644 --- a/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h +++ b/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h b/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h index 92ff4eff..981c9491 100644 --- a/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h +++ b/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp b/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp index 8f2bd606..d727cd01 100644 --- a/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp +++ b/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h b/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h index db6dcc06..10e54588 100644 --- a/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h +++ b/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_TreeView.cpp b/modules/juce_gui_basics/widgets/juce_TreeView.cpp index ba5e4a8b..e5941ae4 100644 --- a/modules/juce_gui_basics/widgets/juce_TreeView.cpp +++ b/modules/juce_gui_basics/widgets/juce_TreeView.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/widgets/juce_TreeView.h b/modules/juce_gui_basics/widgets/juce_TreeView.h index 85f57fc7..51b3f64e 100644 --- a/modules/juce_gui_basics/widgets/juce_TreeView.h +++ b/modules/juce_gui_basics/widgets/juce_TreeView.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_AlertWindow.cpp b/modules/juce_gui_basics/windows/juce_AlertWindow.cpp index 7ff1a935..14de42fa 100644 --- a/modules/juce_gui_basics/windows/juce_AlertWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_AlertWindow.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_AlertWindow.h b/modules/juce_gui_basics/windows/juce_AlertWindow.h index 8048454b..2e4b0e9b 100644 --- a/modules/juce_gui_basics/windows/juce_AlertWindow.h +++ b/modules/juce_gui_basics/windows/juce_AlertWindow.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_CallOutBox.cpp b/modules/juce_gui_basics/windows/juce_CallOutBox.cpp index 3b08875d..db1a8d48 100644 --- a/modules/juce_gui_basics/windows/juce_CallOutBox.cpp +++ b/modules/juce_gui_basics/windows/juce_CallOutBox.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_CallOutBox.h b/modules/juce_gui_basics/windows/juce_CallOutBox.h index 42231557..bc547d2d 100644 --- a/modules/juce_gui_basics/windows/juce_CallOutBox.h +++ b/modules/juce_gui_basics/windows/juce_CallOutBox.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp b/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp index a29c74a0..3ab01734 100644 --- a/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp +++ b/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -34,12 +34,15 @@ ComponentPeer::ComponentPeer (Component& comp, int flags) styleFlags (flags), uniqueID (lastUniquePeerID += 2) // increment by 2 so that this can never hit 0 { - Desktop::getInstance().peers.add (this); + auto& desktop = Desktop::getInstance(); + desktop.peers.add (this); + desktop.addFocusChangeListener (this); } ComponentPeer::~ComponentPeer() { auto& desktop = Desktop::getInstance(); + desktop.removeFocusChangeListener (this); desktop.peers.removeFirstMatchingValue (this); desktop.triggerFocusCallback(); } @@ -262,6 +265,19 @@ void ComponentPeer::handleModifierKeysChange() target->internalModifierKeysChanged(); } +void ComponentPeer::refreshTextInputTarget() +{ + const auto* lastTarget = std::exchange (textInputTarget, findCurrentTextInputTarget()); + + if (lastTarget == textInputTarget) + return; + + if (textInputTarget == nullptr) + dismissPendingTextInput(); + else if (auto* c = Component::getCurrentlyFocusedComponent()) + textInputRequired (globalToLocal (c->getScreenPosition()), *textInputTarget); +} + TextInputTarget* ComponentPeer::findCurrentTextInputTarget() { auto* c = Component::getCurrentlyFocusedComponent(); @@ -274,7 +290,12 @@ TextInputTarget* ComponentPeer::findCurrentTextInputTarget() return nullptr; } -void ComponentPeer::dismissPendingTextInput() {} +void ComponentPeer::closeInputMethodContext() {} + +void ComponentPeer::dismissPendingTextInput() +{ + closeInputMethodContext(); +} //============================================================================== void ComponentPeer::handleBroughtToFront() @@ -586,4 +607,9 @@ void ComponentPeer::forceDisplayUpdate() Desktop::getInstance().displays->refresh(); } +void ComponentPeer::globalFocusChanged (Component*) +{ + refreshTextInputTarget(); +} + } // namespace juce diff --git a/modules/juce_gui_basics/windows/juce_ComponentPeer.h b/modules/juce_gui_basics/windows/juce_ComponentPeer.h index 06c0a729..64084b9d 100644 --- a/modules/juce_gui_basics/windows/juce_ComponentPeer.h +++ b/modules/juce_gui_basics/windows/juce_ComponentPeer.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -40,39 +40,42 @@ namespace juce @tags{GUI} */ -class JUCE_API ComponentPeer +class JUCE_API ComponentPeer : private FocusChangeListener { public: //============================================================================== /** A combination of these flags is passed to the ComponentPeer constructor. */ enum StyleFlags { - windowAppearsOnTaskbar = (1 << 0), /**< Indicates that the window should have a corresponding - entry on the taskbar (ignored on MacOSX) */ - windowIsTemporary = (1 << 1), /**< Indicates that the window is a temporary popup, like a menu, - tooltip, etc. */ - windowIgnoresMouseClicks = (1 << 2), /**< Indicates that the window should let mouse clicks pass - through it (may not be possible on some platforms). */ - windowHasTitleBar = (1 << 3), /**< Indicates that the window should have a normal OS-specific - title bar and frame. if not specified, the window will be - borderless. */ - windowIsResizable = (1 << 4), /**< Indicates that the window should have a resizable border. */ - windowHasMinimiseButton = (1 << 5), /**< Indicates that if the window has a title bar, it should have a - minimise button on it. */ - windowHasMaximiseButton = (1 << 6), /**< Indicates that if the window has a title bar, it should have a - maximise button on it. */ - windowHasCloseButton = (1 << 7), /**< Indicates that if the window has a title bar, it should have a - close button on it. */ - windowHasDropShadow = (1 << 8), /**< Indicates that the window should have a drop-shadow (this may - not be possible on all platforms). */ - windowRepaintedExplictly = (1 << 9), /**< Not intended for public use - this tells a window not to - do its own repainting, but only to repaint when the - performAnyPendingRepaintsNow() method is called. */ - windowIgnoresKeyPresses = (1 << 10), /**< Tells the window not to catch any keypresses. This can - be used for things like plugin windows, to stop them interfering - with the host's shortcut keys. This will prevent the window from - gaining keyboard focus. */ - windowIsSemiTransparent = (1 << 30) /**< Not intended for public use - makes a window transparent. */ + windowAppearsOnTaskbar = (1 << 0), /**< Indicates that the window should have a corresponding + entry on the taskbar (ignored on MacOSX) */ + windowIsTemporary = (1 << 1), /**< Indicates that the window is a temporary popup, like a menu, + tooltip, etc. */ + windowIgnoresMouseClicks = (1 << 2), /**< Indicates that the window should let mouse clicks pass + through it (may not be possible on some platforms). */ + windowHasTitleBar = (1 << 3), /**< Indicates that the window should have a normal OS-specific + title bar and frame. if not specified, the window will be + borderless. */ + windowIsResizable = (1 << 4), /**< Indicates that the window should have a resizable border. */ + windowHasMinimiseButton = (1 << 5), /**< Indicates that if the window has a title bar, it should have a + minimise button on it. */ + windowHasMaximiseButton = (1 << 6), /**< Indicates that if the window has a title bar, it should have a + maximise button on it. */ + windowHasCloseButton = (1 << 7), /**< Indicates that if the window has a title bar, it should have a + close button on it. */ + windowHasDropShadow = (1 << 8), /**< Indicates that the window should have a drop-shadow (this may + not be possible on all platforms). */ + windowRepaintedExplictly = (1 << 9), /**< Not intended for public use - this tells a window not to + do its own repainting, but only to repaint when the + performAnyPendingRepaintsNow() method is called. */ + windowIgnoresKeyPresses = (1 << 10), /**< Tells the window not to catch any keypresses. This can + be used for things like plugin windows, to stop them interfering + with the host's shortcut keys. */ + windowRequiresSynchronousCoreGraphicsRendering = (1 << 11), /**< Indicates that the window should not be rendered with + asynchronous Core Graphics drawing operations. Use this if there + are issues with regions not being redrawn at the expected time + (macOS and iOS only). */ + windowIsSemiTransparent = (1 << 30) /**< Not intended for public use - makes a window transparent. */ }; @@ -132,7 +135,7 @@ public: ComponentPeer (Component& component, int styleFlags); /** Destructor. */ - virtual ~ComponentPeer(); + ~ComponentPeer() override; //============================================================================== /** Returns the component being represented by this peer. */ @@ -353,16 +356,19 @@ public: /** Called whenever a modifier key is pressed or released. */ void handleModifierKeysChange(); - //============================================================================== - /** Tells the window that text input may be required at the given position. - This may cause things like a virtual on-screen keyboard to appear, depending - on the OS. + /** If there's a currently active input-method context - i.e. characters are being + composed using multiple keystrokes - this should commit the current state of the + context to the text and clear the context. This should not hide the virtual keyboard. */ - virtual void textInputRequired (Point position, TextInputTarget&) = 0; + virtual void closeInputMethodContext(); - /** If there's some kind of OS input-method in progress, this should dismiss it. */ - virtual void dismissPendingTextInput(); + /** Alerts the peer that the current text input target has changed somehow. + The peer may hide or show the virtual keyboard as a result of this call. + */ + void refreshTextInputTarget(); + + //============================================================================== /** Returns the currently focused TextInputTarget, or null if none is found. */ TextInputTarget* findCurrentTextInputTarget(); @@ -524,10 +530,30 @@ private: //============================================================================== virtual void appStyleChanged() {} + /** Tells the window that text input may be required at the given position. + This may cause things like a virtual on-screen keyboard to appear, depending + on the OS. + + This function should not be called directly by Components - use refreshTextInputTarget + instead. + */ + virtual void textInputRequired (Point, TextInputTarget&) = 0; + + /** If there's some kind of OS input-method in progress, this should dismiss it. + + Overrides of this function should call closeInputMethodContext(). + + This function should not be called directly by Components - use refreshTextInputTarget + instead. + */ + virtual void dismissPendingTextInput(); + + void globalFocusChanged (Component*) override; Component* getTargetForKeyPress(); WeakReference lastFocusedComponent, dragAndDropTargetComponent; Component* lastDragAndDropCompUnderMouse = nullptr; + TextInputTarget* textInputTarget = nullptr; const uint32 uniqueID; bool isWindowMinimised = false; diff --git a/modules/juce_gui_basics/windows/juce_DialogWindow.cpp b/modules/juce_gui_basics/windows/juce_DialogWindow.cpp index 37067b2f..b024f9dd 100644 --- a/modules/juce_gui_basics/windows/juce_DialogWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_DialogWindow.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_DialogWindow.h b/modules/juce_gui_basics/windows/juce_DialogWindow.h index faf25900..484a0838 100644 --- a/modules/juce_gui_basics/windows/juce_DialogWindow.h +++ b/modules/juce_gui_basics/windows/juce_DialogWindow.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp b/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp index d5d434e0..a92af63c 100644 --- a/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_DocumentWindow.h b/modules/juce_gui_basics/windows/juce_DocumentWindow.h index 6e794793..a74aa82d 100644 --- a/modules/juce_gui_basics/windows/juce_DocumentWindow.h +++ b/modules/juce_gui_basics/windows/juce_DocumentWindow.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_MessageBoxOptions.h b/modules/juce_gui_basics/windows/juce_MessageBoxOptions.h index f7c3f44c..3a4dc59d 100644 --- a/modules/juce_gui_basics/windows/juce_MessageBoxOptions.h +++ b/modules/juce_gui_basics/windows/juce_MessageBoxOptions.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_NativeMessageBox.h b/modules/juce_gui_basics/windows/juce_NativeMessageBox.h index 8f249da4..033d1a8b 100644 --- a/modules/juce_gui_basics/windows/juce_NativeMessageBox.h +++ b/modules/juce_gui_basics/windows/juce_NativeMessageBox.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp b/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp index 437475c7..8b711b50 100644 --- a/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -63,12 +63,12 @@ void ResizableWindow::initialise (const bool shouldAddToDesktop) /* ========================================================================== - In accordance with the terms of the JUCE 6 End-Use License Agreement, the + In accordance with the terms of the JUCE 7 End-Use License Agreement, the JUCE Code in SECTION A cannot be removed, changed or otherwise rendered ineffective unless you have a JUCE Indie or Pro license, or are using JUCE under the GPL v3 license. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence ========================================================================== */ diff --git a/modules/juce_gui_basics/windows/juce_ResizableWindow.h b/modules/juce_gui_basics/windows/juce_ResizableWindow.h index e185adde..b381b73f 100644 --- a/modules/juce_gui_basics/windows/juce_ResizableWindow.h +++ b/modules/juce_gui_basics/windows/juce_ResizableWindow.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp b/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp index 1b891b6f..4ec6b765 100644 --- a/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h b/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h index 91664e0c..0e6c3c42 100644 --- a/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h +++ b/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp b/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp index 86435e0f..6668448d 100644 --- a/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_TooltipWindow.h b/modules/juce_gui_basics/windows/juce_TooltipWindow.h index 34e27fbd..fb697258 100644 --- a/modules/juce_gui_basics/windows/juce_TooltipWindow.h +++ b/modules/juce_gui_basics/windows/juce_TooltipWindow.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp b/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp index 9982ce03..a4f00bf8 100644 --- a/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -301,7 +301,7 @@ void TopLevelWindow::centreAroundComponent (Component* c, const int width, const const auto scale = getDesktopScaleFactor() / Desktop::getInstance().getGlobalScaleFactor(); auto targetCentre = c->localPointToGlobal (c->getLocalBounds().getCentre()) / scale; - auto parentArea = c->getParentMonitorArea(); + auto parentArea = getLocalArea (nullptr, c->getParentMonitorArea()); if (auto* parent = getParentComponent()) { diff --git a/modules/juce_gui_basics/windows/juce_TopLevelWindow.h b/modules/juce_gui_basics/windows/juce_TopLevelWindow.h index 92ec8eca..2eb400a7 100644 --- a/modules/juce_gui_basics/windows/juce_TopLevelWindow.h +++ b/modules/juce_gui_basics/windows/juce_TopLevelWindow.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp b/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp index e6a7dcf0..d0e74c1f 100644 --- a/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp +++ b/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h b/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h index 784bc2d5..5780b674 100644 --- a/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h +++ b/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h b/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h index 896dc9e2..6843f14c 100644 --- a/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h +++ b/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -111,7 +111,7 @@ struct CppTokeniserFunctions static int parseIdentifier (Iterator& source) noexcept { int tokenLength = 0; - String::CharPointerType::CharType possibleIdentifier[100]; + String::CharPointerType::CharType possibleIdentifier[100] = {}; String::CharPointerType possible (possibleIdentifier); while (isIdentifierBody (source.peekNextChar())) diff --git a/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp b/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp index c4e32fbe..0d0f2358 100644 --- a/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp +++ b/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/code_editor/juce_CodeDocument.h b/modules/juce_gui_extra/code_editor/juce_CodeDocument.h index 21eda641..998fc95c 100644 --- a/modules/juce_gui_extra/code_editor/juce_CodeDocument.h +++ b/modules/juce_gui_extra/code_editor/juce_CodeDocument.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp index de0159e1..95db8b9c 100644 --- a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp +++ b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -71,6 +71,9 @@ private: void setSelection (Range r) override { + if (r == codeEditorComponent.getHighlightedRegion()) + return; + if (r.isEmpty()) { codeEditorComponent.caretPos.setPosition (r.getStart()); @@ -79,8 +82,10 @@ private: auto& doc = codeEditorComponent.document; - codeEditorComponent.selectRegion (CodeDocument::Position (doc, r.getStart()), - CodeDocument::Position (doc, r.getEnd())); + const auto cursorAtStart = r.getEnd() == codeEditorComponent.getHighlightedRegion().getStart() + || r.getEnd() == codeEditorComponent.getHighlightedRegion().getEnd(); + codeEditorComponent.selectRegion (CodeDocument::Position (doc, cursorAtStart ? r.getEnd() : r.getStart()), + CodeDocument::Position (doc, cursorAtStart ? r.getStart() : r.getEnd())); } String getText (Range r) const override @@ -126,7 +131,7 @@ private: localRects.add (startPos.x, startPos.y, - endPos.x - startPos.x, + jmax (1, endPos.x - startPos.x), codeEditorComponent.getLineHeight()); } diff --git a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h index 8cb8577f..19f36daf 100644 --- a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h +++ b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h b/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h index c398ae67..67656c4a 100644 --- a/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h +++ b/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp b/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp index 99a3dada..f046c4f7 100644 --- a/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp +++ b/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -78,7 +78,7 @@ struct LuaTokeniserFunctions static int parseIdentifier (Iterator& source) noexcept { int tokenLength = 0; - String::CharPointerType::CharType possibleIdentifier[100]; + String::CharPointerType::CharType possibleIdentifier[100] = {}; String::CharPointerType possible (possibleIdentifier); while (CppTokeniserFunctions::isIdentifierBody (source.peekNextChar())) diff --git a/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h b/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h index 8e1f39a6..7e37c5ff 100644 --- a/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h +++ b/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp b/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp index be04178f..edde13e9 100644 --- a/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp +++ b/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h b/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h index 0025c2b4..0dae2dfb 100644 --- a/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h +++ b/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp b/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp index 7be1056b..d41832d7 100644 --- a/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp +++ b/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/documents/juce_FileBasedDocument.h b/modules/juce_gui_extra/documents/juce_FileBasedDocument.h index 3f633aee..277a1c84 100644 --- a/modules/juce_gui_extra/documents/juce_FileBasedDocument.h +++ b/modules/juce_gui_extra/documents/juce_FileBasedDocument.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h b/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h index 964b7b8b..bb99430f 100644 --- a/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h +++ b/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h b/modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h index 3de06939..d2211e1a 100644 --- a/modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h +++ b/modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/embedding/juce_HWNDComponent.h b/modules/juce_gui_extra/embedding/juce_HWNDComponent.h index dc7c4492..9376e04d 100644 --- a/modules/juce_gui_extra/embedding/juce_HWNDComponent.h +++ b/modules/juce_gui_extra/embedding/juce_HWNDComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -71,6 +71,9 @@ public: /** Resizes this component to fit the HWND that it contains. */ void resizeToFit(); + /** Forces the bounds of the HWND to match the bounds of this component. */ + void updateHWNDBounds(); + /** @internal */ void paint (Graphics&) override; diff --git a/modules/juce_gui_extra/embedding/juce_NSViewComponent.h b/modules/juce_gui_extra/embedding/juce_NSViewComponent.h index 897cc5e6..98760295 100644 --- a/modules/juce_gui_extra/embedding/juce_NSViewComponent.h +++ b/modules/juce_gui_extra/embedding/juce_NSViewComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/embedding/juce_UIViewComponent.h b/modules/juce_gui_extra/embedding/juce_UIViewComponent.h index 357551b3..a225e6a0 100644 --- a/modules/juce_gui_extra/embedding/juce_UIViewComponent.h +++ b/modules/juce_gui_extra/embedding/juce_UIViewComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/embedding/juce_XEmbedComponent.h b/modules/juce_gui_extra/embedding/juce_XEmbedComponent.h index b85de724..2966b0d2 100644 --- a/modules/juce_gui_extra/embedding/juce_XEmbedComponent.h +++ b/modules/juce_gui_extra/embedding/juce_XEmbedComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -96,6 +96,9 @@ public: /** Removes the client window from the host. */ void removeClient(); + /** Forces the embedded window to match the current size of this component. */ + void updateEmbeddedBounds(); + protected: //============================================================================== /** @internal */ diff --git a/modules/juce_gui_extra/juce_gui_extra.cpp b/modules/juce_gui_extra/juce_gui_extra.cpp index d78ca233..dbb4d75a 100644 --- a/modules/juce_gui_extra/juce_gui_extra.cpp +++ b/modules/juce_gui_extra/juce_gui_extra.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/juce_gui_extra.h b/modules/juce_gui_extra/juce_gui_extra.h index a7ca7529..b6f54c27 100644 --- a/modules/juce_gui_extra/juce_gui_extra.h +++ b/modules/juce_gui_extra/juce_gui_extra.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_gui_extra vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE extended GUI classes description: Miscellaneous GUI classes for specialised tasks. website: http://www.juce.com/juce diff --git a/modules/juce_gui_extra/juce_gui_extra.mm b/modules/juce_gui_extra/juce_gui_extra.mm index 5a580dc0..9f3493b7 100644 --- a/modules/juce_gui_extra/juce_gui_extra.mm +++ b/modules/juce_gui_extra/juce_gui_extra.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp b/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp index 70ea8557..f2798e48 100644 --- a/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp +++ b/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h b/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h index 34f63e1c..b4e55a81 100644 --- a/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h +++ b/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_AppleRemote.h b/modules/juce_gui_extra/misc/juce_AppleRemote.h index 41f22cc7..bdbe1c8a 100644 --- a/modules/juce_gui_extra/misc/juce_AppleRemote.h +++ b/modules/juce_gui_extra/misc/juce_AppleRemote.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp b/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp index 520e6e73..a8c10af9 100644 --- a/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp +++ b/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h b/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h index 437db81b..8dcf7f9a 100644 --- a/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h +++ b/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_ColourSelector.cpp b/modules/juce_gui_extra/misc/juce_ColourSelector.cpp index faa1a73d..91d01433 100644 --- a/modules/juce_gui_extra/misc/juce_ColourSelector.cpp +++ b/modules/juce_gui_extra/misc/juce_ColourSelector.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -411,12 +411,8 @@ ColourSelector::ColourSelector (int sectionsToShow, int edge, int gapAroundColou sliders[3]->setVisible ((flags & showAlphaChannel) != 0); - // VS2015 needs some scoping braces around this if statement to - // avoid a compiler bug. for (auto& slider : sliders) - { slider->onValueChange = [this] { changeColour(); }; - } } if ((flags & showColourspace) != 0) diff --git a/modules/juce_gui_extra/misc/juce_ColourSelector.h b/modules/juce_gui_extra/misc/juce_ColourSelector.h index 892f79c9..eb57d471 100644 --- a/modules/juce_gui_extra/misc/juce_ColourSelector.h +++ b/modules/juce_gui_extra/misc/juce_ColourSelector.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp b/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp index d41dbaf5..f89f0c7f 100644 --- a/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp +++ b/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h b/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h index a9d80081..422df3d4 100644 --- a/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h +++ b/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp b/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp index 4b422fac..0c87de87 100644 --- a/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp +++ b/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h b/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h index 3c0f9464..ddea280f 100644 --- a/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h +++ b/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp b/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp index f3efdc34..b90412cf 100644 --- a/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp +++ b/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_PreferencesPanel.h b/modules/juce_gui_extra/misc/juce_PreferencesPanel.h index 4ce8ab1e..f8f2cb05 100644 --- a/modules/juce_gui_extra/misc/juce_PreferencesPanel.h +++ b/modules/juce_gui_extra/misc/juce_PreferencesPanel.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_PushNotifications.cpp b/modules/juce_gui_extra/misc/juce_PushNotifications.cpp index 04b682e2..5642deb8 100644 --- a/modules/juce_gui_extra/misc/juce_PushNotifications.cpp +++ b/modules/juce_gui_extra/misc/juce_PushNotifications.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_PushNotifications.h b/modules/juce_gui_extra/misc/juce_PushNotifications.h index 6c56bcf2..52cf1dbc 100644 --- a/modules/juce_gui_extra/misc/juce_PushNotifications.h +++ b/modules/juce_gui_extra/misc/juce_PushNotifications.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp b/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp index a11ae05d..94fb3263 100644 --- a/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp +++ b/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h b/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h index 2bcd7e30..ee63029c 100644 --- a/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h +++ b/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_SplashScreen.cpp b/modules/juce_gui_extra/misc/juce_SplashScreen.cpp index 9169cfb1..6cd98a14 100644 --- a/modules/juce_gui_extra/misc/juce_SplashScreen.cpp +++ b/modules/juce_gui_extra/misc/juce_SplashScreen.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_SplashScreen.h b/modules/juce_gui_extra/misc/juce_SplashScreen.h index ccff70b7..21c4981c 100644 --- a/modules/juce_gui_extra/misc/juce_SplashScreen.h +++ b/modules/juce_gui_extra/misc/juce_SplashScreen.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp b/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp index 50717c38..91e436d5 100644 --- a/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp +++ b/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h b/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h index bf58a6a7..e3f38557 100644 --- a/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h +++ b/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h b/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h index f52cf472..3ecdc5a6 100644 --- a/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h +++ b/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView.java b/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView.java index 8e3eb55e..8e7f4664 100644 --- a/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView.java +++ b/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView21.java b/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView21.java index 9f8cfa69..b61911c9 100644 --- a/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView21.java +++ b/modules/juce_gui_extra/native/java/app/com/rmsl/juce/JuceWebView21.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseInstanceIdService.java b/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseInstanceIdService.java index f1656a7d..7cd842a2 100644 --- a/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseInstanceIdService.java +++ b/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseInstanceIdService.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseMessagingService.java b/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseMessagingService.java index 13e8323e..dad2b0c3 100644 --- a/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseMessagingService.java +++ b/modules/juce_gui_extra/native/javaopt/app/com/rmsl/juce/JuceFirebaseMessagingService.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp b/modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp index 8f80566a..71da3cf4 100644 --- a/modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp +++ b/modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/juce_android_PushNotifications.cpp b/modules/juce_gui_extra/native/juce_android_PushNotifications.cpp index ae2f503f..87b461c0 100644 --- a/modules/juce_gui_extra/native/juce_android_PushNotifications.cpp +++ b/modules/juce_gui_extra/native/juce_android_PushNotifications.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp b/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp index ecb50df7..35adf391 100644 --- a/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp +++ b/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp b/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp index 9c17ed37..05c25dc7 100644 --- a/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp +++ b/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm b/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm index c606cd3c..b1c37316 100644 --- a/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm +++ b/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp b/modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp index d18a0c49..b3dd3d39 100644 --- a/modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp +++ b/modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp b/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp index 8956fb87..57e7dec8 100644 --- a/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp +++ b/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp b/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp index 53f254be..a56538de 100644 --- a/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp +++ b/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -257,6 +257,11 @@ public: return host; } + void updateEmbeddedBounds() + { + componentMovedOrResized (owner, true, true); + } + private: //============================================================================== XEmbedComponent& owner; @@ -612,7 +617,7 @@ private: if (auto* peer = owner.getPeer()) { auto r = peer->getComponent().getLocalArea (&owner, owner.getLocalBounds()); - return r * peer->getPlatformScaleFactor(); + return r * peer->getPlatformScaleFactor() * peer->getComponent().getDesktopScaleFactor(); } return owner.getLocalBounds(); @@ -687,6 +692,7 @@ void XEmbedComponent::focusLost (FocusChangeType changeType) { pimpl->focu void XEmbedComponent::broughtToFront() { pimpl->broughtToFront(); } unsigned long XEmbedComponent::getHostWindowID() { return pimpl->getHostWindowID(); } void XEmbedComponent::removeClient() { pimpl->setClient (0, true); } +void XEmbedComponent::updateEmbeddedBounds() { pimpl->updateEmbeddedBounds(); } //============================================================================== bool juce_handleXEmbedEvent (ComponentPeer* p, void* e) diff --git a/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm b/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm index c24f9555..014fa7f0 100644 --- a/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm +++ b/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h b/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h deleted file mode 100644 index 0e48ae84..00000000 --- a/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h +++ /dev/null @@ -1,346 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -namespace juce -{ - -//============================================================================== -/** - Creates a floating carbon window that can be used to hold a carbon UI. - - This is a handy class that's designed to be inlined where needed, e.g. - in the audio plugin hosting code. - - @tags{GUI} -*/ -class CarbonViewWrapperComponent : public Component, - public ComponentMovementWatcher, - public Timer -{ -public: - CarbonViewWrapperComponent() - : ComponentMovementWatcher (this), - carbonWindow (nil), - keepPluginWindowWhenHidden (false), - wrapperWindow (nil), - embeddedView (0), - recursiveResize (false), - repaintChildOnCreation (true) - { - } - - ~CarbonViewWrapperComponent() - { - jassert (embeddedView == 0); // must call deleteWindow() in the subclass's destructor! - } - - virtual HIViewRef attachView (WindowRef windowRef, HIViewRef rootView) = 0; - virtual void removeView (HIViewRef embeddedView) = 0; - virtual void handleMouseDown (int, int) {} - virtual void handlePaint() {} - - virtual bool getEmbeddedViewSize (int& w, int& h) - { - if (embeddedView == 0) - return false; - - HIRect bounds; - HIViewGetBounds (embeddedView, &bounds); - w = jmax (1, roundToInt (bounds.size.width)); - h = jmax (1, roundToInt (bounds.size.height)); - return true; - } - - void createWindow() - { - if (wrapperWindow == nil) - { - Rect r; - r.left = (short) getScreenX(); - r.top = (short) getScreenY(); - r.right = (short) (r.left + getWidth()); - r.bottom = (short) (r.top + getHeight()); - - CreateNewWindow (kDocumentWindowClass, - (WindowAttributes) (kWindowStandardHandlerAttribute | kWindowCompositingAttribute - | kWindowNoShadowAttribute | kWindowNoTitleBarAttribute), - &r, &wrapperWindow); - - jassert (wrapperWindow != 0); - if (wrapperWindow == 0) - return; - - carbonWindow = [[NSWindow alloc] initWithWindowRef: wrapperWindow]; - - [getOwnerWindow() addChildWindow: carbonWindow - ordered: NSWindowAbove]; - - embeddedView = attachView (wrapperWindow, HIViewGetRoot (wrapperWindow)); - - // Check for the plugin creating its own floating window, and if there is one, - // we need to reparent it to make it visible.. - if (carbonWindow.childWindows.count > 0) - if (NSWindow* floatingChildWindow = [[carbonWindow childWindows] objectAtIndex: 0]) - [getOwnerWindow() addChildWindow: floatingChildWindow - ordered: NSWindowAbove]; - - EventTypeSpec windowEventTypes[] = - { - { kEventClassWindow, kEventWindowGetClickActivation }, - { kEventClassWindow, kEventWindowHandleDeactivate }, - { kEventClassWindow, kEventWindowBoundsChanging }, - { kEventClassMouse, kEventMouseDown }, - { kEventClassMouse, kEventMouseMoved }, - { kEventClassMouse, kEventMouseDragged }, - { kEventClassMouse, kEventMouseUp }, - { kEventClassWindow, kEventWindowDrawContent }, - { kEventClassWindow, kEventWindowShown }, - { kEventClassWindow, kEventWindowHidden } - }; - - EventHandlerUPP upp = NewEventHandlerUPP (carbonEventCallback); - InstallWindowEventHandler (wrapperWindow, upp, - sizeof (windowEventTypes) / sizeof (EventTypeSpec), - windowEventTypes, this, &eventHandlerRef); - - setOurSizeToEmbeddedViewSize(); - setEmbeddedWindowToOurSize(); - - creationTime = Time::getCurrentTime(); - } - } - - void deleteWindow() - { - removeView (embeddedView); - embeddedView = 0; - - if (wrapperWindow != nil) - { - NSWindow* ownerWindow = getOwnerWindow(); - - if ([[ownerWindow childWindows] count] > 0) - { - [ownerWindow removeChildWindow: carbonWindow]; - [carbonWindow close]; - } - - RemoveEventHandler (eventHandlerRef); - DisposeWindow (wrapperWindow); - wrapperWindow = nil; - } - } - - //============================================================================== - void setOurSizeToEmbeddedViewSize() - { - int w, h; - if (getEmbeddedViewSize (w, h)) - { - if (w != getWidth() || h != getHeight()) - { - startTimer (50); - setSize (w, h); - - if (Component* p = getParentComponent()) - p->setSize (w, h); - } - else - { - startTimer (jlimit (50, 500, getTimerInterval() + 20)); - } - } - else - { - stopTimer(); - } - } - - void setEmbeddedWindowToOurSize() - { - if (! recursiveResize) - { - recursiveResize = true; - - if (embeddedView != 0) - { - HIRect r; - r.origin.x = 0; - r.origin.y = 0; - r.size.width = (float) getWidth(); - r.size.height = (float) getHeight(); - HIViewSetFrame (embeddedView, &r); - } - - if (wrapperWindow != nil) - { - jassert (getTopLevelComponent()->getDesktopScaleFactor() == 1.0f); - Rectangle screenBounds (getScreenBounds() * Desktop::getInstance().getGlobalScaleFactor()); - - Rect wr; - wr.left = (short) screenBounds.getX(); - wr.top = (short) screenBounds.getY(); - wr.right = (short) screenBounds.getRight(); - wr.bottom = (short) screenBounds.getBottom(); - - SetWindowBounds (wrapperWindow, kWindowContentRgn, &wr); - - // This group stuff is mainly a workaround for Mackie plugins like FinalMix.. - WindowGroupRef group = GetWindowGroup (wrapperWindow); - WindowRef attachedWindow; - - if (GetIndexedWindow (group, 2, kWindowGroupContentsReturnWindows, &attachedWindow) == noErr) - { - SelectWindow (attachedWindow); - ActivateWindow (attachedWindow, TRUE); - HideWindow (wrapperWindow); - } - - ShowWindow (wrapperWindow); - } - - recursiveResize = false; - } - } - - void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) override - { - setEmbeddedWindowToOurSize(); - } - - // (overridden to intercept movements of the top-level window) - void componentMovedOrResized (Component& component, bool wasMoved, bool wasResized) override - { - ComponentMovementWatcher::componentMovedOrResized (component, wasMoved, wasResized); - - if (&component == getTopLevelComponent()) - setEmbeddedWindowToOurSize(); - } - - void componentPeerChanged() override - { - deleteWindow(); - createWindow(); - } - - void componentVisibilityChanged() override - { - if (isShowing()) - createWindow(); - else if (! keepPluginWindowWhenHidden) - deleteWindow(); - - setEmbeddedWindowToOurSize(); - } - - static void recursiveHIViewRepaint (HIViewRef view) - { - HIViewSetNeedsDisplay (view, true); - HIViewRef child = HIViewGetFirstSubview (view); - - while (child != 0) - { - recursiveHIViewRepaint (child); - child = HIViewGetNextView (child); - } - } - - void timerCallback() override - { - if (isShowing()) - { - setOurSizeToEmbeddedViewSize(); - - // To avoid strange overpainting problems when the UI is first opened, we'll - // repaint it a few times during the first second that it's on-screen.. - if (repaintChildOnCreation && (Time::getCurrentTime() - creationTime).inMilliseconds() < 1000) - recursiveHIViewRepaint (HIViewGetRoot (wrapperWindow)); - } - } - - void setRepaintsChildHIViewWhenCreated (bool b) noexcept - { - repaintChildOnCreation = b; - } - - OSStatus carbonEventHandler (EventHandlerCallRef /*nextHandlerRef*/, EventRef event) - { - switch (GetEventKind (event)) - { - case kEventWindowHandleDeactivate: - ActivateWindow (wrapperWindow, TRUE); - return noErr; - - case kEventWindowGetClickActivation: - { - getTopLevelComponent()->toFront (false); - [carbonWindow makeKeyAndOrderFront: nil]; - - ClickActivationResult howToHandleClick = kActivateAndHandleClick; - - SetEventParameter (event, kEventParamClickActivation, typeClickActivationResult, - sizeof (ClickActivationResult), &howToHandleClick); - - if (embeddedView != 0) - HIViewSetNeedsDisplay (embeddedView, true); - - return noErr; - } - } - - return eventNotHandledErr; - } - - static pascal OSStatus carbonEventCallback (EventHandlerCallRef nextHandlerRef, EventRef event, void* userData) - { - return ((CarbonViewWrapperComponent*) userData)->carbonEventHandler (nextHandlerRef, event); - } - - NSWindow* carbonWindow; - bool keepPluginWindowWhenHidden; - -protected: - WindowRef wrapperWindow; - HIViewRef embeddedView; - bool recursiveResize, repaintChildOnCreation; - Time creationTime; - - EventHandlerRef eventHandlerRef; - - NSWindow* getOwnerWindow() const { return [((NSView*) getWindowHandle()) window]; } -}; - -//============================================================================== -// Non-public utility function that hosts can use if they need to get hold of the -// internals of a carbon wrapper window.. -void* getCarbonWindow (Component* possibleCarbonComponent) -{ - if (CarbonViewWrapperComponent* cv = dynamic_cast (possibleCarbonComponent)) - return cv->carbonWindow; - - return nullptr; -} - -} // namespace juce diff --git a/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm b/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm index 0a5ae11f..7c85aef6 100644 --- a/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm +++ b/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h b/modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h index 62f69a55..648931ce 100644 --- a/modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h +++ b/modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp b/modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp index 86b1ad65..f35ec878 100644 --- a/modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp +++ b/modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp b/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp index ca7537f4..fb90508f 100644 --- a/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp +++ b/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -26,7 +26,7 @@ namespace juce { -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new", "-Wdeprecated-declarations") +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") extern NSMenu* createNSMenu (const PopupMenu&, const String& name, int topLevelMenuId, int topLevelIndex, bool addDelegate); @@ -87,7 +87,7 @@ struct StatusItemContainer : public Timer }; //============================================================================== -struct ButtonBasedStatusItem : public StatusItemContainer +struct API_AVAILABLE (macos (10.10)) ButtonBasedStatusItem : public StatusItemContainer { //============================================================================== ButtonBasedStatusItem (SystemTrayIconComponent& iconComp, const Image& im) @@ -384,7 +384,7 @@ public: //============================================================================== Pimpl (SystemTrayIconComponent& iconComp, const Image& im) { - if (std::floor (NSFoundationVersionNumber) > NSFoundationVersionNumber10_10) + if (@available (macOS 10.10, *)) statusItemHolder = std::make_unique (iconComp, im); else statusItemHolder = std::make_unique (iconComp, im); diff --git a/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm b/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm index b12c8f54..6f4c5b20 100644 --- a/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm +++ b/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -32,7 +32,7 @@ namespace juce static NSURL* appendParametersToFileURL (const URL& url, NSURL* fileUrl) { - if (@available (macOS 10.9, *)) + if (@available (macOS 10.10, *)) { const auto parameterNames = url.getParameterNames(); const auto parameterValues = url.getParameterValues(); @@ -263,7 +263,7 @@ private: JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif -struct WebViewDelegateClass : public ObjCClass +struct API_AVAILABLE (macos (10.10)) WebViewDelegateClass : public ObjCClass { WebViewDelegateClass() : ObjCClass ("JUCEWebViewDelegate_") { @@ -339,7 +339,7 @@ private: } #if WKWEBVIEW_OPENPANEL_SUPPORTED - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") + API_AVAILABLE (macos (10.12)) static void runOpenPanel (id, SEL, WKWebView*, WKOpenPanelParameters* parameters, WKFrameInfo*, void (^completionHandler)(NSArray*)) { @@ -402,7 +402,6 @@ private: delete wrapper; }); } - JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif }; @@ -507,7 +506,7 @@ private: JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif -class WKWebViewImpl : public WebViewBase +class API_AVAILABLE (macos (10.11)) WKWebViewImpl : public WebViewBase { public: WKWebViewImpl (WebBrowserComponent* owner) @@ -587,7 +586,7 @@ class WebBrowserComponent::Pimpl public: Pimpl (WebBrowserComponent* owner) { - if (@available (macOS 10.10, *)) + if (@available (macOS 10.11, *)) webView = std::make_unique (owner); #if JUCE_MAC else diff --git a/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp b/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp index 82290703..29593758 100644 --- a/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp +++ b/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -485,6 +485,7 @@ intptr_t ActiveXControlComponent::offerEventToActiveXControlStatic (void* ptr) return S_FALSE; } +LRESULT juce_offerEventToActiveXControl (::MSG& msg); LRESULT juce_offerEventToActiveXControl (::MSG& msg) { if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST) diff --git a/modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp b/modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp index 09d872b4..0e8f1e8d 100644 --- a/modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp +++ b/modules/juce_gui_extra/native/juce_win32_HWNDComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -172,4 +172,10 @@ void HWNDComponent::resizeToFit() setBounds (pimpl->getHWNDBounds()); } +void HWNDComponent::updateHWNDBounds() +{ + if (pimpl != nullptr) + pimpl->componentMovedOrResized (true, true); +} + } // namespace juce diff --git a/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp b/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp index 6bef4160..ce221901 100644 --- a/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp +++ b/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp b/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp index 56db0f0b..04083be6 100644 --- a/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp +++ b/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/geometry/juce_Draggable3DOrientation.h b/modules/juce_opengl/geometry/juce_Draggable3DOrientation.h index dacf7be7..a1ceb725 100644 --- a/modules/juce_opengl/geometry/juce_Draggable3DOrientation.h +++ b/modules/juce_opengl/geometry/juce_Draggable3DOrientation.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/geometry/juce_Matrix3D.h b/modules/juce_opengl/geometry/juce_Matrix3D.h index e796cd14..eb652136 100644 --- a/modules/juce_opengl/geometry/juce_Matrix3D.h +++ b/modules/juce_opengl/geometry/juce_Matrix3D.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/geometry/juce_Quaternion.h b/modules/juce_opengl/geometry/juce_Quaternion.h index bf21a9c0..f26bb744 100644 --- a/modules/juce_opengl/geometry/juce_Quaternion.h +++ b/modules/juce_opengl/geometry/juce_Quaternion.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/geometry/juce_Vector3D.h b/modules/juce_opengl/geometry/juce_Vector3D.h index 13a6bb70..90fbf3ca 100644 --- a/modules/juce_opengl/geometry/juce_Vector3D.h +++ b/modules/juce_opengl/geometry/juce_Vector3D.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/juce_opengl.cpp b/modules/juce_opengl/juce_opengl.cpp index 7ba13522..7f2a1ae0 100644 --- a/modules/juce_opengl/juce_opengl.cpp +++ b/modules/juce_opengl/juce_opengl.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/juce_opengl.h b/modules/juce_opengl/juce_opengl.h index 5f03aa3e..a372a0ed 100644 --- a/modules/juce_opengl/juce_opengl.h +++ b/modules/juce_opengl/juce_opengl.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_opengl vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE OpenGL classes description: Classes for rendering OpenGL in a JUCE window. website: http://www.juce.com/juce diff --git a/modules/juce_opengl/juce_opengl.mm b/modules/juce_opengl/juce_opengl.mm index 7f12aac6..a5601f77 100644 --- a/modules/juce_opengl/juce_opengl.mm +++ b/modules/juce_opengl/juce_opengl.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/native/java/app/com/rmsl/juce/JuceOpenGLView.java b/modules/juce_opengl/native/java/app/com/rmsl/juce/JuceOpenGLView.java index bd07caae..03194e2a 100644 --- a/modules/juce_opengl/native/java/app/com/rmsl/juce/JuceOpenGLView.java +++ b/modules/juce_opengl/native/java/app/com/rmsl/juce/JuceOpenGLView.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,6 +27,7 @@ package com.rmsl.juce; import android.content.Context; import android.graphics.Canvas; +import android.graphics.Region; import android.view.SurfaceView; public class JuceOpenGLView extends SurfaceView @@ -45,6 +46,14 @@ public class JuceOpenGLView extends SurfaceView } //============================================================================== + @Override + public boolean gatherTransparentRegion (Region unused) + { + // Returning true indicates that the view is opaque at this point. + // Without this, the green TalkBack borders cannot be seen on OpenGL views. + return true; + } + @Override protected void onAttachedToWindow () { diff --git a/modules/juce_opengl/native/juce_OpenGLExtensions.h b/modules/juce_opengl/native/juce_OpenGLExtensions.h index 4f75ae5b..142a4688 100644 --- a/modules/juce_opengl/native/juce_OpenGLExtensions.h +++ b/modules/juce_opengl/native/juce_OpenGLExtensions.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/native/juce_OpenGL_android.h b/modules/juce_opengl/native/juce_OpenGL_android.h index 19f3da34..d6a642c5 100644 --- a/modules/juce_opengl/native/juce_OpenGL_android.h +++ b/modules/juce_opengl/native/juce_OpenGL_android.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -30,27 +30,77 @@ namespace juce // This byte-code is generated from native/java/com/rmsl/juce/JuceOpenGLView.java with min sdk version 16 // See juce_core/native/java/README.txt on how to generate this byte-code. static const uint8 javaJuceOpenGLView[] = -{31,139,8,8,95,114,161,94,0,3,74,117,99,101,79,112,101,110,71,76,86,105,101,119,83,117,114,102,97,99,101,46,100,101,120,0,109, -84,75,107,19,81,20,62,119,230,38,169,105,76,99,218,138,86,144,32,5,55,173,83,53,98,33,173,86,90,170,196,193,34,173,81,106,93, -12,147,169,153,210,204,196,100,154,22,65,40,110,234,170,43,23,34,46,93,22,87,62,138,27,65,168,235,174,213,133,11,23,254,129, -162,136,130,223,125,196,164,208,129,239,126,231,125,206,188,78,217,91,75,142,156,191,64,151,223,190,187,182,183,251,251,212,240, -247,216,223,197,205,174,170,255,233,209,230,135,123,183,222,252,225,68,53,34,90,43,229,179,164,175,5,216,142,145,178,199,129, -93,205,63,0,6,140,224,72,129,71,153,210,159,225,152,50,137,182,193,239,13,162,143,192,14,240,25,216,3,50,240,13,1,54,48,3,204, -2,119,128,5,192,1,124,224,1,240,16,120,2,108,2,207,129,87,192,14,240,5,248,9,196,184,234,7,145,32,82,76,207,149,208,136,233, -249,187,180,252,20,189,15,105,249,5,228,164,150,95,66,238,214,242,86,135,253,181,161,234,102,100,15,83,214,50,225,233,209,61,179, -154,251,100,127,46,253,226,76,73,86,113,92,199,113,76,218,171,245,62,173,247,75,54,232,168,182,183,238,69,92,134,230,188,42,139, -251,226,210,214,205,213,124,181,28,209,57,153,57,15,105,126,144,40,141,92,38,99,251,185,154,191,229,77,203,124,67,246,56,129, -227,8,56,204,49,154,163,217,9,68,161,236,89,52,28,197,51,19,122,109,162,155,248,205,180,124,6,76,206,51,216,202,201,136,26,7, -230,140,116,17,103,157,57,67,58,231,224,232,36,162,67,124,6,92,206,198,246,221,179,33,117,166,245,182,28,31,243,3,63,186,68,172, -72,189,197,21,215,155,169,121,193,85,187,228,123,171,103,150,156,166,67,199,109,39,40,215,67,191,108,185,97,16,121,65,100,77, -10,94,139,10,29,174,251,117,167,86,241,221,134,53,233,4,77,167,81,160,129,255,174,38,42,89,179,43,245,69,199,245,68,213,2,157, -180,221,176,106,213,171,141,101,107,9,13,173,253,93,11,196,74,100,148,138,100,150,138,54,4,27,130,93,164,184,235,4,174,183,44, -25,29,40,225,170,41,40,85,246,27,53,39,114,43,83,117,103,149,120,37,108,68,148,12,156,200,111,122,115,21,191,65,217,48,184,18, -69,142,91,241,202,115,225,109,63,40,135,171,212,47,109,194,164,12,55,100,56,245,133,193,148,167,66,167,235,97,85,7,15,28,100, -213,25,41,248,208,86,107,60,18,13,79,27,61,217,68,250,226,204,48,13,83,34,125,157,166,89,58,145,30,223,152,167,60,41,30,7,111, -220,29,195,11,224,248,248,248,250,58,223,54,249,99,131,12,128,1,49,246,213,100,252,23,176,197,13,254,141,31,214,239,145,117, -112,107,111,24,29,187,195,236,216,31,173,239,94,236,144,24,181,247,72,156,218,187,132,229,148,79,236,19,150,105,255,203,70,78, -213,23,59,198,212,49,226,255,160,156,202,205,235,159,87,200,98,135,253,3,40,26,5,36,252,4,0,0,0,0}; +{ + 0x1f, 0x8b, 0x08, 0x08, 0xac, 0xdb, 0x8b, 0x62, 0x00, 0x03, 0x4a, 0x61, + 0x76, 0x61, 0x44, 0x65, 0x78, 0x42, 0x79, 0x74, 0x65, 0x43, 0x6f, 0x64, + 0x65, 0x2e, 0x64, 0x65, 0x78, 0x00, 0x6d, 0x54, 0x4f, 0x48, 0x14, 0x51, + 0x18, 0xff, 0x66, 0xe6, 0xed, 0x6e, 0xea, 0x3a, 0xae, 0xeb, 0x7f, 0xc1, + 0xd8, 0x20, 0xea, 0x64, 0x6b, 0x7f, 0xac, 0x40, 0x0b, 0x4d, 0xfb, 0xb7, + 0x0d, 0x4a, 0x69, 0x5b, 0x6c, 0x1d, 0x9a, 0x66, 0x27, 0x77, 0x44, 0x67, + 0x96, 0xd9, 0xd9, 0x55, 0x28, 0x44, 0xba, 0x78, 0xf1, 0x54, 0x41, 0xd1, + 0xd9, 0x43, 0x04, 0x45, 0x20, 0x05, 0x75, 0x48, 0xa2, 0x8b, 0xe1, 0xa1, + 0x53, 0xd8, 0x21, 0xa8, 0x43, 0x07, 0x8f, 0x9d, 0xc2, 0x93, 0xf4, 0x7b, + 0x6f, 0x9e, 0xad, 0x85, 0xc3, 0xfe, 0xe6, 0xfb, 0xfb, 0xbe, 0xef, 0xf7, + 0xde, 0xce, 0xfb, 0xf2, 0xf6, 0x6c, 0x6d, 0xcf, 0xd1, 0x5e, 0x7a, 0xbc, + 0x7e, 0xe1, 0x25, 0x7d, 0xb9, 0xba, 0x35, 0x37, 0x59, 0xff, 0xe2, 0xd1, + 0xda, 0xeb, 0x7b, 0x2b, 0x67, 0xb6, 0x8c, 0xbb, 0xef, 0x2f, 0x0e, 0x3f, + 0x89, 0x10, 0x15, 0x89, 0x68, 0x36, 0x7b, 0x2c, 0x49, 0xf2, 0xd9, 0x64, + 0x44, 0x5d, 0x14, 0xfa, 0xf7, 0x00, 0x3f, 0x81, 0x18, 0xc0, 0x14, 0x22, + 0xfc, 0xe8, 0x3a, 0x5e, 0xf5, 0x90, 0xb7, 0xa4, 0xbd, 0x8a, 0xd7, 0x2b, + 0x8d, 0x68, 0x03, 0x32, 0x0a, 0xa9, 0x03, 0x8d, 0xc0, 0x01, 0x60, 0x10, + 0xb8, 0x09, 0xcc, 0x00, 0x0f, 0x81, 0x65, 0xe0, 0x0d, 0xf0, 0x0e, 0x58, + 0x01, 0x3e, 0x02, 0xab, 0xc0, 0x1a, 0xf0, 0x19, 0x58, 0x07, 0xbe, 0xf3, + 0x5a, 0xc0, 0x6f, 0xa0, 0x01, 0x5c, 0x5a, 0x80, 0x7d, 0x40, 0x2f, 0x60, + 0x00, 0xb7, 0x81, 0x39, 0x60, 0x11, 0x78, 0xc0, 0x42, 0x0e, 0x1a, 0xe7, + 0x07, 0x60, 0x3b, 0x14, 0x95, 0x7c, 0x39, 0xf7, 0x7a, 0x29, 0xa3, 0x72, + 0x6f, 0x35, 0x52, 0xff, 0xaa, 0x12, 0xd5, 0x4a, 0xfd, 0x07, 0xf4, 0x3a, + 0xa9, 0x6f, 0x40, 0x8f, 0x4b, 0xfd, 0xd7, 0x0e, 0xff, 0x26, 0x74, 0x5d, + 0xd6, 0xe5, 0xcd, 0x78, 0x9f, 0x66, 0xd1, 0x53, 0x13, 0x75, 0x19, 0x3c, + 0x49, 0xc9, 0xa1, 0x55, 0xca, 0x76, 0xc1, 0x87, 0x89, 0x38, 0xcf, 0x6f, + 0x10, 0x32, 0xcc, 0x8b, 0xa0, 0x6a, 0x93, 0xf4, 0xb7, 0x0a, 0xa9, 0x50, + 0x9b, 0xb4, 0xdb, 0xa5, 0xdd, 0x21, 0xa4, 0x4a, 0x9d, 0xd2, 0xaf, 0xc8, + 0xba, 0xfc, 0x51, 0xa5, 0xfc, 0x24, 0x1d, 0x51, 0x44, 0xb8, 0xef, 0x29, + 0x0b, 0xf7, 0x55, 0x4c, 0x11, 0x1d, 0x11, 0x95, 0x73, 0xd0, 0x72, 0xfb, + 0x39, 0x7b, 0x4d, 0x54, 0x20, 0x5a, 0x62, 0xd5, 0xbe, 0x3c, 0xaa, 0x8b, + 0xf5, 0xaa, 0xa8, 0xfd, 0x1c, 0xaf, 0x46, 0x48, 0x2f, 0xa5, 0xd0, 0x38, + 0x8d, 0x0d, 0x20, 0x0b, 0x65, 0x0f, 0xa3, 0xe1, 0x49, 0xec, 0x9d, 0xdb, + 0xc5, 0x81, 0x38, 0xb1, 0xcb, 0xba, 0x38, 0x86, 0x90, 0xc5, 0x32, 0x0b, + 0xf9, 0x24, 0x13, 0x0d, 0x82, 0x37, 0x3f, 0x91, 0xb7, 0xdb, 0x75, 0x12, + 0xbc, 0xee, 0xae, 0x75, 0x7a, 0x6a, 0xf0, 0x45, 0xe9, 0x72, 0xaf, 0x7c, + 0xcd, 0x07, 0xb9, 0x66, 0xf7, 0xec, 0x3a, 0x64, 0x7b, 0x09, 0x0d, 0xd5, + 0x74, 0x79, 0x16, 0xd5, 0x73, 0x50, 0x85, 0xad, 0x48, 0xfb, 0x7f, 0x5d, + 0xa3, 0x68, 0xbf, 0xe3, 0x3a, 0xc1, 0x69, 0x52, 0x32, 0xd4, 0x94, 0x29, + 0x5b, 0xf6, 0x68, 0xd1, 0x76, 0xcf, 0x1b, 0x59, 0xc7, 0x9e, 0x39, 0x34, + 0x69, 0x56, 0x4c, 0xea, 0x30, 0x4c, 0x37, 0xef, 0x7b, 0x4e, 0x3e, 0x6d, + 0x79, 0x6e, 0x60, 0xbb, 0x41, 0x7a, 0x88, 0xcb, 0xd9, 0xa0, 0x6f, 0x47, + 0x68, 0xc2, 0x37, 0x8b, 0x05, 0xc7, 0x2a, 0xa5, 0x87, 0x4c, 0xb7, 0x62, + 0x96, 0x76, 0x0d, 0x5d, 0xb1, 0x27, 0x1c, 0xcf, 0xed, 0xa3, 0xce, 0xbf, + 0xa1, 0x0a, 0x9a, 0xa4, 0xc7, 0xca, 0xfe, 0x1d, 0xd3, 0xb2, 0x79, 0xc3, + 0x3e, 0xda, 0x6b, 0x58, 0xde, 0x74, 0xda, 0x9f, 0x2e, 0x4d, 0xa5, 0x27, + 0xc1, 0x25, 0xfd, 0x2f, 0xa1, 0x3e, 0x52, 0xb2, 0xa4, 0x66, 0x33, 0xa4, + 0x65, 0x33, 0x06, 0x14, 0x03, 0x8a, 0x91, 0x21, 0x25, 0x47, 0x6a, 0xce, + 0xa0, 0xa8, 0x65, 0xba, 0x96, 0x3d, 0x25, 0x24, 0x38, 0x50, 0xcc, 0x0a, + 0x79, 0x52, 0x3c, 0xef, 0x94, 0x8a, 0x66, 0x60, 0x15, 0x86, 0x7d, 0x73, + 0x86, 0xda, 0x26, 0xcc, 0xa0, 0x60, 0xfb, 0xe3, 0xbe, 0xe9, 0xc2, 0xeb, + 0x63, 0x43, 0x21, 0x31, 0x62, 0x05, 0xaf, 0x14, 0x50, 0xad, 0x6b, 0x06, + 0x4e, 0xc5, 0x1e, 0x2f, 0x38, 0x25, 0x4a, 0x7a, 0xee, 0x60, 0x10, 0x98, + 0x56, 0xc1, 0xce, 0x8f, 0x7b, 0xd7, 0x1c, 0x37, 0xef, 0xcd, 0x50, 0x8b, + 0xf0, 0x71, 0x57, 0xe8, 0x18, 0x11, 0xe9, 0xd4, 0xec, 0xb9, 0xc3, 0x76, + 0x98, 0x7a, 0xce, 0xf7, 0xa6, 0x65, 0x72, 0xe7, 0x6e, 0x5e, 0xb9, 0x22, + 0x8e, 0x18, 0xf8, 0x48, 0x8b, 0x05, 0xbc, 0x61, 0xb4, 0xec, 0x96, 0x4b, + 0x76, 0x9e, 0x0e, 0xaa, 0xc9, 0xd6, 0x98, 0x7e, 0x62, 0xb4, 0x9b, 0xba, + 0x29, 0xa6, 0x5f, 0xa2, 0x11, 0xa5, 0x31, 0xa6, 0x9f, 0x5a, 0xc8, 0xd1, + 0x71, 0xa5, 0x2b, 0xa6, 0x53, 0x3f, 0x85, 0xd6, 0x59, 0xc8, 0x85, 0x1b, + 0xfd, 0xf8, 0x27, 0x19, 0xee, 0x02, 0x9b, 0x9f, 0x67, 0x1b, 0x5a, 0xe4, + 0xbe, 0x4a, 0x2a, 0xa0, 0x00, 0x11, 0x65, 0x91, 0x29, 0xec, 0x19, 0x53, + 0x94, 0x6f, 0x90, 0xbf, 0x98, 0xca, 0x96, 0x22, 0xf2, 0xde, 0xd3, 0x8e, + 0xef, 0x84, 0xcb, 0xed, 0x99, 0xa6, 0x52, 0x75, 0xae, 0x69, 0x54, 0x9d, + 0x6d, 0x8c, 0xaa, 0xf3, 0x6d, 0xbb, 0x06, 0x9f, 0x71, 0x51, 0xaa, 0xce, + 0x39, 0x25, 0x25, 0xe7, 0x04, 0xd7, 0x13, 0xd5, 0x59, 0xa2, 0xa6, 0xc2, + 0xfa, 0x7c, 0xfe, 0x69, 0x32, 0x87, 0xdf, 0x45, 0x4a, 0x85, 0x6b, 0xc5, + 0x3d, 0x4d, 0x84, 0x3a, 0x9f, 0xaf, 0x7f, 0x00, 0x34, 0xf2, 0xd3, 0x47, + 0x98, 0x05, 0x00, 0x00 +}; //============================================================================== struct AndroidGLCallbacks diff --git a/modules/juce_opengl/native/juce_OpenGL_ios.h b/modules/juce_opengl/native/juce_OpenGL_ios.h index 08de8dfc..c67a19d9 100644 --- a/modules/juce_opengl/native/juce_OpenGL_ios.h +++ b/modules/juce_opengl/native/juce_OpenGL_ios.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/native/juce_OpenGL_linux_X11.h b/modules/juce_opengl/native/juce_OpenGL_linux_X11.h index a43702fd..cda1c8ab 100644 --- a/modules/juce_opengl/native/juce_OpenGL_linux_X11.h +++ b/modules/juce_opengl/native/juce_OpenGL_linux_X11.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/native/juce_OpenGL_osx.h b/modules/juce_opengl/native/juce_OpenGL_osx.h index 8445269e..aceff12f 100644 --- a/modules/juce_opengl/native/juce_OpenGL_osx.h +++ b/modules/juce_opengl/native/juce_OpenGL_osx.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -36,6 +36,7 @@ public: void* contextToShare, bool shouldUseMultisampling, OpenGLVersion version) + : owner (component) { NSOpenGLPixelFormatAttribute attribs[64] = { 0 }; createAttribs (attribs, version, pixFormat, shouldUseMultisampling); @@ -195,7 +196,16 @@ public: lastSwapTime = now; } - void updateWindowPosition (Rectangle) {} + void updateWindowPosition (Rectangle) + { + if (auto* peer = owner.getTopLevelComponent()->getPeer()) + { + const auto newArea = peer->getAreaCoveredBy (owner); + + if (convertToRectInt ([view frame]) != newArea) + [view setFrame: makeNSRect (newArea)]; + } + } bool setSwapInterval (int numFramesPerSwapIn) { @@ -244,6 +254,7 @@ public: return NSOpenGLCPSwapInterval; } + Component& owner; NSOpenGLContext* renderContext = nil; NSOpenGLView* view = nil; ReferenceCountedObjectPtr viewAttachment; diff --git a/modules/juce_opengl/native/juce_OpenGL_win32.h b/modules/juce_opengl/native/juce_OpenGL_win32.h index b272a256..12dcab98 100644 --- a/modules/juce_opengl/native/juce_OpenGL_win32.h +++ b/modules/juce_opengl/native/juce_OpenGL_win32.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLContext.cpp b/modules/juce_opengl/opengl/juce_OpenGLContext.cpp index 868df91d..909cda6e 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLContext.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLContext.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLContext.h b/modules/juce_opengl/opengl/juce_OpenGLContext.h index d2c3cddd..b272ee2a 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLContext.h +++ b/modules/juce_opengl/opengl/juce_OpenGLContext.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp b/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp index 151f86e6..e2f339ed 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h b/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h index 14e0b6f1..b659fab7 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h +++ b/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp index bd7ea9da..56380e51 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h index 8e3123ad..14906b26 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h +++ b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp b/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp index f4b26e79..2838920a 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLHelpers.h b/modules/juce_opengl/opengl/juce_OpenGLHelpers.h index d07e93bf..f8a2ef95 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLHelpers.h +++ b/modules/juce_opengl/opengl/juce_OpenGLHelpers.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLImage.cpp b/modules/juce_opengl/opengl/juce_OpenGLImage.cpp index 709b6778..fd6d9c13 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLImage.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLImage.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLImage.h b/modules/juce_opengl/opengl/juce_OpenGLImage.h index 1c4b5074..83c0194a 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLImage.h +++ b/modules/juce_opengl/opengl/juce_OpenGLImage.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp b/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp index 2b73e6fe..718db955 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h b/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h index 22028049..3f541845 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h +++ b/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLRenderer.h b/modules/juce_opengl/opengl/juce_OpenGLRenderer.h index 82fe33d0..fe6cdbd7 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLRenderer.h +++ b/modules/juce_opengl/opengl/juce_OpenGLRenderer.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp b/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp index 2e33d034..f9a2cc7f 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h b/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h index de482014..704f4294 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h +++ b/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp b/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp index b5b38e5c..b333d405 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_OpenGLTexture.h b/modules/juce_opengl/opengl/juce_OpenGLTexture.h index 1a2916dd..9df73bc9 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLTexture.h +++ b/modules/juce_opengl/opengl/juce_OpenGLTexture.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_gl.cpp b/modules/juce_opengl/opengl/juce_gl.cpp index 3b71f321..c15841a8 100644 --- a/modules/juce_opengl/opengl/juce_gl.cpp +++ b/modules/juce_opengl/opengl/juce_gl.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_gl.h b/modules/juce_opengl/opengl/juce_gl.h index 83396cce..a722e4f6 100644 --- a/modules/juce_opengl/opengl/juce_gl.h +++ b/modules/juce_opengl/opengl/juce_gl.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_gles2.cpp b/modules/juce_opengl/opengl/juce_gles2.cpp index 2897d536..a03701d7 100644 --- a/modules/juce_opengl/opengl/juce_gles2.cpp +++ b/modules/juce_opengl/opengl/juce_gles2.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_gles2.h b/modules/juce_opengl/opengl/juce_gles2.h index 3ef882d4..9e07b85d 100644 --- a/modules/juce_opengl/opengl/juce_gles2.h +++ b/modules/juce_opengl/opengl/juce_gles2.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/opengl/juce_wgl.h b/modules/juce_opengl/opengl/juce_wgl.h index cea17e2f..101a8ecd 100644 --- a/modules/juce_opengl/opengl/juce_wgl.h +++ b/modules/juce_opengl/opengl/juce_wgl.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp b/modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp index d3fae9e2..732ac3ac 100644 --- a/modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp +++ b/modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_opengl/utils/juce_OpenGLAppComponent.h b/modules/juce_opengl/utils/juce_OpenGLAppComponent.h index 5dd877c6..fcb54291 100644 --- a/modules/juce_opengl/utils/juce_OpenGLAppComponent.h +++ b/modules/juce_opengl/utils/juce_OpenGLAppComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/juce_osc.cpp b/modules/juce_osc/juce_osc.cpp index 0e7060e2..1fe50e66 100644 --- a/modules/juce_osc/juce_osc.cpp +++ b/modules/juce_osc/juce_osc.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/juce_osc.h b/modules/juce_osc/juce_osc.h index fe0c552a..617ea8e8 100644 --- a/modules/juce_osc/juce_osc.h +++ b/modules/juce_osc/juce_osc.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_osc vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE OSC classes description: Open Sound Control implementation. website: http://www.juce.com/juce diff --git a/modules/juce_osc/osc/juce_OSCAddress.cpp b/modules/juce_osc/osc/juce_OSCAddress.cpp index 79efc422..7d27f428 100644 --- a/modules/juce_osc/osc/juce_OSCAddress.cpp +++ b/modules/juce_osc/osc/juce_OSCAddress.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCAddress.h b/modules/juce_osc/osc/juce_OSCAddress.h index fd2a3111..5546af90 100644 --- a/modules/juce_osc/osc/juce_OSCAddress.h +++ b/modules/juce_osc/osc/juce_OSCAddress.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCArgument.cpp b/modules/juce_osc/osc/juce_OSCArgument.cpp index 442b9eaa..fd3a24bf 100644 --- a/modules/juce_osc/osc/juce_OSCArgument.cpp +++ b/modules/juce_osc/osc/juce_OSCArgument.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCArgument.h b/modules/juce_osc/osc/juce_OSCArgument.h index b8456400..75f4b4a0 100644 --- a/modules/juce_osc/osc/juce_OSCArgument.h +++ b/modules/juce_osc/osc/juce_OSCArgument.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCBundle.cpp b/modules/juce_osc/osc/juce_OSCBundle.cpp index 56485de5..aa47d536 100644 --- a/modules/juce_osc/osc/juce_OSCBundle.cpp +++ b/modules/juce_osc/osc/juce_OSCBundle.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCBundle.h b/modules/juce_osc/osc/juce_OSCBundle.h index 42ca2ee6..12d6c3cb 100644 --- a/modules/juce_osc/osc/juce_OSCBundle.h +++ b/modules/juce_osc/osc/juce_OSCBundle.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCMessage.cpp b/modules/juce_osc/osc/juce_OSCMessage.cpp index b6de5e13..ff33c649 100644 --- a/modules/juce_osc/osc/juce_OSCMessage.cpp +++ b/modules/juce_osc/osc/juce_OSCMessage.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCMessage.h b/modules/juce_osc/osc/juce_OSCMessage.h index de335478..e4962895 100644 --- a/modules/juce_osc/osc/juce_OSCMessage.h +++ b/modules/juce_osc/osc/juce_OSCMessage.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCReceiver.cpp b/modules/juce_osc/osc/juce_OSCReceiver.cpp index e9426385..a855668a 100644 --- a/modules/juce_osc/osc/juce_OSCReceiver.cpp +++ b/modules/juce_osc/osc/juce_OSCReceiver.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCReceiver.h b/modules/juce_osc/osc/juce_OSCReceiver.h index 2f6ff9e9..7bf68ab6 100644 --- a/modules/juce_osc/osc/juce_OSCReceiver.h +++ b/modules/juce_osc/osc/juce_OSCReceiver.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCSender.cpp b/modules/juce_osc/osc/juce_OSCSender.cpp index 00888a9e..c89bf6ce 100644 --- a/modules/juce_osc/osc/juce_OSCSender.cpp +++ b/modules/juce_osc/osc/juce_OSCSender.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCSender.h b/modules/juce_osc/osc/juce_OSCSender.h index e118028c..693946de 100644 --- a/modules/juce_osc/osc/juce_OSCSender.h +++ b/modules/juce_osc/osc/juce_OSCSender.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCTimeTag.cpp b/modules/juce_osc/osc/juce_OSCTimeTag.cpp index c9d22b5e..d464732b 100644 --- a/modules/juce_osc/osc/juce_OSCTimeTag.cpp +++ b/modules/juce_osc/osc/juce_OSCTimeTag.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCTimeTag.h b/modules/juce_osc/osc/juce_OSCTimeTag.h index e00f72f9..5645f222 100644 --- a/modules/juce_osc/osc/juce_OSCTimeTag.h +++ b/modules/juce_osc/osc/juce_OSCTimeTag.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCTypes.cpp b/modules/juce_osc/osc/juce_OSCTypes.cpp index beeed492..16bb8230 100644 --- a/modules/juce_osc/osc/juce_OSCTypes.cpp +++ b/modules/juce_osc/osc/juce_OSCTypes.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_osc/osc/juce_OSCTypes.h b/modules/juce_osc/osc/juce_OSCTypes.h index 759793d5..37d76b4f 100644 --- a/modules/juce_osc/osc/juce_OSCTypes.h +++ b/modules/juce_osc/osc/juce_OSCTypes.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp b/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp index b58a89ef..9ced7d1a 100644 --- a/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp +++ b/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h b/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h index 6044968b..2f89af71 100644 --- a/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h +++ b/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -71,8 +71,8 @@ public: /** A unique order identifier for the transaction (generated by the store). */ String orderId; - /** A unique identifier of in-app product that was purchased. */ - String productId; + /** Unique identifiers of the products that were purchased. */ + StringArray productIds; /** This will be bundle ID on iOS and package name on Android, of the application for which this in-app product was purchased. */ @@ -147,7 +147,7 @@ public: virtual void productPurchaseFinished (const PurchaseInfo&, bool /*success*/, const String& /*statusDescription*/) {} /** Called when a list of all purchases is restored. This can be used to figure out to - which products a user is entitled to. + which products a user is entitled. NOTE: It is possible to receive this callback for the same purchase multiple times. If that happens, only the newest set of downloads and the newest orderId will be valid, the old ones should be not used anymore! @@ -210,7 +210,7 @@ public: const String& upgradeOrDowngradeFromSubscriptionWithProductIdentifier = {}, bool creditForUnusedSubscription = true); - /** Asynchronously asks about a list of products that a user has already bought. Upon completion, Listener::purchasesListReceived() + /** Asynchronously asks about a list of products that a user has already bought. Upon completion, Listener::purchasesListRestored() callback will be invoked. The user may be prompted to login first. @param includeDownloadInfo (iOS only) if true, then after restoration is successful, the downloads array passed to @@ -258,8 +258,8 @@ public: //============================================================================== #ifndef DOXYGEN [[deprecated ("On Android, it is no longer necessary to specify whether the product being purchased is a subscription " - "and only a single subscription can be upgraded/downgraded. Use the updated purchaseProduct method " - "which takes a single String argument.")]] + "and only a single subscription can be upgraded/downgraded. Use the updated purchaseProduct method " + "which takes a single String argument.")]] void purchaseProduct (const String& productIdentifier, bool isSubscription, const StringArray& upgradeOrDowngradeFromSubscriptionsWithProductIdentifiers = {}, diff --git a/modules/juce_product_unlocking/juce_product_unlocking.cpp b/modules/juce_product_unlocking/juce_product_unlocking.cpp index 27b2d3a3..4fbc7a5b 100644 --- a/modules/juce_product_unlocking/juce_product_unlocking.cpp +++ b/modules/juce_product_unlocking/juce_product_unlocking.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_product_unlocking/juce_product_unlocking.h b/modules/juce_product_unlocking/juce_product_unlocking.h index 1f0a2e98..c8c0a0b6 100644 --- a/modules/juce_product_unlocking/juce_product_unlocking.h +++ b/modules/juce_product_unlocking/juce_product_unlocking.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_product_unlocking vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE Online marketplace support description: Classes for online product authentication website: http://www.juce.com/juce diff --git a/modules/juce_product_unlocking/juce_product_unlocking.mm b/modules/juce_product_unlocking/juce_product_unlocking.mm index 1a88d06b..89e60908 100644 --- a/modules/juce_product_unlocking/juce_product_unlocking.mm +++ b/modules/juce_product_unlocking/juce_product_unlocking.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_product_unlocking/marketplace/juce_KeyFileGeneration.h b/modules/juce_product_unlocking/marketplace/juce_KeyFileGeneration.h index 9aedc668..baf7ff57 100644 --- a/modules/juce_product_unlocking/marketplace/juce_KeyFileGeneration.h +++ b/modules/juce_product_unlocking/marketplace/juce_KeyFileGeneration.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.cpp b/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.cpp index a0687be2..9872a080 100644 --- a/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.cpp +++ b/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.h b/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.h index 97d31d13..6b87ca6a 100644 --- a/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.h +++ b/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.cpp b/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.cpp index 994c4e7e..f2d527ee 100644 --- a/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.cpp +++ b/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.h b/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.h index aa6853cd..819830d2 100644 --- a/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.h +++ b/modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.cpp b/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.cpp index e003fe3c..069ff8ef 100644 --- a/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.cpp +++ b/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.h b/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.h index 9535131a..e8f7cf61 100644 --- a/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.h +++ b/modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_product_unlocking/native/javaopt/app/com/rmsl/juce/JuceBillingClient.java b/modules/juce_product_unlocking/native/javaopt/app/com/rmsl/juce/JuceBillingClient.java index 656d783b..f398bded 100644 --- a/modules/juce_product_unlocking/native/javaopt/app/com/rmsl/juce/JuceBillingClient.java +++ b/modules/juce_product_unlocking/native/javaopt/app/com/rmsl/juce/JuceBillingClient.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,8 +27,9 @@ package com.rmsl.juce; import com.android.billingclient.api.*; -public class JuceBillingClient implements PurchasesUpdatedListener, BillingClientStateListener { - private native void skuDetailsQueryCallback(long host, java.util.List skuDetails); +public class JuceBillingClient implements PurchasesUpdatedListener, + BillingClientStateListener { + private native void productDetailsQueryCallback(long host, java.util.List productDetails); private native void purchasesListQueryCallback(long host, java.util.List purchases); private native void purchaseCompletedCallback(long host, Purchase purchase, int responseCode); private native void purchaseConsumedCallback(long host, String productIdentifier, int responseCode); @@ -57,36 +58,39 @@ public class JuceBillingClient implements PurchasesUpdatedListener, BillingClien == BillingClient.BillingResponseCode.OK; } - public void querySkuDetails(final String[] skusToQuery) { - executeOnBillingClientConnection(new Runnable() { - @Override - public void run() { - final java.util.List skuList = java.util.Arrays.asList(skusToQuery); + public QueryProductDetailsParams getProductListParams(final String[] productsToQuery, String type) { + java.util.ArrayList productList = new java.util.ArrayList<>(); - SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder() - .setSkusList(skuList) - .setType(BillingClient.SkuType.INAPP); + for (String product : productsToQuery) + productList.add(QueryProductDetailsParams.Product.newBuilder().setProductId(product).setProductType(type).build()); - billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() { - @Override - public void onSkuDetailsResponse(BillingResult billingResult, final java.util.List inAppSkuDetails) { - if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { - SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder() - .setSkusList(skuList) - .setType(BillingClient.SkuType.SUBS); - - billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() { - @Override - public void onSkuDetailsResponse(BillingResult billingResult, java.util.List subsSkuDetails) { - if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { - subsSkuDetails.addAll(inAppSkuDetails); - skuDetailsQueryCallback(host, subsSkuDetails); - } - } - }); - } + return QueryProductDetailsParams.newBuilder().setProductList(productList).build(); + } + + public void queryProductDetailsImpl(final String[] productsToQuery, java.util.List productTypes, java.util.List details) { + if (productTypes == null || productTypes.isEmpty()) { + productDetailsQueryCallback(host, details); + } else { + billingClient.queryProductDetailsAsync(getProductListParams(productsToQuery, productTypes.get(0)), new ProductDetailsResponseListener() { + @Override + public void onProductDetailsResponse(BillingResult billingResult, java.util.List newDetails) { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + details.addAll(newDetails); + queryProductDetailsImpl(productsToQuery, productTypes.subList(1, productTypes.size()), details); + } else { + queryProductDetailsImpl(productsToQuery, null, details); } - }); + } + }); + } + } + + public void queryProductDetails(final String[] productsToQuery) { + executeOnBillingClientConnection(new Runnable() { + @Override + public void run() { + String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS}; + queryProductDetailsImpl(productsToQuery, java.util.Arrays.asList(toCheck), new java.util.ArrayList()); } }); } @@ -100,23 +104,30 @@ public class JuceBillingClient implements PurchasesUpdatedListener, BillingClien }); } + private void queryPurchasesImpl(java.util.List toCheck, java.util.ArrayList purchases) { + if (toCheck == null || toCheck.isEmpty()) { + purchasesListQueryCallback(host, purchases); + } else { + billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder().setProductType(toCheck.get(0)).build(), new PurchasesResponseListener() { + @Override + public void onQueryPurchasesResponse(BillingResult billingResult, java.util.List list) { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + purchases.addAll(list); + queryPurchasesImpl(toCheck.subList(1, toCheck.size()), purchases); + } else { + queryPurchasesImpl(null, purchases); + } + } + }); + } + } + public void queryPurchases() { executeOnBillingClientConnection(new Runnable() { @Override public void run() { - Purchase.PurchasesResult inAppPurchases = billingClient.queryPurchases(BillingClient.SkuType.INAPP); - Purchase.PurchasesResult subsPurchases = billingClient.queryPurchases(BillingClient.SkuType.SUBS); - - if (inAppPurchases.getResponseCode() == BillingClient.BillingResponseCode.OK - && subsPurchases.getResponseCode() == BillingClient.BillingResponseCode.OK) { - java.util.List purchaseList = inAppPurchases.getPurchasesList(); - purchaseList.addAll(subsPurchases.getPurchasesList()); - - purchasesListQueryCallback(host, purchaseList); - return; - } - - purchasesListQueryCallback(host, null); + String[] toCheck = {BillingClient.ProductType.INAPP, BillingClient.ProductType.SUBS}; + queryPurchasesImpl(java.util.Arrays.asList(toCheck), new java.util.ArrayList()); } }); } @@ -211,5 +222,5 @@ public class JuceBillingClient implements PurchasesUpdatedListener, BillingClien } private long host = 0; - private BillingClient billingClient; + private final BillingClient billingClient; } diff --git a/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp b/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp index d2c63591..922234fd 100644 --- a/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp +++ b/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,13 +27,46 @@ namespace juce { #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (getSku, "getSku", "()Ljava/lang/String;") \ - METHOD (getTitle, "getTitle", "()Ljava/lang/String;") \ - METHOD (getDescription, "getDescription", "()Ljava/lang/String;") \ - METHOD (getPrice, "getPrice", "()Ljava/lang/String;") \ - METHOD (getPriceCurrencyCode, "getPriceCurrencyCode", "()Ljava/lang/String;") + METHOD (getProductId, "getProductId", "()Ljava/lang/String;") \ + METHOD (getTitle, "getTitle", "()Ljava/lang/String;") \ + METHOD (getDescription, "getDescription", "()Ljava/lang/String;") \ + METHOD (getOneTimePurchaseOfferDetails, "getOneTimePurchaseOfferDetails", "()Lcom/android/billingclient/api/ProductDetails$OneTimePurchaseOfferDetails;") \ + METHOD (getSubscriptionOfferDetails, "getSubscriptionOfferDetails", "()Ljava/util/List;") -DECLARE_JNI_CLASS (SkuDetails, "com/android/billingclient/api/SkuDetails") +DECLARE_JNI_CLASS (ProductDetails, "com/android/billingclient/api/ProductDetails") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getFormattedPrice, "getFormattedPrice", "()Ljava/lang/String;") \ + METHOD (getPriceCurrencyCode, "getPriceCurrencyCode", "()Ljava/lang/String;") + +DECLARE_JNI_CLASS (OneTimePurchaseOfferDetails, "com/android/billingclient/api/ProductDetails$OneTimePurchaseOfferDetails") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getFormattedPrice, "getFormattedPrice", "()Ljava/lang/String;") \ + METHOD (getPriceCurrencyCode, "getPriceCurrencyCode", "()Ljava/lang/String;") + +DECLARE_JNI_CLASS (PricingPhase, "com/android/billingclient/api/ProductDetails$PricingPhase") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getOfferToken, "getOfferToken", "()Ljava/lang/String;") \ + METHOD (getPricingPhases, "getPricingPhases", "()Lcom/android/billingclient/api/ProductDetails$PricingPhases;") + +DECLARE_JNI_CLASS (SubscriptionOfferDetails, "com/android/billingclient/api/ProductDetails$SubscriptionOfferDetails") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (getPricingPhaseList, "getPricingPhaseList", "()Ljava/util/List;") + +DECLARE_JNI_CLASS (PricingPhases, "com/android/billingclient/api/ProductDetails$PricingPhases") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + STATICMETHOD (newBuilder, "newBuilder", "()Lcom/android/billingclient/api/BillingFlowParams$ProductDetailsParams$Builder;") + +DECLARE_JNI_CLASS (BillingFlowParamsProductDetailsParams, "com/android/billingclient/api/BillingFlowParams$ProductDetailsParams") #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ @@ -43,33 +76,81 @@ DECLARE_JNI_CLASS (BillingFlowParams, "com/android/billingclient/api/BillingFlow #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (build, "build", "()Lcom/android/billingclient/api/BillingFlowParams;") \ - METHOD (setOldSku, "setOldSku", "(Ljava/lang/String;Ljava/lang/String;)Lcom/android/billingclient/api/BillingFlowParams$Builder;") \ - METHOD (setReplaceSkusProrationMode, "setReplaceSkusProrationMode", "(I)Lcom/android/billingclient/api/BillingFlowParams$Builder;") \ - METHOD (setSkuDetails, "setSkuDetails", "(Lcom/android/billingclient/api/SkuDetails;)Lcom/android/billingclient/api/BillingFlowParams$Builder;") + STATICMETHOD (newBuilder, "newBuilder", "()Lcom/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams$Builder;") + +DECLARE_JNI_CLASS (BillingFlowParamsSubscriptionUpdateParams, "com/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (build, "build", "()Lcom/android/billingclient/api/BillingFlowParams;") \ + METHOD (setSubscriptionUpdateParams, "setSubscriptionUpdateParams", "(Lcom/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams;)Lcom/android/billingclient/api/BillingFlowParams$Builder;") \ + METHOD (setProductDetailsParamsList, "setProductDetailsParamsList", "(Ljava/util/List;)Lcom/android/billingclient/api/BillingFlowParams$Builder;") DECLARE_JNI_CLASS (BillingFlowParamsBuilder, "com/android/billingclient/api/BillingFlowParams$Builder") #undef JNI_CLASS_MEMBERS +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (build, "build", "()Lcom/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams;") \ + METHOD (setOldPurchaseToken, "setOldPurchaseToken", "(Ljava/lang/String;)Lcom/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams$Builder;") \ + METHOD (setReplaceProrationMode, "setReplaceProrationMode", "(I)Lcom/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams$Builder;") + +DECLARE_JNI_CLASS (BillingFlowParamsSubscriptionUpdateParamsBuilder, "com/android/billingclient/api/BillingFlowParams$SubscriptionUpdateParams$Builder") +#undef JNI_CLASS_MEMBERS + +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (build, "build", "()Lcom/android/billingclient/api/BillingFlowParams$ProductDetailsParams;") \ + METHOD (setOfferToken, "setOfferToken", "(Ljava/lang/String;)Lcom/android/billingclient/api/BillingFlowParams$ProductDetailsParams$Builder;") \ + METHOD (setProductDetails, "setProductDetails", "(Lcom/android/billingclient/api/ProductDetails;)Lcom/android/billingclient/api/BillingFlowParams$ProductDetailsParams$Builder;") + +DECLARE_JNI_CLASS (BillingFlowParamsProductDetailsParamsBuilder, "com/android/billingclient/api/BillingFlowParams$ProductDetailsParams$Builder") +#undef JNI_CLASS_MEMBERS + #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (getOrderId, "getOrderId", "()Ljava/lang/String;") \ - METHOD (getSku, "getSku", "()Ljava/lang/String;") \ + METHOD (getPurchaseState, "getPurchaseState", "()I") \ + METHOD (getProducts, "getProducts", "()Ljava/util/List;") \ METHOD (getPackageName, "getPackageName", "()Ljava/lang/String;") \ - METHOD (getPurchaseTime, "getPurchaseTime", "()J") \ + METHOD (getPurchaseTime, "getPurchaseTime", "()J") \ METHOD (getPurchaseToken, "getPurchaseToken", "()Ljava/lang/String;") DECLARE_JNI_CLASS (AndroidPurchase, "com/android/billingclient/api/Purchase") #undef JNI_CLASS_MEMBERS +template +static void callOnMainThread (Fn&& fn) +{ + if (MessageManager::getInstance()->isThisTheMessageThread()) + fn(); + else + MessageManager::callAsync (std::forward (fn)); +} + +inline StringArray javaListOfStringToJuceStringArray (const LocalRef& javaArray) +{ + if (javaArray.get() == nullptr) + return {}; + + auto* env = getEnv(); + + StringArray result; + + const auto size = env->CallIntMethod (javaArray, JavaList.size); + + for (int i = 0; i < size; ++i) + result.add (juceString (LocalRef { (jstring) env->CallObjectMethod (javaArray, JavaList.get, i) }.get())); + + return result; +} + //============================================================================== struct InAppPurchases::Pimpl { Pimpl (InAppPurchases& parent) : owner (parent), - billingClient (LocalRef (getEnv()->NewObject (JuceBillingClient, - JuceBillingClient.constructor, - getAppContext().get(), - (jlong) this))) + billingClient (LocalRef { getEnv()->NewObject (JuceBillingClient, + JuceBillingClient.constructor, + getAppContext().get(), + (jlong) this) }) { } @@ -86,46 +167,52 @@ struct InAppPurchases::Pimpl void getProductsInformation (const StringArray& productIdentifiers) { - skuDetailsQueryCallbackQueue.emplace ([this] (LocalRef skuDetailsList) + productDetailsQueryCallbackQueue.emplace ([this] (LocalRef productDetailsList) { - if (skuDetailsList != nullptr) + if (productDetailsList != nullptr) { auto* env = getEnv(); Array products; - for (int i = 0; i < env->CallIntMethod (skuDetailsList, JavaList.size); ++i) - products.add (buildProduct (LocalRef (env->CallObjectMethod (skuDetailsList, JavaList.get, i)))); + for (int i = 0; i < env->CallIntMethod (productDetailsList, JavaList.size); ++i) + products.add (buildProduct (LocalRef { env->CallObjectMethod (productDetailsList, JavaList.get, i) })); - owner.listeners.call ([&] (Listener& l) { l.productsInfoReturned (products); }); + callMemberOnMainThread ([this, products] + { + owner.listeners.call ([&] (Listener& l) { l.productsInfoReturned (products); }); + }); } }); - querySkuDetailsAsync (convertToLowerCase (productIdentifiers)); + queryProductDetailsAsync (convertToLowerCase (productIdentifiers)); } void purchaseProduct (const String& productIdentifier, const String& subscriptionIdentifier, bool creditForUnusedSubscription) { - skuDetailsQueryCallbackQueue.emplace ([=] (LocalRef skuDetailsList) + productDetailsQueryCallbackQueue.emplace ([=] (LocalRef productDetailsList) { - if (skuDetailsList != nullptr) + if (productDetailsList != nullptr) { auto* env = getEnv(); - if (env->CallIntMethod (skuDetailsList, JavaList.size) > 0) + if (env->CallIntMethod (productDetailsList, JavaList.size) > 0) { - LocalRef skuDetails (env->CallObjectMethod (skuDetailsList, JavaList.get, 0)); + GlobalRef productDetails (LocalRef { env->CallObjectMethod (productDetailsList, JavaList.get, 0) }); - if (subscriptionIdentifier.isNotEmpty()) - changeExistingSubscription (skuDetails, subscriptionIdentifier, creditForUnusedSubscription); - else - purchaseProductWithSkuDetails (skuDetails); + callMemberOnMainThread ([this, productDetails, subscriptionIdentifier, creditForUnusedSubscription] + { + if (subscriptionIdentifier.isNotEmpty()) + changeExistingSubscription (productDetails, subscriptionIdentifier, creditForUnusedSubscription); + else + purchaseProductWithProductDetails (productDetails); + }); } } }); - querySkuDetailsAsync (convertToLowerCase ({ productIdentifier })); + queryProductDetailsAsync (convertToLowerCase ({ productIdentifier })); } void restoreProductsBoughtList (bool, const juce::String&) @@ -139,15 +226,21 @@ struct InAppPurchases::Pimpl for (int i = 0; i < env->CallIntMethod (purchasesList, JavaArrayList.size); ++i) { - LocalRef purchase (env->CallObjectMethod (purchasesList, JavaArrayList.get, i)); + const LocalRef purchase { env->CallObjectMethod (purchasesList, JavaArrayList.get, i) }; purchases.add ({ buildPurchase (purchase), {} }); } - owner.listeners.call ([&] (Listener& l) { l.purchasesListRestored (purchases, true, NEEDS_TRANS ("Success")); }); + callMemberOnMainThread ([this, purchases] + { + owner.listeners.call ([&] (Listener& l) { l.purchasesListRestored (purchases, true, NEEDS_TRANS ("Success")); }); + }); } else { - owner.listeners.call ([&] (Listener& l) { l.purchasesListRestored ({}, false, NEEDS_TRANS ("Failure")); }); + callMemberOnMainThread ([this] + { + owner.listeners.call ([&] (Listener& l) { l.purchasesListRestored ({}, false, NEEDS_TRANS ("Failure")); }); + }); } }); @@ -158,17 +251,17 @@ struct InAppPurchases::Pimpl { if (purchaseToken.isEmpty()) { - skuDetailsQueryCallbackQueue.emplace ([=] (LocalRef skuDetailsList) + productDetailsQueryCallbackQueue.emplace ([=] (LocalRef productDetailsList) { - if (skuDetailsList != nullptr) + if (productDetailsList != nullptr) { auto* env = getEnv(); - if (env->CallIntMethod (skuDetailsList, JavaList.size) > 0) + if (env->CallIntMethod (productDetailsList, JavaList.size) > 0) { - LocalRef sku (env->CallObjectMethod (skuDetailsList, JavaList.get, 0)); + const LocalRef product { env->CallObjectMethod (productDetailsList, JavaList.get, 0) }; - auto token = juceString (LocalRef ((jstring) env->CallObjectMethod (sku, AndroidPurchase.getSku))); + auto token = juceString (LocalRef { (jstring) env->CallObjectMethod (product, ProductDetails.getProductId) }); if (token.isNotEmpty()) { @@ -178,10 +271,13 @@ struct InAppPurchases::Pimpl } } - notifyListenersAboutConsume (productIdentifier, false, NEEDS_TRANS ("Item unavailable")); + callMemberOnMainThread ([this, productIdentifier] + { + notifyListenersAboutConsume (productIdentifier, false, NEEDS_TRANS ("Item unavailable")); + }); }); - querySkuDetailsAsync (convertToLowerCase ({ productIdentifier })); + queryProductDetailsAsync (convertToLowerCase ({ productIdentifier })); } consumePurchaseWithToken (productIdentifier, purchaseToken); @@ -218,27 +314,27 @@ struct InAppPurchases::Pimpl private: #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (constructor, "", "(Landroid/content/Context;J)V") \ - METHOD (endConnection, "endConnection", "()V") \ - METHOD (isReady, "isReady", "()Z") \ - METHOD (isBillingSupported, "isBillingSupported", "()Z") \ - METHOD (querySkuDetails, "querySkuDetails", "([Ljava/lang/String;)V") \ - METHOD (launchBillingFlow, "launchBillingFlow", "(Landroid/app/Activity;Lcom/android/billingclient/api/BillingFlowParams;)V") \ - METHOD (queryPurchases, "queryPurchases", "()V") \ - METHOD (consumePurchase, "consumePurchase", "(Ljava/lang/String;Ljava/lang/String;)V") \ - \ - CALLBACK (skuDetailsQueryCallback, "skuDetailsQueryCallback", "(JLjava/util/List;)V") \ - CALLBACK (purchasesListQueryCallback, "purchasesListQueryCallback", "(JLjava/util/List;)V") \ - CALLBACK (purchaseCompletedCallback, "purchaseCompletedCallback", "(JLcom/android/billingclient/api/Purchase;I)V") \ - CALLBACK (purchaseConsumedCallback, "purchaseConsumedCallback", "(JLjava/lang/String;I)V") + METHOD (constructor, "", "(Landroid/content/Context;J)V") \ + METHOD (endConnection, "endConnection", "()V") \ + METHOD (isReady, "isReady", "()Z") \ + METHOD (isBillingSupported, "isBillingSupported", "()Z") \ + METHOD (queryProductDetails, "queryProductDetails", "([Ljava/lang/String;)V") \ + METHOD (launchBillingFlow, "launchBillingFlow", "(Landroid/app/Activity;Lcom/android/billingclient/api/BillingFlowParams;)V") \ + METHOD (queryPurchases, "queryPurchases", "()V") \ + METHOD (consumePurchase, "consumePurchase", "(Ljava/lang/String;Ljava/lang/String;)V") \ + \ + CALLBACK (productDetailsQueryCallback, "productDetailsQueryCallback", "(JLjava/util/List;)V") \ + CALLBACK (purchasesListQueryCallback, "purchasesListQueryCallback", "(JLjava/util/List;)V") \ + CALLBACK (purchaseCompletedCallback, "purchaseCompletedCallback", "(JLcom/android/billingclient/api/Purchase;I)V") \ + CALLBACK (purchaseConsumedCallback, "purchaseConsumedCallback", "(JLjava/lang/String;I)V") DECLARE_JNI_CLASS (JuceBillingClient, "com/rmsl/juce/JuceBillingClient") #undef JNI_CLASS_MEMBERS - static void JNICALL skuDetailsQueryCallback (JNIEnv*, jobject, jlong host, jobject skuDetailsList) + static void JNICALL productDetailsQueryCallback (JNIEnv*, jobject, jlong host, jobject productDetailsList) { if (auto* myself = reinterpret_cast (host)) - myself->updateSkuDetails (skuDetailsList); + myself->updateProductDetails (productDetailsList); } static void JNICALL purchasesListQueryCallback (JNIEnv*, jobject, jlong host, jobject purchasesList) @@ -289,7 +385,7 @@ private: return lowerCase; } - void querySkuDetailsAsync (const StringArray& productIdentifiers) + void queryProductDetailsAsync (const StringArray& productIdentifiers) { Thread::launch ([=] { @@ -299,7 +395,7 @@ private: MessageManager::callAsync ([=] { getEnv()->CallVoidMethod (billingClient, - JuceBillingClient.querySkuDetails, + JuceBillingClient.queryProductDetails, juceStringArrayToJava (productIdentifiers).get()); }); }); @@ -331,23 +427,15 @@ private: owner.listeners.call ([&] (Listener& l) { l.productConsumed (productIdentifier, success, statusDescription); }); } - LocalRef createBillingFlowParamsBuilder (LocalRef skuDetails) - { - auto* env = getEnv(); - - auto builder = LocalRef (env->CallStaticObjectMethod (BillingFlowParams, BillingFlowParams.newBuilder)); - - return LocalRef (env->CallObjectMethod (builder.get(), - BillingFlowParamsBuilder.setSkuDetails, - skuDetails.get())); - } - void launchBillingFlowWithParameters (LocalRef params) { - LocalRef activity (getCurrentActivity()); + const auto activity = [] + { + if (auto current = getCurrentActivity()) + return current; - if (activity == nullptr) - activity = getMainActivity(); + return getMainActivity(); + }(); getEnv()->CallVoidMethod (billingClient, JuceBillingClient.launchBillingFlow, @@ -355,7 +443,7 @@ private: params.get()); } - void changeExistingSubscription (LocalRef skuDetails, const String& subscriptionIdentifier, bool creditForUnusedSubscription) + void changeExistingSubscription (GlobalRef productDetails, const String& subscriptionIdentifier, bool creditForUnusedSubscription) { if (! isReady()) { @@ -371,35 +459,47 @@ private: for (int i = 0; i < env->CallIntMethod (purchasesList, JavaArrayList.size); ++i) { - auto purchase = buildPurchase (LocalRef (env->CallObjectMethod (purchasesList.get(), JavaArrayList.get, i))); + auto purchase = buildPurchase (LocalRef { env->CallObjectMethod (purchasesList.get(), JavaArrayList.get, i) }); - if (purchase.productId == subscriptionIdentifier) + if (purchase.productIds.contains (subscriptionIdentifier)) { - auto builder = createBillingFlowParamsBuilder (skuDetails); - - builder = LocalRef (env->CallObjectMethod (builder.get(), - BillingFlowParamsBuilder.setOldSku, - javaString (subscriptionIdentifier).get(), - javaString (purchase.purchaseToken).get())); + const LocalRef subscriptionBuilder { getEnv()->CallStaticObjectMethod (BillingFlowParamsSubscriptionUpdateParams, + BillingFlowParamsSubscriptionUpdateParams.newBuilder) }; + env->CallObjectMethod (subscriptionBuilder.get(), + BillingFlowParamsSubscriptionUpdateParamsBuilder.setOldPurchaseToken, + javaString (purchase.purchaseToken).get()); if (! creditForUnusedSubscription) - builder = LocalRef (env->CallObjectMethod (builder.get(), - BillingFlowParamsBuilder.setReplaceSkusProrationMode, - 3 /*IMMEDIATE_WITHOUT_PRORATION*/)); + { + env->CallObjectMethod (subscriptionBuilder.get(), + BillingFlowParamsSubscriptionUpdateParamsBuilder.setReplaceProrationMode, + 3 /*IMMEDIATE_WITHOUT_PRORATION*/); + } + + const LocalRef subscriptionParams { env->CallObjectMethod (subscriptionBuilder.get(), + BillingFlowParamsSubscriptionUpdateParamsBuilder.build) }; - launchBillingFlowWithParameters (LocalRef (env->CallObjectMethod (builder.get(), - BillingFlowParamsBuilder.build))); + const LocalRef builder { env->CallStaticObjectMethod (BillingFlowParams, BillingFlowParams.newBuilder) }; + env->CallObjectMethod (builder.get(), + BillingFlowParamsBuilder.setSubscriptionUpdateParams, + subscriptionParams.get()); + const LocalRef params { env->CallObjectMethod (builder.get(), BillingFlowParamsBuilder.build) }; + + launchBillingFlowWithParameters (params); } } } - notifyListenersAboutPurchase ({}, false, NEEDS_TRANS ("Unable to get subscription details")); + callMemberOnMainThread ([this] + { + notifyListenersAboutPurchase ({}, false, NEEDS_TRANS ("Unable to get subscription details")); + }); }); getProductsBoughtAsync(); } - void purchaseProductWithSkuDetails (LocalRef skuDetails) + void purchaseProductWithProductDetails (GlobalRef productDetails) { if (! isReady()) { @@ -407,22 +507,48 @@ private: return; } - launchBillingFlowWithParameters (LocalRef (getEnv()->CallObjectMethod (createBillingFlowParamsBuilder (skuDetails).get(), - BillingFlowParamsBuilder.build))); + auto* env = getEnv(); + const LocalRef billingFlowParamsProductDetailsParamsBuilder { env->CallStaticObjectMethod (BillingFlowParamsProductDetailsParams, BillingFlowParamsProductDetailsParams.newBuilder) }; + env->CallObjectMethod (billingFlowParamsProductDetailsParamsBuilder, BillingFlowParamsProductDetailsParamsBuilder.setProductDetails, productDetails.get()); + + if (const LocalRef subscriptionDetailsList { env->CallObjectMethod (productDetails, ProductDetails.getSubscriptionOfferDetails) }) + { + if (env->CallIntMethod (subscriptionDetailsList, JavaList.size) > 0) + { + const LocalRef subscriptionDetails { env->CallObjectMethod (subscriptionDetailsList, JavaList.get, 0) }; + const LocalRef offerToken { env->CallObjectMethod (subscriptionDetails, SubscriptionOfferDetails.getOfferToken) }; + env->CallObjectMethod (billingFlowParamsProductDetailsParamsBuilder, BillingFlowParamsProductDetailsParamsBuilder.setOfferToken, offerToken.get()); + } + } + + const LocalRef billingFlowParamsProductDetailsParams { env->CallObjectMethod (billingFlowParamsProductDetailsParamsBuilder, BillingFlowParamsProductDetailsParamsBuilder.build) }; + + const LocalRef list { env->NewObject (JavaArrayList, JavaArrayList.constructor, 0) }; + env->CallBooleanMethod (list, JavaArrayList.add, billingFlowParamsProductDetailsParams.get()); + + const LocalRef billingFlowParamsBuilder { env->CallStaticObjectMethod (BillingFlowParams, BillingFlowParams.newBuilder) }; + env->CallObjectMethod (billingFlowParamsBuilder, BillingFlowParamsBuilder.setProductDetailsParamsList, list.get()); + const LocalRef params { env->CallObjectMethod (billingFlowParamsBuilder, BillingFlowParamsBuilder.build) }; + + launchBillingFlowWithParameters (params); } void consumePurchaseWithToken (const String& productIdentifier, const String& purchaseToken) { if (! isReady()) { - notifyListenersAboutConsume (productIdentifier, false, NEEDS_TRANS ("In-App purchases unavailable")); + callMemberOnMainThread ([this, productIdentifier] + { + notifyListenersAboutConsume (productIdentifier, false, NEEDS_TRANS ("In-App purchases unavailable")); + }); + return; } getEnv()->CallObjectMethod (billingClient, JuceBillingClient.consumePurchase, - LocalRef (javaString (productIdentifier)).get(), - LocalRef (javaString (purchaseToken)).get()); + LocalRef { javaString (productIdentifier) }.get(), + LocalRef { javaString (purchaseToken) }.get()); } //============================================================================== @@ -433,25 +559,59 @@ private: auto* env = getEnv(); - return { juceString (LocalRef ((jstring) env->CallObjectMethod (purchase, AndroidPurchase.getOrderId))), - juceString (LocalRef ((jstring) env->CallObjectMethod (purchase, AndroidPurchase.getSku))), - juceString (LocalRef ((jstring) env->CallObjectMethod (purchase, AndroidPurchase.getPackageName))), + if (env->CallIntMethod(purchase, AndroidPurchase.getPurchaseState) != 1 /* PURCHASED */) + return {}; + + return { juceString (LocalRef { (jstring) env->CallObjectMethod (purchase, AndroidPurchase.getOrderId) }), + javaListOfStringToJuceStringArray (LocalRef { env->CallObjectMethod (purchase, AndroidPurchase.getProducts) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (purchase, AndroidPurchase.getPackageName) }), Time (env->CallLongMethod (purchase, AndroidPurchase.getPurchaseTime)).toString (true, true, true, true), - juceString (LocalRef ((jstring) env->CallObjectMethod (purchase, AndroidPurchase.getPurchaseToken))) }; + juceString (LocalRef { (jstring) env->CallObjectMethod (purchase, AndroidPurchase.getPurchaseToken) }) }; } - static InAppPurchases::Product buildProduct (LocalRef productSkuDetails) + static InAppPurchases::Product buildProduct (LocalRef productDetails) { - if (productSkuDetails == nullptr) + if (productDetails == nullptr) return {}; auto* env = getEnv(); - return { juceString (LocalRef ((jstring) env->CallObjectMethod (productSkuDetails, SkuDetails.getSku))), - juceString (LocalRef ((jstring) env->CallObjectMethod (productSkuDetails, SkuDetails.getTitle))), - juceString (LocalRef ((jstring) env->CallObjectMethod (productSkuDetails, SkuDetails.getDescription))), - juceString (LocalRef ((jstring) env->CallObjectMethod (productSkuDetails, SkuDetails.getPrice))), - juceString (LocalRef ((jstring) env->CallObjectMethod (productSkuDetails, SkuDetails.getPriceCurrencyCode))) }; + if (LocalRef oneTimePurchase { env->CallObjectMethod (productDetails, ProductDetails.getOneTimePurchaseOfferDetails) }) + { + return { juceString (LocalRef { (jstring) env->CallObjectMethod (productDetails, ProductDetails.getProductId) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (productDetails, ProductDetails.getTitle) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (productDetails, ProductDetails.getDescription) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (oneTimePurchase, OneTimePurchaseOfferDetails.getFormattedPrice) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (oneTimePurchase, OneTimePurchaseOfferDetails.getPriceCurrencyCode) }) }; + } + + LocalRef subscription { env->CallObjectMethod (productDetails, ProductDetails.getSubscriptionOfferDetails) }; + + if (env->CallIntMethod (subscription, JavaList.size) == 0) + return {}; + + // We can only return a single subscription price for this subscription, + // but the subscription has more than one pricing scheme. + jassert (env->CallIntMethod (subscription, JavaList.size) == 1); + + const LocalRef offerDetails { env->CallObjectMethod (subscription, JavaList.get, 0) }; + const LocalRef pricingPhases { env->CallObjectMethod (offerDetails, SubscriptionOfferDetails.getPricingPhases) }; + const LocalRef phaseList { env->CallObjectMethod (pricingPhases, PricingPhases.getPricingPhaseList) }; + + if (env->CallIntMethod (phaseList, JavaList.size) == 0) + return {}; + + // We can only return a single subscription price for this subscription, + // but the pricing scheme for this subscription has more than one phase. + jassert (env->CallIntMethod (phaseList, JavaList.size) == 1); + + const LocalRef phase { env->CallObjectMethod (phaseList, JavaList.get, 0) }; + + return { juceString (LocalRef { (jstring) env->CallObjectMethod (productDetails, ProductDetails.getProductId) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (productDetails, ProductDetails.getTitle) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (productDetails, ProductDetails.getDescription) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (phase, PricingPhase.getFormattedPrice) }), + juceString (LocalRef { (jstring) env->CallObjectMethod (phase, PricingPhase.getPriceCurrencyCode) }) }; } static String getStatusDescriptionFromResponseCode (int responseCode) @@ -478,29 +638,29 @@ private: void purchaseCompleted (jobject purchase, int responseCode) { - notifyListenersAboutPurchase (buildPurchase (LocalRef (purchase)), + notifyListenersAboutPurchase (buildPurchase (LocalRef { purchase }), wasSuccessful (responseCode), getStatusDescriptionFromResponseCode (responseCode)); } void purchaseConsumed (jstring productIdentifier, int responseCode) { - notifyListenersAboutConsume (juceString (LocalRef (productIdentifier)), + notifyListenersAboutConsume (juceString (LocalRef { productIdentifier }), wasSuccessful (responseCode), getStatusDescriptionFromResponseCode (responseCode)); } - void updateSkuDetails (jobject skuDetailsList) + void updateProductDetails (jobject productDetailsList) { - jassert (! skuDetailsQueryCallbackQueue.empty()); - skuDetailsQueryCallbackQueue.front() (LocalRef (skuDetailsList)); - skuDetailsQueryCallbackQueue.pop(); + jassert (! productDetailsQueryCallbackQueue.empty()); + productDetailsQueryCallbackQueue.front() (LocalRef { productDetailsList }); + productDetailsQueryCallbackQueue.pop(); } void updatePurchasesList (jobject purchasesList) { jassert (! purchasesListQueryCallbackQueue.empty()); - purchasesListQueryCallbackQueue.front() (LocalRef (purchasesList)); + purchasesListQueryCallbackQueue.front() (LocalRef { purchasesList }); purchasesListQueryCallbackQueue.pop(); } @@ -508,13 +668,32 @@ private: InAppPurchases& owner; GlobalRef billingClient; - std::queue)>> skuDetailsQueryCallbackQueue, + std::queue)>> productDetailsQueryCallbackQueue, purchasesListQueryCallbackQueue; //============================================================================== + void callMemberOnMainThread (std::function callback) + { + callOnMainThread ([ref = WeakReference (this), callback] + { + if (ref != nullptr) + callback(); + }); + } + + //============================================================================== + JUCE_DECLARE_WEAK_REFERENCEABLE(Pimpl) JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl) }; +void juce_handleOnResume() +{ + callOnMainThread ([] + { + InAppPurchases::getInstance()->restoreProductsBoughtList (false); + }); +} + InAppPurchases::Pimpl::JuceBillingClient_Class InAppPurchases::Pimpl::JuceBillingClient; diff --git a/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp b/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp index a5270dc1..6176d50b 100644 --- a/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp +++ b/modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/capture/juce_CameraDevice.cpp b/modules/juce_video/capture/juce_CameraDevice.cpp index 4fb3620b..da0f3a6d 100644 --- a/modules/juce_video/capture/juce_CameraDevice.cpp +++ b/modules/juce_video/capture/juce_CameraDevice.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -31,11 +31,7 @@ namespace juce #elif JUCE_WINDOWS #include "../native/juce_win32_CameraDevice.h" #elif JUCE_IOS - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") - #include "../native/juce_ios_CameraDevice.h" - - JUCE_END_IGNORE_WARNINGS_GCC_LIKE #elif JUCE_ANDROID #include "../native/juce_android_CameraDevice.h" #endif diff --git a/modules/juce_video/capture/juce_CameraDevice.h b/modules/juce_video/capture/juce_CameraDevice.h index 9216d633..21bd4f63 100644 --- a/modules/juce_video/capture/juce_CameraDevice.h +++ b/modules/juce_video/capture/juce_CameraDevice.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/juce_video.cpp b/modules/juce_video/juce_video.cpp index 4ded38bb..8cfdf8c2 100644 --- a/modules/juce_video/juce_video.cpp +++ b/modules/juce_video/juce_video.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/juce_video.h b/modules/juce_video/juce_video.h index 42529475..8d4d78cf 100644 --- a/modules/juce_video/juce_video.h +++ b/modules/juce_video/juce_video.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_video vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE video playback and capture classes description: Classes for playing video and capturing camera input. website: http://www.juce.com/juce diff --git a/modules/juce_video/juce_video.mm b/modules/juce_video/juce_video.mm index 0903e8b6..7799bcfb 100644 --- a/modules/juce_video/juce_video.mm +++ b/modules/juce_video/juce_video.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionCaptureCallback.java b/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionCaptureCallback.java index 5d3fff65..14ee7990 100644 --- a/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionCaptureCallback.java +++ b/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionCaptureCallback.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionStateCallback.java b/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionStateCallback.java index e6cbe28f..28a1e341 100644 --- a/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionStateCallback.java +++ b/modules/juce_video/native/java/app/com/rmsl/juce/CameraCaptureSessionStateCallback.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/native/java/app/com/rmsl/juce/CameraDeviceStateCallback.java b/modules/juce_video/native/java/app/com/rmsl/juce/CameraDeviceStateCallback.java index b3493e5f..78c6037b 100644 --- a/modules/juce_video/native/java/app/com/rmsl/juce/CameraDeviceStateCallback.java +++ b/modules/juce_video/native/java/app/com/rmsl/juce/CameraDeviceStateCallback.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/native/java/app/com/rmsl/juce/JuceOrientationEventListener.java b/modules/juce_video/native/java/app/com/rmsl/juce/JuceOrientationEventListener.java index 6b4de807..f743c002 100644 --- a/modules/juce_video/native/java/app/com/rmsl/juce/JuceOrientationEventListener.java +++ b/modules/juce_video/native/java/app/com/rmsl/juce/JuceOrientationEventListener.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/native/java/app/com/rmsl/juce/MediaControllerCallback.java b/modules/juce_video/native/java/app/com/rmsl/juce/MediaControllerCallback.java index f8a39508..c30cebe8 100644 --- a/modules/juce_video/native/java/app/com/rmsl/juce/MediaControllerCallback.java +++ b/modules/juce_video/native/java/app/com/rmsl/juce/MediaControllerCallback.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/native/java/app/com/rmsl/juce/MediaSessionCallback.java b/modules/juce_video/native/java/app/com/rmsl/juce/MediaSessionCallback.java index f5ba7dd9..8f554a2b 100644 --- a/modules/juce_video/native/java/app/com/rmsl/juce/MediaSessionCallback.java +++ b/modules/juce_video/native/java/app/com/rmsl/juce/MediaSessionCallback.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/native/java/app/com/rmsl/juce/SystemVolumeObserver.java b/modules/juce_video/native/java/app/com/rmsl/juce/SystemVolumeObserver.java index 5e509f4b..6c1237b2 100644 --- a/modules/juce_video/native/java/app/com/rmsl/juce/SystemVolumeObserver.java +++ b/modules/juce_video/native/java/app/com/rmsl/juce/SystemVolumeObserver.java @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/native/juce_android_CameraDevice.h b/modules/juce_video/native/juce_android_CameraDevice.h index 692b12e4..45a731cc 100644 --- a/modules/juce_video/native/juce_android_CameraDevice.h +++ b/modules/juce_video/native/juce_android_CameraDevice.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/native/juce_android_Video.h b/modules/juce_video/native/juce_android_Video.h index 66d25cf6..101bf958 100644 --- a/modules/juce_video/native/juce_android_Video.h +++ b/modules/juce_video/native/juce_android_Video.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/native/juce_ios_CameraDevice.h b/modules/juce_video/native/juce_ios_CameraDevice.h index 49f84741..cc6782c3 100644 --- a/modules/juce_video/native/juce_ios_CameraDevice.h +++ b/modules/juce_video/native/juce_ios_CameraDevice.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -766,7 +766,7 @@ private: //============================================================================== #if JUCE_USE_NEW_CAMERA_API - class PhotoOutputDelegateClass : public ObjCClass + class API_AVAILABLE (ios (10.0)) PhotoOutputDelegateClass : public ObjCClass { public: PhotoOutputDelegateClass() : ObjCClass ("PhotoOutputDelegateClass_") @@ -820,6 +820,7 @@ private: JUCE_CAMERA_LOG ("didFinishCaptureForSettings(), error = " + errorString); } + API_AVAILABLE (ios (11.0)) static void didFinishProcessingPhoto (id self, SEL, AVCapturePhotoOutput*, AVCapturePhoto* capturePhoto, NSError* error) { getOwner (self).takingPicture = false; diff --git a/modules/juce_video/native/juce_mac_CameraDevice.h b/modules/juce_video/native/juce_mac_CameraDevice.h index 8fc23607..dbbcca66 100644 --- a/modules/juce_video/native/juce_mac_CameraDevice.h +++ b/modules/juce_video/native/juce_mac_CameraDevice.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -226,7 +226,7 @@ private: { JUCE_CAMERA_LOG (nsStringToJuce ([notification description])); - NSError* error = notification.userInfo[AVCaptureSessionErrorKey]; + NSError* error = [notification.userInfo objectForKey: AVCaptureSessionErrorKey]; auto errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String(); getOwner (self).cameraSessionRuntimeError (errorString); } @@ -244,8 +244,7 @@ private: }; #if JUCE_USE_NEW_CAMERA_API - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") - class PostCatalinaPhotoOutput : public ImageOutputBase + class API_AVAILABLE (macos (10.15)) PostCatalinaPhotoOutput : public ImageOutputBase { public: PostCatalinaPhotoOutput() @@ -329,7 +328,6 @@ private: AVCapturePhotoOutput* imageOutput = nil; std::unique_ptr delegate; }; - JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") diff --git a/modules/juce_video/native/juce_mac_Video.h b/modules/juce_video/native/juce_mac_Video.h index a2bdbe39..7c1db8fa 100644 --- a/modules/juce_video/native/juce_mac_Video.h +++ b/modules/juce_video/native/juce_mac_Video.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -195,8 +195,15 @@ private: public: ~PlayerControllerBase() { - detachPlayerStatusObserver(); - detachPlaybackObserver(); + // Derived classes must call detachPlayerStatusObserver() before destruction! + jassert (! playerStatusObserverAttached); + + // Derived classes must call detachPlaybackObserver() before destruction! + jassert (! playbackObserverAttached); + + // Note that it's unsafe to call detachPlayerStatusObserver and detachPlaybackObserver + // directly here, because those functions call into the derived class, which will have + // been destroyed at this point. } protected: @@ -226,8 +233,8 @@ private: if ([keyPath isEqualToString: nsStringLiteral ("rate")]) { - auto oldRate = [change[NSKeyValueChangeOldKey] floatValue]; - auto newRate = [change[NSKeyValueChangeNewKey] floatValue]; + auto oldRate = [[change objectForKey: NSKeyValueChangeOldKey] floatValue]; + auto newRate = [[change objectForKey: NSKeyValueChangeNewKey] floatValue]; if (oldRate == 0 && newRate != 0) owner.playbackStarted(); @@ -236,7 +243,7 @@ private: } else if ([keyPath isEqualToString: nsStringLiteral ("status")]) { - auto status = [change[NSKeyValueChangeNewKey] intValue]; + auto status = [[change objectForKey: NSKeyValueChangeNewKey] intValue]; if (status == AVPlayerStatusFailed) owner.errorOccurred(); @@ -329,8 +336,8 @@ private: auto* urlAsset = (AVURLAsset*) playerItem.asset; URL url (nsStringToJuce (urlAsset.URL.absoluteString)); - auto oldStatus = [change[NSKeyValueChangeOldKey] intValue]; - auto newStatus = [change[NSKeyValueChangeNewKey] intValue]; + auto oldStatus = [[change objectForKey: NSKeyValueChangeOldKey] intValue]; + auto newStatus = [[change objectForKey: NSKeyValueChangeNewKey] intValue]; // Ignore spurious notifications if (oldStatus == newStatus) @@ -481,6 +488,8 @@ private: forKeyPath: nsStringLiteral ("status") options: NSKeyValueObservingOptionNew context: this]; + + playerStatusObserverAttached = true; } void detachPlayerStatusObserver() @@ -495,6 +504,8 @@ private: forKeyPath: nsStringLiteral ("status") context: this]; } + + playerStatusObserverAttached = false; } void attachPlaybackObserver() @@ -505,6 +516,8 @@ private: name: AVPlayerItemDidPlayToEndTimeNotification object: [crtp().getPlayer() currentItem]]; JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + playbackObserverAttached = true; } void detachPlaybackObserver() @@ -512,6 +525,8 @@ private: JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector") [[NSNotificationCenter defaultCenter] removeObserver: playerItemPlaybackStatusObserver.get()]; JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + playbackObserverAttached = false; } private: @@ -556,6 +571,8 @@ private: owner.playbackStopped(); } + bool playerStatusObserverAttached = false, playbackObserverAttached = false; + JUCE_DECLARE_WEAK_REFERENCEABLE (PlayerControllerBase) }; @@ -567,43 +584,19 @@ private: PlayerController (Pimpl& ownerToUse, bool useNativeControlsIfAvailable) : PlayerControllerBase (ownerToUse, useNativeControlsIfAvailable) { - #if JUCE_32BIT - // 32-bit builds don't have AVPlayerView, so need to use a layer - useNativeControls = false; - #endif - - if (useNativeControls) + wrappedPlayer = [&]() -> std::unique_ptr { - #if ! JUCE_32BIT - playerView = [[AVPlayerView alloc] init]; - #endif - } - else - { - view = [[NSView alloc] init]; - playerLayer = [[AVPlayerLayer alloc] init]; - [view setLayer: playerLayer]; - } - } + if (@available (macOS 10.9, *)) + if (useNativeControls) + return std::make_unique(); - ~PlayerController() - { - #if JUCE_32BIT - [view release]; - [playerLayer release]; - #else - [playerView release]; - #endif + return std::make_unique (); + }(); } NSView* getView() { - #if ! JUCE_32BIT - if (useNativeControls) - return playerView; - #endif - - return view; + return wrappedPlayer->getView(); } Result load (NSURL* url) @@ -629,12 +622,7 @@ private: detachPlayerStatusObserver(); detachPlaybackObserver(); - #if ! JUCE_32BIT - if (useNativeControls) - [playerView setPlayer: player]; - else - #endif - [playerLayer setPlayer: player]; + wrappedPlayer->setPlayer (player); if (player != nil) { @@ -645,21 +633,44 @@ private: AVPlayer* getPlayer() const { - #if ! JUCE_32BIT - if (useNativeControls) - return [playerView player]; - #endif - - return [playerLayer player]; + return wrappedPlayer->getPlayer(); } private: - NSView* view = nil; - AVPlayerLayer* playerLayer = nil; - #if ! JUCE_32BIT - // 32-bit builds don't have AVPlayerView - AVPlayerView* playerView = nil; - #endif + struct WrappedPlayer + { + virtual ~WrappedPlayer() = default; + virtual NSView* getView() const = 0; + virtual AVPlayer* getPlayer() const = 0; + virtual void setPlayer (AVPlayer*) = 0; + }; + + class WrappedPlayerLayer : public WrappedPlayer + { + public: + WrappedPlayerLayer () { [view.get() setLayer: playerLayer.get()]; } + NSView* getView() const override { return view.get(); } + AVPlayer* getPlayer() const override { return [playerLayer.get() player]; } + void setPlayer (AVPlayer* player) override { [playerLayer.get() setPlayer: player]; } + + private: + NSUniquePtr view { [[NSView alloc] init] }; + NSUniquePtr playerLayer { [[AVPlayerLayer alloc] init] }; + }; + + class API_AVAILABLE (macos (10.9)) WrappedPlayerView : public WrappedPlayer + { + public: + WrappedPlayerView() = default; + NSView* getView() const override { return playerView.get(); } + AVPlayer* getPlayer() const override { return [playerView.get() player]; } + void setPlayer (AVPlayer* player) override { [playerView.get() setPlayer: player]; } + + private: + NSUniquePtr playerView { [[AVPlayerView alloc] init] }; + }; + + std::unique_ptr wrappedPlayer; }; #else //============================================================================== @@ -716,13 +727,19 @@ private: void setPlayer (AVPlayer* playerToUse) { + detachPlayerStatusObserver(); + detachPlaybackObserver(); + if (useNativeControls) [playerViewController.get() setPlayer: playerToUse]; else [playerLayer.get() setPlayer: playerToUse]; - attachPlayerStatusObserver(); - attachPlaybackObserver(); + if (playerToUse != nil) + { + attachPlayerStatusObserver(); + attachPlaybackObserver(); + } } private: diff --git a/modules/juce_video/native/juce_win32_CameraDevice.h b/modules/juce_video/native/juce_win32_CameraDevice.h index dbe86d97..9ba11f4e 100644 --- a/modules/juce_video/native/juce_win32_CameraDevice.h +++ b/modules/juce_video/native/juce_win32_CameraDevice.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/native/juce_win32_ComTypes.h b/modules/juce_video/native/juce_win32_ComTypes.h index 93c653a1..aac5468a 100644 --- a/modules/juce_video/native/juce_win32_ComTypes.h +++ b/modules/juce_video/native/juce_win32_ComTypes.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/native/juce_win32_Video.h b/modules/juce_video/native/juce_win32_Video.h index da3f835b..6279cd18 100644 --- a/modules/juce_video/native/juce_win32_Video.h +++ b/modules/juce_video/native/juce_win32_Video.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/playback/juce_VideoComponent.cpp b/modules/juce_video/playback/juce_VideoComponent.cpp index 07a04088..3eb62862 100644 --- a/modules/juce_video/playback/juce_VideoComponent.cpp +++ b/modules/juce_video/playback/juce_VideoComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_video/playback/juce_VideoComponent.h b/modules/juce_video/playback/juce_VideoComponent.h index 8c8556da..790b3214 100644 --- a/modules/juce_video/playback/juce_VideoComponent.h +++ b/modules/juce_video/playback/juce_VideoComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see -- 2.30.2

wvqi@D2j^ZSUd)bm1X_N8OtQ39J{cgGs;-}rxccJFsd`aKNO%ehDpj45G8 z)smb_CwqSbHcnw|^ec$>{1DBWjaD$FlX0p~V|)vMBOnF{VY|2CZTY{%*SwR&Qy<6M zdP~L%a^wWTi>*Jwm0WZ_1LL>?V(vQ9Z?6*oB2ZIjHzI66haWOU3E0=Wov!%){EjY$ zRHw41^Kl;B{7*c&YdHxoh7c;a5B}(5sViSZS!5E~2AA3-$(}n3sEqSb|0TTmbL7&= z-5FPbb`_}ZBBMX{fz)7Q2k>^>PU49Vl6>hu(fAN>_Y8&Ar?6+p4Nsgbg)y zcH@y&^+#F(=#E>Kq@#p3evfjdWKK4|TEft8!C;fY;M^d|QsQaY~o_=BPN z%$@iivd^rFmw2AQ+XxgYMxX-a#JhixLs`M8J|0t+-H~W~qZv;{1C$c9K1$-rj}f#! zRh#+`r?NC8;Cb=*U}uMgYCjIC(f81BM7Mwfza-j#Oq~r6abD z)my*7BisL(&cv3?ao%{J@eijgG>ysS1BZ!v6(!O2ZDhC!BL>97k3T@*<**kO7kAp_ zFnouVaYkApsDV%Nr6&BHD++Q~-+H{%_9qPat>n^USno`a=_CApq(3&%q@mjAQyAH% zd92?RpN>Q`d%B(WpVxh!Y54`Nsmfk-5FA$s zlEH5e&Og&*0Drqdrxk@2n&(DZ)n|L>U+7A-=uYfq)z;4uPaQl8lzW3CxYSoH z$}QuM`XqaQK{{IRNZ_Him1OLmoJxnLzmMEK5RWD-Y7ME4-(t97$GZ|OZ14O_-jSnK z2^0q1lME;Tnxx70-oNx|(Diw>0#HIcv+vjW-Ucs-v1a?1Nd?KHe((bX+Qz)vE68Og zO~xKZgT0LGYDh?Q-Apbk42jm`)SmW=4gMPn^$FV7W_%-t&NKUdjpl8`0if%9?_c_K zlQa$3DF$5uG&MGS_=pJBa!XU= zk@x=n3|@<%VL!MP=?{%MT$F_0$-34D7~bGjI%7N7dGL?qlR|4eVKv6g>bK*VY%_rp zq;}&cR*}EuUoM1lKN75*kEuBE4Y~@j*n=-Hlr&_Dvaa<35`HInPjW&cGj{V30KjL? zd$di2-{x!0<47q_?fWUIVCd)53T!@bE6Q+!FOEk9$CS`eb$(7yo9Mk0G|A{FL&JEn zy9vC03%EfrF7EWd1zT7nnel<5$u=~$C+91?AkI_!eu|UtF|MK_{Pr{FJ(~5!=d#Wa zYxR3>IFFnGq|JhQQv2D^wvwR@VkPDG($e!%-piu#gHl_zkkZJctlpGr<0O0UfP$a> z4}=AqB-!)J9Lfsr^o-Gx@g6l^UMd`vbgSXxic4x-%2X}0@mLK`R>w&f<#I5 z+=|*>vI=uIiaTu?=;&oHE+#a`6|Wa0d1CJma3zb^W!4I@h&isBze-JPXNpyWL zr?YAaSK`)R$Qwg{b0~ti*|%n?AkL$^zk?&WXJ{S(tI!fH3x3nsnA_1^P6D8*3A_K~ z3%h(TxY;=QMhdXR{D5bgZ_oW2wY*WR%B-exwEUB_*B>5ZV+k3gy#M42yPBGEyIJm-g79SX zZS}f?w`nj$q9nS%MNWo6rBiSwo=M@d2^Twp zMCy=|!MCn`se?S(d|UppE)`X!&o$;JG&bdYSO|${Z)Q$!f8@A#+qF} zC41))O2ZB0kq&v>Uire0v=On-ABh8O=MekwPMx6sTFgY6jMHWdp7 zXVPg|5|SuucKwu;&3_9gMg*(B>b!5&u3TsTbSsBIV!GB)YzvQ%N&nE~e_#B5C(X(~CQO*&x3w zZN1xhvF)x*n7aH>tgp&Vjg3QFDi28jh@jV=vuXp%Z9{9`kx-z72Y1{+FsM9H$|Dnr zy7P`|I{?99a`}lwL)ksR)b^6>yPx7XTQ?;8eu?!DWG^a)(9EmA9;Fe3UcunjUxX=} zK46K!`aHPf2B3t3Y;Tp@u03bfhM{KJ8&(ergnt(!d9TS8%kJ){*m&S!27U=b$StR? z;>}039YCNh%&NH}2la}Qime50r#SQ?>A<0h?pw)aJLlA#f+?GQ6zc*E;wqteS2OVY zP&OWTnBCn^6{Js#5ibz_eK^++O8|Uv@#-y(!!M-(YF$SvS-G=`gg>yKxd8JgT}e8< z)zNnvAQ+;d*-R=wKBuQk^!$+Y%uy_qlj!*gHs~QI^Wd3(2R4^X#p4YDQiM-fen<%M z*OT!3Sh=$aNAeGvB48bdUw(1%>Mg^$epmuP0jtixiz7Yxo(L!b2|vQB9p4_Llu#9& z$?TeUQ?p{yuM;>0&|gnO?O7lf%(i;I&}AXDD3A?*bzc z;+@}3hs@4~3E@tE7e|M6phtNAComHR58kqR=S}o@g;Cx*u82+9Z}cr$(mIrL|JRb& zMzTqoY^^8XQPs`)+@~Lr5HGepz~=VH230N0seL;$sxB-n_5b_O1bcSCq}|kMUyL0|hzr2T;|`wVr%u zuy9|wkoTLvYU!#(;M?o+4I7q5F_iGYw(ABp6BZHPJnd6dmdq+Zonwhm5t&70$&9Qe zRa2z;?xN`S{;xxbcYPzbl5Qz(!xf;T=*nDB1XDJP@NrkeApO5Db&vqnZJk- z`1ZQ1mafYC#T7*KUU$wT_aJ(2z9$0Ee=1PQA2%-_Br};1a-uAr^%cTSG46+RXL{9H zIhFI18?gQ^#@6&V7kvE0gLv_$b1190)83gmG8=EJ06{_}L{4b}H_AY|3{}e?H!mmQ z7bsJeqKMvm-8qls7M?i^1$pZNV7b}}o8H0*0iRvn&+_=5TLvvx7M{f7S&f;nXX8(q zq$Fslx+tfz$=;u)GuDm^BE-ACPcDW*5-P`;@~%usv+;remdMHfi9{z4TJrHdx3H`G z*}~|o6m`O;7t7U!>g|OQyMliHtW{fmFSyY-g*X;W`wFbt^HX+qK0T;RnOJr_iyA)v z%2ne95r>-Se9FR;vX)i#N%j2>#*IUiix>YreqtlJEO|o>??c=&#>e+dw=r_Ub(pFX z1}vp0J35}?u{}R2*uLL5qP`d0`1!L|ZOs)!;dFT}ARfDq>Qo4-s? zqIJ-6Gpd(zySn`d000?=TnXKiXyp%EzLIxtzkV`fYJFym6^w!j01-6yz?wd= zpLSd+$QhlYB>g0JZ@iXNFu1~mD&+DcuzLWX2=MOq#)=xN%-efCXi7iF#IVj>% z6`jd~Nz1aX0My3mYyZk9hW#!S>5s2AMx^Z0tfj>%0Y8TAT1QcC1=Pc>zm)I^pB+@= zuNrXQ=6`2b_lp#2#b%5USpA=C7O(#C(xru61{Qpjh@g~)zXZCeVB!zhaPU4J-}B?a z>&CEX`ae=%aR$XaSOVKkL)E)-SpF+s;$_tCp!kpfjzmDJ?{)$&x7hgZtSgbwz#8?j z!{XE~CVaxxSps~(<9mM0hJ!;1dYc7BK{rtv{!$@l{(eSen!N7K5A^w>A2m+lv{phH zYxew%m-gQ?s9bSOn8h>yg}RE<3srT25sbJ@DnBKsubJ%q6~%4*GZ+?dh;`&c=tiRb!-pQ*j9oY`=*e9ZzKu0uj!f`OnlT3QrVnE1;+fzuR;@Ej=3;Y*utlgvB%enYxP8ib^r4nqYcWZgKzo z#Aa-;hw-0g+acERwVX;ysEp9ekAm$S*(PN}eVm%pvkrbxT6#9{yG_@lDimy`rl`Ub z>L+qDs~jdHCICdx&!6>pB1G^ZCnOz(5(0|Fx61$9@G&|Q`vxuRmm@|7%uA378J z_h5a3RKFX0nDH|U-ppfl0TZ7+R*WFdlkyrvnRub*tc_kx`xIruYGjXbKzx1L(^ zO&jQERSQ>VI+RwDD^FTMRms$>6UCDzl`yaXwX zVPz5E08uKZt-=jAkhSYskHiz7!p8TGM&syjPiXd)S9;(^!m{l{4k0xSXV7w zl~l)G;fAESP^QArF9gEe_R_MPgusmIrJOtGYlNNAwmlajZZ$Qf^K&R0kcvG>@q7La zm4H<2HvHsPauEVf-8qSR9{O}8f;80ibW*n3KNY790 z!g}kVh)ypGg92qa+Xa9SntwGTc?x36W>Rwc4+nMZNuzYc_m0fWuc+e^OD64=J%6|$ zdj~EcqZ*uj)v8tc@ypKG+f@-eAcl8R&?#8)t;@Q$+nF)pY|0}O2R&*FIi)mIEhXu9 z(wW$RFtXWdlwMAq_617A+4H|AdhWna+z%t%rm?}p`kM$vFU4`EWG!u?lh9Nbwr2x{ zo38{kfjjkWL{9oL5*|D}w`Pv|ZeRD|jKZ(5wk2W!D_76lJNfQ^{KxN)s^QA0XJ=Tk zV!fXAlO4~NG|w(Yl;;mk<1bNzwUKN2d?E-*=45lnG}L4Nal7_b($Rb_GLS z#c3><^xmBG4}I-lMuWByYE3Z^BJej;QgLMtWd*0^RBY!aG_jBT=L|uN5I+7ILbE>v zPH513s#>-kT+3Y>ufezO2n>EfjNI70_~CE-<4NmB-D+)24qBT8+ZEI6RrM|kyxdVN zfferF{4cz)KU>fgLBue-_9B+f`*y}RztF)&434q9dD=haWcwfZtpwiljK2suLm|LV zJcysnF_(o26FKF}IMt_urWoG$NgL@%bP|!%zK1*Y(#+I5_`P1(e-C$W`WFH#1t0u? zs_I=`F}=P?#>QlI%`q@r<@jos2y$OPgM43u~w*z3<+HpUD4QQx5HS6Fj2~{$y z<`PnVA06?RGh2duWs?9tr!`#9#IobagBT0Zbvk6Df$gQ{uhrmD-t|P>Y?*h``@MZ#PxIW~8%g+a zhWp_KgA#D+w0~rF?Il_3?XSIi|0nTccjj1rJmcVmPp4|yJq+zx72CTDZ`%*C?Q2o% zfvF{J4vN^vMHYO&->E3 zj~*ygbf4ic=Dkc6`S#NnH3Yu5S}h}#FG{G1*74rszDZ?tY7TbzO3Lr!`Q{(6tMdU2 z(IGDX3?;71qK2Y14NF;<)a~Y=QG)!q-=DO^{zboF%T^q0AV0=G?p7r~y5yLLW4W0Ly zMStEsTIc-(G3EjQ(n8?IHRmsMTzSX_ntgpX3Z6&81ZUwDqp%#eF}b zBfbf6kO6m1iW1;RggLdBaYEgP2xZOnclhMw5VpRJ$`i=l!i;I|AsvFiIX2LM< z(XX$`%>35NEC528pdE5Zne1$Cf0X;SHsS?ZSkvA^FpjhZzFu(c*{jx#_27ph5de@D z0yjMV){|Z1{@MCE_!-`?5x`?n{S}-$^Ak8G*L`GK5bWt(MO)wV#8d59JX8aWgmFv> z)zP`sPdJl?s`H4r6~kzo5_m0i?OlYba!de>7D`}!9@+Uro^H9FwCnW z?u=4UZvaI07?&6s0@f!XLI=Pjl~sH@f z@VT=ddbU^wKNQ(nlL)$YPwn%bukUw5(p^Yv!Ncmop`~{hKYQVFUT%GGi2HjX-*R4 zseQhf20x79G2lR~U$I`REx?4X0vyU=I)Ok(G>^0rQ0i82(d;iWf8u!~qkhP-B|WX5CDr#!iultM zh&bhw?j}+`dP!atW%Gg6{CWG=iTOPvH|uArGfwgC`Cm&>_p<)e0psv{wKOoITNXiy zF|T?l7tX$pib(CqRW%?=s&6elt(QT85=s;&f;hEQH#~>P=sagnvYiLF-@ulRl?bJb zu)mEJ!)_b!&SKH_4@6N50C?3-zy|)GG|&Y)(ou|Xa7>DG8$QJ;^?!w9!lSw(P)*Uf z`z&mbOG1tDilMaT--uRb4~&uziW1lqFSOjrBfI~Xz=lWcc&{G;D~@b3j(ce_obzX+ z=mh|zg}_%IdF#ZIu=6{$oWTgUTQCILOI_(4mdyHR8mitjszM;qb1QuZuBHf8GzB1n z6Iwv!w0lQ%_E(hMozL^|j<2ylwhc$hM|7{>U#%FPOr(N$U4QPQ2a0|0!#EKD04Q?9 z^B0#&JoO6^d9T`$f472zCB}m43psbjC#WuM81XvO1a$3tAAaH)jxLM95J)+dQ}4qK z&l#~=I%2zdWY-Vb)bSvO0;T27f*3(n@6u@a!`Hp(f!J7@_YQ^eBLFfiUwOV;St?&u ztJi8e#^(q>gJdlHgi|KJle4D(J*DBQk*yN2{sB6hFG7O@jQ_CU01=QV6YB3ERB|dK z(e+}fPS)=EF)y_Ko_*6!O-gw!j5oi-FtY;l#dV%S7s_6iRzWW+fCQLccZ~UV6-FT7777Eh*L*J-OmX{ z7E-wPl{OTKr@DA%-_Lk<|J|g5eutouM>COpG>~h$&wBXBW98DD593k*0Q~yb%be{~ z_n#e!nA?0$3+zrjFp^o@g&mJm>zDDC`oGPr2u4T<_-*vIUWK20j&xwnqB}|+0Ecvz z9G`IcM<}cL0>+s@Vct_F{dlUAXIg&Fvn?w~1)+@P|ER6J)eT8=GHI`z-CVck14Veo zp9|ww001mszT8y2XRTR|4xN``Vy^ZLEPvV58y{3GAbjF)`df)A=KX4C8 zKY@{vHRgFO8Rgzub?g;Af4E?8Q&ZEpoB8`0*8(7e+`RJqNN1URHSqPb8RxIj6$B)4 z#AROfd7L)&gVa|XKO#*~O_J(cO|tJ+{Ny?`XaPDvLm>TLZ)K!s-+)(r~1gTT}3u`%aUtR|^1o6lRO zT*2I$^C@xrEtw1792*?OPwmF~?O1;&f%g>F-;WIvsBHsnN3{nCGI{IzgIg%_nyrK$ z7Wl%?BqVVVsQ{@(%p{Ccf^q9`LZ@TgnHaYgH{5`6vIjaHI_Yth@cY<$a23z&yPcN4 z%@~O=CfzoZuFLcFlh>WK>Nn%zh%Xn88UX<5EkW(u9-8Ul{8HddYjsSVoziv$Jw)9o z^QxC{YW+u;Sk{2agaj|FZ0hfahbE>})F!Yt2Aa(LtElx50ae8YdqMqlYb1nmrly1C zDoDnk-k4I52*#8mri8- z2oZd!{oV_9j^`!+YdNX}0Hjv}|Gjo`iMS{*#I=08@Vgx}q`Jx}a?u^xs!z;?aql%-x z=iTt!#bv}&|LHjL>A+Wa^lSzOB3-@JBqBmZXfkuE7csZ`LZ()nOvEjHC4zBU=QO@Q z(W}p(sHOvMHut>9){Y0+*6}nwUMs4a+1sbD7)#P;`{DIPw98q9B*iV1%%+-$`jWhmh zDbAiW0xVySDZTjYGGpA&xgqD;AZ5#oZzKsuTvRQdJwS;QWkO^Yb>*{|R&gGaOXpJ_ zsiHhm3$M(p{iaEy{V4iM-I*A@^d{TsO?J{6+sxjc)$H%xL3eToi6D+^CSt^3)n}|{ z`PZSS6E?lR7u;yAe^cy%HGNG@#U!0Zjv^ZXBTK(-;J??NKNrJyP9E@$I zEw+w>iLE63fJD#&7#yj^h(XmKP3ycNBO)MrFP5u6f7Yt4>Aw|mgA2?XN&viqrp;z< zce%ZCvXgG2L9tj(p~MhE7%9O>goqQRG*m^@oj^r+G9kB=(oi*F z6D8uLm+*MaB9=t;E__q&OCog{-eR+Cswpm+$S z7zwBK7HW%nu=kVM=ZmUt4t#svb>}>Cj{xJvgRhVjeTN@uZeDqQNqa=EHm>;sO11Ti zOFu9)`kVdwew-edhnNoQYgf1?6H7mRpCiA5f$u*qNQdTDgbwT5Z`3B`J6A1Tbu{@~ z51Db=(F@CRU2e)Aet5E5B45OCl?GZd(vgRbF}h?T_4Hu5*-z-#`<5(eZIYwMpl7%o z>*PR_G}*p~SG9I6KK~lTd5aU0pNkQ1tlM>r!XQRGCnP^doVRo>KL47&hgTgN{27j| z0A7P?dLjJv$IqMR82K_*KPVVit&aag`8NuRiV;z)kC9&mR{!IRi&t+^-dGC0TsYRD zvvA{M=N}LHd2!5@B9z%c`_s=Jqxi7K5mBX21A80De_wmfstse^sAA@r0LX$W(%6Vp zU3UHq-`bD4A?GTAdf(H2WB+4}HHvjZfR6EYu1^(}sCJf9kja};&MqKG^bc=kupvfwxSPrk5=#wOka$Ax zXd8zICpg9sIo3f7g(AxvmrMC2D;EhYb0W^=YITkVYSJeNa!g+^6jZGk5pl$dk!?XT z_^rZ<-ust6-PG8mZ$zuTk>HpBC@{-)xdEuz{6xrWkDm_mS8j+)P>v6LC9_L7CJc^@ zm2}KK5H|Q8_k-RUs*OH%aQ>Mdq-{3Fx{*f{#{|Ggp~!NU3ym=AqYsAz#1p(-Iw2kLvnBO-`sN?h}#_3VR)xvQqmZrpLpk`#^5#IYHFq&U_AM+fQG4>qz~ z%GcaK5fi>Z;38nDATz|^s)Ab8(T;39Dr6$+iV+b3wfKte0#+*g8Jl{j_v}j!G}5H- zid(|5K|jJAU7c(kqKe$O`rKJ2B!uVf-~jPAEg&*-nTL5zqS5^Dn$McYDQvojSBwrU`2 zEq0?w$#XOJR<*BNccRh=jWiuI(kTLt34kJG`Ety{#$~dM6}FM(vT((E*)^xNT9ed+ z%oOy5P>HiZj5Y+mPPM*HGmcb?NIK-VMNlLyBn~0BM233Ef72JF*B)vN`br&vb{JRo zI<7RUmEB$<*rdqIpgSc(%ZzQ4JJu~bQ5$K}6)ZFB8dvDCGy3A=m;e|jsH!y5DE)in z#>VB+)YPOu{L3OY;X6^n;fThax|C3FL~2!as^iEc5LIz<)Nh(@f{$%EBnjI>&n zqzJw^vd{X~3j%Euk!Gvf9#&c;8tf;PN|v}m{1c}=?Jr-xTpAlQ?P9q!(x{ToEOLw@ a=l=t8N}ad - -VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,6,0 -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904E4" - BEGIN - VALUE "CompanyName", "Raw Material Software Limited\0" - VALUE "LegalCopyright", "Raw Material Software Limited\0" - VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "6.1.6\0" - VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "6.1.6\0" - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif - -IDI_ICON1 ICON DISCARDABLE "icon.ico" -IDI_ICON2 ICON DISCARDABLE "icon.ico" \ No newline at end of file diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj index 468c6015..c3a307bb 100644 --- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebug true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -106,7 +107,7 @@ Full ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -155,6 +157,12 @@ true + + true + + + true + true @@ -276,9 +284,15 @@ true + + true + true + + true + true @@ -294,6 +308,9 @@ true + + true + true @@ -360,6 +377,9 @@ true + + true + true @@ -1248,6 +1268,9 @@ true + + true + true @@ -1275,9 +1298,6 @@ true - - true - true @@ -1541,6 +1561,8 @@ + + @@ -1640,7 +1662,6 @@ - @@ -1691,6 +1712,7 @@ + @@ -1699,6 +1721,8 @@ + + @@ -1860,6 +1884,7 @@ + @@ -2058,6 +2083,7 @@ + @@ -2128,15 +2154,16 @@ - + + @@ -2147,7 +2174,6 @@ - diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters index 2be8d112..ef1cbed5 100644 --- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters @@ -349,6 +349,12 @@ Projucer\BinaryData\Templates + + Projucer\BinaryData\Templates + + + Projucer\BinaryData\Templates + Projucer\BinaryData\Templates @@ -556,9 +562,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -574,6 +586,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -640,6 +655,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -1570,6 +1588,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -1606,9 +1627,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -1986,6 +2004,12 @@ Projucer\BinaryData\Templates + + Projucer\BinaryData\Templates + + + Projucer\BinaryData\Templates + Projucer\BinaryData\Templates @@ -2283,9 +2307,6 @@ Projucer\ProjectSaving - - Projucer\ProjectSaving - Projucer\ProjectSaving @@ -2436,6 +2457,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -2460,6 +2484,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -2943,6 +2973,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -3537,6 +3570,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -3747,9 +3783,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -3764,12 +3797,18 @@ + + Projucer\BinaryData + Projucer\BinaryData Projucer\BinaryData + + Projucer\BinaryData + Projucer\BinaryData @@ -3800,9 +3839,6 @@ Projucer\BinaryData\Icons - - Projucer\BinaryData\Icons - Projucer\BinaryData\Icons diff --git a/extras/Projucer/Builds/VisualStudio2017/resources.rc b/extras/Projucer/Builds/VisualStudio2017/resources.rc index c41ddea2..ce25e6ad 100644 --- a/extras/Projucer/Builds/VisualStudio2017/resources.rc +++ b/extras/Projucer/Builds/VisualStudio2017/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,6,0 +FILEVERSION 7,0,0,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Raw Material Software Limited\0" VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "6.1.6\0" + VALUE "FileVersion", "7.0.0\0" VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "6.1.6\0" + VALUE "ProductVersion", "7.0.0\0" END END diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj index 4753e8f7..025fc5da 100644 --- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebug true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -106,7 +107,7 @@ Full ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -155,6 +157,12 @@ true + + true + + + true + true @@ -276,9 +284,15 @@ true + + true + true + + true + true @@ -294,6 +308,9 @@ true + + true + true @@ -360,6 +377,9 @@ true + + true + true @@ -1248,6 +1268,9 @@ true + + true + true @@ -1275,9 +1298,6 @@ true - - true - true @@ -1541,6 +1561,8 @@ + + @@ -1640,7 +1662,6 @@ - @@ -1691,6 +1712,7 @@ + @@ -1699,6 +1721,8 @@ + + @@ -1860,6 +1884,7 @@ + @@ -2058,6 +2083,7 @@ + @@ -2128,15 +2154,16 @@ - + + @@ -2147,7 +2174,6 @@ - diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters index c92b2abf..416c18b1 100644 --- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters @@ -349,6 +349,12 @@ Projucer\BinaryData\Templates + + Projucer\BinaryData\Templates + + + Projucer\BinaryData\Templates + Projucer\BinaryData\Templates @@ -556,9 +562,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -574,6 +586,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -640,6 +655,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -1570,6 +1588,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -1606,9 +1627,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -1986,6 +2004,12 @@ Projucer\BinaryData\Templates + + Projucer\BinaryData\Templates + + + Projucer\BinaryData\Templates + Projucer\BinaryData\Templates @@ -2283,9 +2307,6 @@ Projucer\ProjectSaving - - Projucer\ProjectSaving - Projucer\ProjectSaving @@ -2436,6 +2457,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -2460,6 +2484,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -2943,6 +2973,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -3537,6 +3570,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -3747,9 +3783,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -3764,12 +3797,18 @@ + + Projucer\BinaryData + Projucer\BinaryData Projucer\BinaryData + + Projucer\BinaryData + Projucer\BinaryData @@ -3800,9 +3839,6 @@ Projucer\BinaryData\Icons - - Projucer\BinaryData\Icons - Projucer\BinaryData\Icons diff --git a/extras/Projucer/Builds/VisualStudio2019/resources.rc b/extras/Projucer/Builds/VisualStudio2019/resources.rc index c41ddea2..ce25e6ad 100644 --- a/extras/Projucer/Builds/VisualStudio2019/resources.rc +++ b/extras/Projucer/Builds/VisualStudio2019/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,6,0 +FILEVERSION 7,0,0,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Raw Material Software Limited\0" VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "6.1.6\0" + VALUE "FileVersion", "7.0.0\0" VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "6.1.6\0" + VALUE "ProductVersion", "7.0.0\0" END END diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj index 11fd5e53..eb005065 100644 --- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebug true NotUsing @@ -78,7 +78,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -106,7 +107,7 @@ Full ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.6;JUCE_APP_VERSION_HEX=0x60106;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -120,7 +121,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.0;JUCE_APP_VERSION_HEX=0x70000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -155,6 +157,12 @@ true + + true + + + true + true @@ -276,9 +284,15 @@ true + + true + true + + true + true @@ -294,6 +308,9 @@ true + + true + true @@ -360,6 +377,9 @@ true + + true + true @@ -1248,6 +1268,9 @@ true + + true + true @@ -1275,9 +1298,6 @@ true - - true - true @@ -1541,6 +1561,8 @@ + + @@ -1640,7 +1662,6 @@ - @@ -1691,6 +1712,7 @@ + @@ -1699,6 +1721,8 @@ + + @@ -1860,6 +1884,7 @@ + @@ -2058,6 +2083,7 @@ + @@ -2128,15 +2154,16 @@ - + + @@ -2147,7 +2174,6 @@ - diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters index bc6960b0..114af8d8 100644 --- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters @@ -349,6 +349,12 @@ Projucer\BinaryData\Templates + + Projucer\BinaryData\Templates + + + Projucer\BinaryData\Templates + Projucer\BinaryData\Templates @@ -556,9 +562,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -574,6 +586,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -640,6 +655,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -1570,6 +1588,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -1606,9 +1627,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -1986,6 +2004,12 @@ Projucer\BinaryData\Templates + + Projucer\BinaryData\Templates + + + Projucer\BinaryData\Templates + Projucer\BinaryData\Templates @@ -2283,9 +2307,6 @@ Projucer\ProjectSaving - - Projucer\ProjectSaving - Projucer\ProjectSaving @@ -2436,6 +2457,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -2460,6 +2484,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -2943,6 +2973,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -3537,6 +3570,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -3747,9 +3783,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -3764,12 +3797,18 @@ + + Projucer\BinaryData + Projucer\BinaryData Projucer\BinaryData + + Projucer\BinaryData + Projucer\BinaryData @@ -3800,9 +3839,6 @@ Projucer\BinaryData\Icons - - Projucer\BinaryData\Icons - Projucer\BinaryData\Icons diff --git a/extras/Projucer/Builds/VisualStudio2022/resources.rc b/extras/Projucer/Builds/VisualStudio2022/resources.rc index c41ddea2..ce25e6ad 100644 --- a/extras/Projucer/Builds/VisualStudio2022/resources.rc +++ b/extras/Projucer/Builds/VisualStudio2022/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 6,1,6,0 +FILEVERSION 7,0,0,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Raw Material Software Limited\0" VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "6.1.6\0" + VALUE "FileVersion", "7.0.0\0" VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "6.1.6\0" + VALUE "ProductVersion", "7.0.0\0" END END diff --git a/extras/Projucer/CMakeLists.txt b/extras/Projucer/CMakeLists.txt index b5f3ae32..6e76a007 100644 --- a/extras/Projucer/CMakeLists.txt +++ b/extras/Projucer/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -96,7 +96,6 @@ target_compile_definitions(Projucer PRIVATE juce_add_binary_data(ProjucerData SOURCES Source/BinaryData/Icons/background_logo.svg Source/BinaryData/Icons/export_android.svg - Source/BinaryData/Icons/export_clion.svg Source/BinaryData/Icons/export_codeBlocks.svg Source/BinaryData/Icons/export_linux.svg Source/BinaryData/Icons/export_visualStudio.svg @@ -119,6 +118,10 @@ juce_add_binary_data(ProjucerData SOURCES Source/BinaryData/Templates/jucer_AudioComponentSimpleTemplate.h Source/BinaryData/Templates/jucer_AudioComponentTemplate.cpp Source/BinaryData/Templates/jucer_AudioComponentTemplate.h + Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.cpp + Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.h + Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.cpp + Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.h Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.cpp Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.h Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.cpp @@ -149,8 +152,10 @@ juce_add_binary_data(ProjucerData SOURCES Source/BinaryData/gradle/gradlew Source/BinaryData/gradle/gradlew.bat + ../Build/CMake/JuceLV2Defines.h.in ../Build/CMake/LaunchScreen.storyboard ../Build/CMake/PIPAudioProcessor.cpp.in + ../Build/CMake/PIPAudioProcessorWithARA.cpp.in ../Build/CMake/PIPComponent.cpp.in ../Build/CMake/PIPConsole.cpp.in ../Build/CMake/RecentFilesMenuTemplate.nib diff --git a/extras/Projucer/JuceLibraryCode/BinaryData.cpp b/extras/Projucer/JuceLibraryCode/BinaryData.cpp index 5dc2057b..1ce3b95d 100644 --- a/extras/Projucer/JuceLibraryCode/BinaryData.cpp +++ b/extras/Projucer/JuceLibraryCode/BinaryData.cpp @@ -4,11 +4,23 @@ */ +#include + namespace BinaryData { -//================== LaunchScreen.storyboard ================== +//================== JuceLV2Defines.h.in ================== static const unsigned char temp_binary_data_0[] = +"#pragma once\n" +"\n" +"#ifndef JucePlugin_LV2URI\n" +" #define JucePlugin_LV2URI \"${JUCE_LV2URI}\"\n" +"#endif\n"; + +const char* JuceLV2Defines_h_in = (const char*) temp_binary_data_0; + +//================== LaunchScreen.storyboard ================== +static const unsigned char temp_binary_data_1[] = "\n" "\n" @@ -27,10 +39,10 @@ static const unsigned char temp_binary_data_0[] = " \n" "\n"; -const char* LaunchScreen_storyboard = (const char*) temp_binary_data_0; +const char* LaunchScreen_storyboard = (const char*) temp_binary_data_1; //================== PIPAudioProcessor.cpp.in ================== -static const unsigned char temp_binary_data_1[] = +static const unsigned char temp_binary_data_2[] = "/*\n" " ==============================================================================\n" "\n" @@ -48,10 +60,38 @@ static const unsigned char temp_binary_data_1[] = " return new ${JUCE_PIP_MAIN_CLASS}();\n" "}\n"; -const char* PIPAudioProcessor_cpp_in = (const char*) temp_binary_data_1; +const char* PIPAudioProcessor_cpp_in = (const char*) temp_binary_data_2; + +//================== PIPAudioProcessorWithARA.cpp.in ================== +static const unsigned char temp_binary_data_3[] = +"/*\n" +" ==============================================================================\n" +"\n" +" This file was auto-generated and contains the startup code for a PIP.\n" +"\n" +" ==============================================================================\n" +"*/\n" +"\n" +"#include \n" +"#include \"${JUCE_PIP_HEADER}\"\n" +"\n" +"//==============================================================================\n" +"juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter()\n" +"{\n" +" return new ${JUCE_PIP_MAIN_CLASS}();\n" +"}\n" +"\n" +"#if JucePlugin_Enable_ARA\n" +"const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory()\n" +"{\n" +" return juce::ARADocumentControllerSpecialisation::createARAFactory<${JUCE_PIP_DOCUMENTCONTROLLER_CLASS}>();\n" +"}\n" +"#endif\n"; + +const char* PIPAudioProcessorWithARA_cpp_in = (const char*) temp_binary_data_3; //================== PIPComponent.cpp.in ================== -static const unsigned char temp_binary_data_2[] = +static const unsigned char temp_binary_data_4[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -121,10 +161,10 @@ static const unsigned char temp_binary_data_2[] = "//==============================================================================\r\n" "START_JUCE_APPLICATION (Application)\r\n"; -const char* PIPComponent_cpp_in = (const char*) temp_binary_data_2; +const char* PIPComponent_cpp_in = (const char*) temp_binary_data_4; //================== PIPConsole.cpp.in ================== -static const unsigned char temp_binary_data_3[] = +static const unsigned char temp_binary_data_5[] = "/*\n" " ==============================================================================\n" "\n" @@ -136,10 +176,10 @@ static const unsigned char temp_binary_data_3[] = "#include \n" "#include \"${JUCE_PIP_HEADER}\"\n"; -const char* PIPConsole_cpp_in = (const char*) temp_binary_data_3; +const char* PIPConsole_cpp_in = (const char*) temp_binary_data_5; //================== RecentFilesMenuTemplate.nib ================== -static const unsigned char temp_binary_data_4[] = +static const unsigned char temp_binary_data_6[] = { 98,112,108,105,115,116,48,48,212,0,1,0,2,0,3,0,4,0,5,0,6,1,53,1,54,88,36,118,101,114,115,105,111,110,88,36,111,98,106,101,99,116,115,89,36,97,114,99,104,105,118,101,114,84,36,116,111,112,18,0,1,134,160,175,16,74,0,7,0,8,0,31,0,35,0,36,0,42,0,46,0,50, 0,53,0,57,0,74,0,77,0,78,0,86,0,87,0,97,0,112,0,113,0,114,0,119,0,120,0,121,0,124,0,128,0,129,0,132,0,143,0,144,0,145,0,149,0,153,0,162,0,163,0,164,0,169,0,173,0,180,0,181,0,182,0,185,0,192,0,193,0,200,0,201,0,208,0,209,0,216,0,217,0,224,0,225,0,226, 0,229,0,230,0,232,0,249,1,11,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,47,1,50,85,36,110,117,108,108,219,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0, @@ -176,10 +216,10 @@ static const unsigned char temp_binary_data_4[] = 7,157,7,159,7,161,7,163,7,165,7,167,7,169,7,171,7,173,7,175,7,177,7,179,7,181,7,190,7,192,7,225,7,227,7,229,7,231,7,233,7,235,7,237,7,239,7,241,7,243,7,245,7,247,7,249,7,251,7,253,7,255,8,2,8,5,8,8,8,11,8,14,8,17,8,20,8,23,8,26,8,29,8,32,8,35,8,38,8, 41,8,44,8,53,8,55,8,56,8,65,8,67,8,68,8,77,8,92,8,97,8,115,8,120,8,134,0,0,0,0,0,0,2,2,0,0,0,0,0,0,1,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,136,0,0 }; -const char* RecentFilesMenuTemplate_nib = (const char*) temp_binary_data_4; +const char* RecentFilesMenuTemplate_nib = (const char*) temp_binary_data_6; //================== UnityPluginGUIScript.cs.in ================== -static const unsigned char temp_binary_data_5[] = +static const unsigned char temp_binary_data_7[] = "#if UNITY_EDITOR\n" "\n" "using UnityEditor;\n" @@ -362,10 +402,10 @@ static const unsigned char temp_binary_data_5[] = "\n" "#endif\n"; -const char* UnityPluginGUIScript_cs_in = (const char*) temp_binary_data_5; +const char* UnityPluginGUIScript_cs_in = (const char*) temp_binary_data_7; //================== gradle-wrapper.jar ================== -static const unsigned char temp_binary_data_6[] = +static const unsigned char temp_binary_data_8[] = { 80,75,3,4,10,0,0,8,8,0,42,178,149,71,0,0,0,0,2,0,0,0,0,0,0,0,9,0,0,0,77,69,84,65,45,73,78,70,47,3,0,80,75,3,4,10,0,0,8,8,0,42,178,149,71,215,149,152,82,63,0,0,0,85,0,0,0,20,0,0,0,77,69,84,65,45,73,78,70,47,77,65,78,73,70,69,83,84,46,77,70,243,77,204, 203,76,75,45,46,209,13,75,45,42,206,204,207,179,82,48,212,51,224,229,242,204,45,200,73,205,77,205,43,73,44,1,10,234,134,100,150,228,164,90,41,184,23,37,166,228,164,98,200,194,181,26,233,25,2,245,242,114,1,0,80,75,3,4,10,0,0,8,8,0,22,178,149,71,0,0,0, 0,2,0,0,0,0,0,0,0,4,0,0,0,111,114,103,47,3,0,80,75,3,4,10,0,0,8,8,0,22,178,149,71,0,0,0,0,2,0,0,0,0,0,0,0,11,0,0,0,111,114,103,47,103,114,97,100,108,101,47,3,0,80,75,3,4,10,0,0,8,8,0,22,178,149,71,0,0,0,0,2,0,0,0,0,0,0,0,19,0,0,0,111,114,103,47,103,114, @@ -1117,10 +1157,10 @@ static const unsigned char temp_binary_data_6[] = 76,105,110,101,80,97,114,115,101,114,36,65,102,116,101,114,70,105,114,115,116,83,117,98,67,111,109,109,97,110,100,46,99,108,97,115,115,80,75,1,2,20,3,10,0,0,8,8,0,10,178,149,71,105,222,125,0,70,0,0,0,68,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,180,129,219,191, 0,0,103,114,97,100,108,101,45,99,108,105,45,99,108,97,115,115,112,97,116,104,46,112,114,111,112,101,114,116,105,101,115,80,75,5,6,0,0,0,0,49,0,49,0,16,17,0,0,94,192,0,0,0,0,0,0 }; -const char* gradlewrapper_jar = (const char*) temp_binary_data_6; +const char* gradlewrapper_jar = (const char*) temp_binary_data_8; //================== gradlew ================== -static const unsigned char temp_binary_data_7[] = +static const unsigned char temp_binary_data_9[] = "#!/usr/bin/env bash\n" "\n" "##############################################################################\n" @@ -1282,10 +1322,10 @@ static const unsigned char temp_binary_data_7[] = "\n" "exec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"; -const char* gradlew = (const char*) temp_binary_data_7; +const char* gradlew = (const char*) temp_binary_data_9; //================== gradlew.bat ================== -static const unsigned char temp_binary_data_8[] = +static const unsigned char temp_binary_data_10[] = "@if \"%DEBUG%\" == \"\" @echo off\r\n" "@rem ##########################################################################\r\n" "@rem\r\n" @@ -1377,10 +1417,10 @@ static const unsigned char temp_binary_data_8[] = "\r\n" ":omega\r\n"; -const char* gradlew_bat = (const char*) temp_binary_data_8; +const char* gradlew_bat = (const char*) temp_binary_data_10; //================== LICENSE ================== -static const unsigned char temp_binary_data_9[] = +static const unsigned char temp_binary_data_11[] = "Apache License\n" " Version 2.0, January 2004\n" " http://www.apache.org/licenses/\n" @@ -1584,10 +1624,10 @@ static const unsigned char temp_binary_data_9[] = " limitations under the License.\n" "\n"; -const char* LICENSE = (const char*) temp_binary_data_9; +const char* LICENSE = (const char*) temp_binary_data_11; //================== background_logo.svg ================== -static const unsigned char temp_binary_data_10[] = +static const unsigned char temp_binary_data_12[] = "\n" " \n" " \n" @@ -1606,10 +1646,10 @@ static const unsigned char temp_binary_data_10[] = "19.41 26.977 21.709 2.136.408 6.1.755 7.377.645.325-.028 1.48-.094 2.564-.147z\" fill=\"#b8b8b8\"/>\n" "\n"; -const char* background_logo_svg = (const char*) temp_binary_data_10; +const char* background_logo_svg = (const char*) temp_binary_data_12; //================== export_android.svg ================== -static const unsigned char temp_binary_data_11[] = +static const unsigned char temp_binary_data_13[] = "\n" "\n" " \n" @@ -1640,49 +1680,10 @@ static const unsigned char temp_binary_data_11[] = " \n" ""; -const char* export_android_svg = (const char*) temp_binary_data_11; - -//================== export_clion.svg ================== -static const unsigned char temp_binary_data_12[] = -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" icon_CLion\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"\n"; - -const char* export_clion_svg = (const char*) temp_binary_data_12; +const char* export_android_svg = (const char*) temp_binary_data_13; //================== export_codeBlocks.svg ================== -static const unsigned char temp_binary_data_13[] = +static const unsigned char temp_binary_data_14[] = "\n" "\n" " \n" @@ -1704,10 +1705,10 @@ static const unsigned char temp_binary_data_13[] = " \n" ""; -const char* export_codeBlocks_svg = (const char*) temp_binary_data_13; +const char* export_codeBlocks_svg = (const char*) temp_binary_data_14; //================== export_linux.svg ================== -static const unsigned char temp_binary_data_14[] = +static const unsigned char temp_binary_data_15[] = "\n" "\n" " \n" @@ -1857,10 +1858,10 @@ static const unsigned char temp_binary_data_14[] = " \n" ""; -const char* export_linux_svg = (const char*) temp_binary_data_14; +const char* export_linux_svg = (const char*) temp_binary_data_15; //================== export_visualStudio.svg ================== -static const unsigned char temp_binary_data_15[] = +static const unsigned char temp_binary_data_16[] = "\n" "\n" " \n" @@ -1884,10 +1885,10 @@ static const unsigned char temp_binary_data_15[] = " \n" ""; -const char* export_visualStudio_svg = (const char*) temp_binary_data_15; +const char* export_visualStudio_svg = (const char*) temp_binary_data_16; //================== export_xcode.svg ================== -static const unsigned char temp_binary_data_16[] = +static const unsigned char temp_binary_data_17[] = "\n" "\n" " \n" @@ -1959,10 +1960,10 @@ static const unsigned char temp_binary_data_16[] = " \n" ""; -const char* export_xcode_svg = (const char*) temp_binary_data_16; +const char* export_xcode_svg = (const char*) temp_binary_data_17; //================== gpl_logo.svg ================== -static const unsigned char temp_binary_data_17[] = +static const unsigned char temp_binary_data_18[] = "\n" " \n" " "; -const char* gpl_logo_svg = (const char*) temp_binary_data_17; +const char* gpl_logo_svg = (const char*) temp_binary_data_18; //================== juce_icon.png ================== -static const unsigned char temp_binary_data_18[] = +static const unsigned char temp_binary_data_19[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,0,0,0,2,0,8,6,0,0,0,244,120,212,250,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,132,101,88,73,102,77,77,0,42,0,0,0,8,0,5,1,18,0,3,0,0,0,1,0,1,0,0,1,26,0,5,0,0,0,1,0,0,0,74,1,27,0,5,0,0,0,1,0,0,0,82, 1,40,0,3,0,0,0,1,0,2,0,0,135,105,0,4,0,0,0,1,0,0,0,90,0,0,0,0,0,0,0,144,0,0,0,1,0,0,0,144,0,0,0,1,0,3,160,1,0,3,0,0,0,1,0,1,0,0,160,2,0,4,0,0,0,1,0,0,2,0,160,3,0,4,0,0,0,1,0,0,2,0,0,0,0,0,25,192,84,16,0,0,0,9,112,72,89,115,0,0,22,37,0,0,22,37,1,73,82, 36,240,0,0,1,89,105,84,88,116,88,77,76,58,99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,120,58,120,109,112,109,101,116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116, @@ -3583,10 +3584,10 @@ static const unsigned char temp_binary_data_18[] = 246,44,212,239,33,44,75,155,114,119,199,74,182,59,225,163,230,56,187,0,203,253,163,244,158,144,61,194,134,54,75,89,109,30,70,120,118,29,207,206,219,205,104,221,216,184,128,155,196,214,68,235,181,92,180,4,225,231,230,249,31,56,76,178,107,226,240,74,169, 60,174,167,167,149,58,7,146,87,83,147,170,92,246,47,193,107,255,83,221,119,125,168,20,16,4,4,1,245,55,199,228,93,104,231,183,98,169,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* juce_icon_png = (const char*) temp_binary_data_18; +const char* juce_icon_png = (const char*) temp_binary_data_19; //================== wizard_AnimatedApp.svg ================== -static const unsigned char temp_binary_data_19[] = +static const unsigned char temp_binary_data_20[] = "\n" "\n" "\n" @@ -3763,10 +3764,10 @@ static const unsigned char temp_binary_data_19[] = " id=\"line44\"\n" " style=\"stroke:#a45c94;stroke-opacity:0.94117647\" />"; -const char* wizard_AnimatedApp_svg = (const char*) temp_binary_data_19; +const char* wizard_AnimatedApp_svg = (const char*) temp_binary_data_20; //================== wizard_AudioApp.svg ================== -static const unsigned char temp_binary_data_20[] = +static const unsigned char temp_binary_data_21[] = "\n" "\n" "\n" @@ -4520,10 +4521,10 @@ static const unsigned char temp_binary_data_20[] = " id=\"line131\"\n" " style=\"stroke:#a45c94;stroke-opacity:1\" />"; -const char* wizard_AudioApp_svg = (const char*) temp_binary_data_20; +const char* wizard_AudioApp_svg = (const char*) temp_binary_data_21; //================== wizard_AudioPlugin.svg ================== -static const unsigned char temp_binary_data_21[] = +static const unsigned char temp_binary_data_22[] = "\n" "\n" "\n" @@ -5379,10 +5380,10 @@ static const unsigned char temp_binary_data_21[] = " id=\"circle175\"\n" " style=\"stroke:#a45c94;stroke-opacity:1;fill:#a45c94;fill-opacity:1\" />"; -const char* wizard_AudioPlugin_svg = (const char*) temp_binary_data_21; +const char* wizard_AudioPlugin_svg = (const char*) temp_binary_data_22; //================== wizard_ConsoleApp.svg ================== -static const unsigned char temp_binary_data_22[] = +static const unsigned char temp_binary_data_23[] = "\n" "\n" "\n" @@ -5469,10 +5470,10 @@ static const unsigned char temp_binary_data_22[] = " id=\"path19\"\n" " style=\"stroke:#a45c94;stroke-opacity:1;fill:#a45c94;fill-opacity:1\" />"; -const char* wizard_ConsoleApp_svg = (const char*) temp_binary_data_22; +const char* wizard_ConsoleApp_svg = (const char*) temp_binary_data_23; //================== wizard_DLL.svg ================== -static const unsigned char temp_binary_data_23[] = +static const unsigned char temp_binary_data_24[] = "\n" "\n" "\n" @@ -5743,10 +5744,10 @@ static const unsigned char temp_binary_data_23[] = " id=\"path54\"\n" " style=\"stroke:#a45c94;stroke-opacity:1\" />"; -const char* wizard_DLL_svg = (const char*) temp_binary_data_23; +const char* wizard_DLL_svg = (const char*) temp_binary_data_24; //================== wizard_GUI.svg ================== -static const unsigned char temp_binary_data_24[] = +static const unsigned char temp_binary_data_25[] = "\n" "\n" "\n" @@ -5916,10 +5917,10 @@ static const unsigned char temp_binary_data_24[] = " id=\"path47\"\n" " style=\"stroke:#a45c94;stroke-opacity:1\" />"; -const char* wizard_GUI_svg = (const char*) temp_binary_data_24; +const char* wizard_GUI_svg = (const char*) temp_binary_data_25; //================== wizard_Highlight.svg ================== -static const unsigned char temp_binary_data_25[] = +static const unsigned char temp_binary_data_26[] = "\n" "\n" "\n" @@ -5969,10 +5970,10 @@ static const unsigned char temp_binary_data_25[] = " id=\"path3\"\n" " style=\"fill:#a45c94;fill-opacity:1\" />"; -const char* wizard_Highlight_svg = (const char*) temp_binary_data_25; +const char* wizard_Highlight_svg = (const char*) temp_binary_data_26; //================== wizard_Openfile.svg ================== -static const unsigned char temp_binary_data_26[] = +static const unsigned char temp_binary_data_27[] = "\n" "\n" "\n" @@ -6024,10 +6025,10 @@ static const unsigned char temp_binary_data_26[] = " id=\"path3\"\n" " style=\"stroke:#a45c94;stroke-opacity:1\" />"; -const char* wizard_Openfile_svg = (const char*) temp_binary_data_26; +const char* wizard_Openfile_svg = (const char*) temp_binary_data_27; //================== wizard_OpenGL.svg ================== -static const unsigned char temp_binary_data_27[] = +static const unsigned char temp_binary_data_28[] = "\n" "\n" "\n" @@ -6155,10 +6156,10 @@ static const unsigned char temp_binary_data_27[] = " id=\"path23\"\n" " style=\"stroke:#a45c94;stroke-opacity:1\" />"; -const char* wizard_OpenGL_svg = (const char*) temp_binary_data_27; +const char* wizard_OpenGL_svg = (const char*) temp_binary_data_28; //================== wizard_StaticLibrary.svg ================== -static const unsigned char temp_binary_data_28[] = +static const unsigned char temp_binary_data_29[] = "\n" "\n" "\n" @@ -6429,10 +6430,10 @@ static const unsigned char temp_binary_data_28[] = " id=\"path54\"\n" " style=\"stroke:#a45c94;stroke-opacity:1\" />"; -const char* wizard_StaticLibrary_svg = (const char*) temp_binary_data_28; +const char* wizard_StaticLibrary_svg = (const char*) temp_binary_data_29; //================== jucer_AnimatedComponentSimpleTemplate.h ================== -static const unsigned char temp_binary_data_29[] = +static const unsigned char temp_binary_data_30[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -6490,10 +6491,10 @@ static const unsigned char temp_binary_data_29[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_AnimatedComponentSimpleTemplate_h = (const char*) temp_binary_data_29; +const char* jucer_AnimatedComponentSimpleTemplate_h = (const char*) temp_binary_data_30; //================== jucer_AnimatedComponentTemplate.cpp ================== -static const unsigned char temp_binary_data_30[] = +static const unsigned char temp_binary_data_31[] = "%%include_corresponding_header%%\r\n" "\r\n" "//==============================================================================\r\n" @@ -6532,10 +6533,10 @@ static const unsigned char temp_binary_data_30[] = " // update their positions.\r\n" "}\r\n"; -const char* jucer_AnimatedComponentTemplate_cpp = (const char*) temp_binary_data_30; +const char* jucer_AnimatedComponentTemplate_cpp = (const char*) temp_binary_data_31; //================== jucer_AnimatedComponentTemplate.h ================== -static const unsigned char temp_binary_data_31[] = +static const unsigned char temp_binary_data_32[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -6567,10 +6568,10 @@ static const unsigned char temp_binary_data_31[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_AnimatedComponentTemplate_h = (const char*) temp_binary_data_31; +const char* jucer_AnimatedComponentTemplate_h = (const char*) temp_binary_data_32; //================== jucer_AudioComponentSimpleTemplate.h ================== -static const unsigned char temp_binary_data_32[] = +static const unsigned char temp_binary_data_33[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -6666,10 +6667,10 @@ static const unsigned char temp_binary_data_32[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_AudioComponentSimpleTemplate_h = (const char*) temp_binary_data_32; +const char* jucer_AudioComponentSimpleTemplate_h = (const char*) temp_binary_data_33; //================== jucer_AudioComponentTemplate.cpp ================== -static const unsigned char temp_binary_data_33[] = +static const unsigned char temp_binary_data_34[] = "%%include_corresponding_header%%\r\n" "\r\n" "//==============================================================================\r\n" @@ -6746,10 +6747,10 @@ static const unsigned char temp_binary_data_33[] = " // update their positions.\r\n" "}\r\n"; -const char* jucer_AudioComponentTemplate_cpp = (const char*) temp_binary_data_33; +const char* jucer_AudioComponentTemplate_cpp = (const char*) temp_binary_data_34; //================== jucer_AudioComponentTemplate.h ================== -static const unsigned char temp_binary_data_34[] = +static const unsigned char temp_binary_data_35[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -6783,10 +6784,265 @@ static const unsigned char temp_binary_data_34[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_AudioComponentTemplate_h = (const char*) temp_binary_data_34; +const char* jucer_AudioComponentTemplate_h = (const char*) temp_binary_data_35; + +//================== jucer_AudioPluginARADocumentControllerTemplate.cpp ================== +static const unsigned char temp_binary_data_36[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated!\r\n" +"\r\n" +" It contains the basic framework code for an ARA document controller implementation.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"%%aradocumentcontroller_headers%%\r\n" +"%%araplaybackrenderer_headers%%\r\n" +"\r\n" +"//==============================================================================\r\n" +"ARA::PlugIn::PlaybackRenderer* %%aradocumentcontroller_class_name%%::doCreatePlaybackRenderer() noexcept\r\n" +"{\r\n" +" return new %%araplaybackrenderer_class_name%% (getDocumentController());\r\n" +"}\r\n" +"\r\n" +"//==============================================================================\r\n" +"bool %%aradocumentcontroller_class_name%%::doRestoreObjectsFromStream (juce::ARAInputStream& input, const juce::ARARestoreObjectsFilter* filter) noexcept\r\n" +"{\r\n" +" // You should use this method to read any persistent data associated with\r\n" +" // your ARA model graph stored in an archive using the supplied ARAInputStream.\r\n" +" // Be sure to check the ARARestoreObjectsFilter to determine which objects to restore.\r\n" +" return true;\r\n" +"}\r\n" +"\r\n" +"bool %%aradocumentcontroller_class_name%%::doStoreObjectsToStream (juce::ARAOutputStream& output, const juce::ARAStoreObjectsFilter* filter) noexcept\r\n" +"{\r\n" +" // You should use this method to write any persistent data associated with\r\n" +" // your ARA model graph into the an archive using the supplied ARAOutputStream.\r\n" +" // Be sure to check the ARAStoreObjectsFilter to determine which objects to store.\r\n" +" return true;\r\n" +"}\r\n" +"\r\n" +"//==============================================================================\r\n" +"// This creates the static ARAFactory instances for the plugin.\r\n" +"const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory()\r\n" +"{\r\n" +" return juce::ARADocumentControllerSpecialisation::createARAFactory<%%aradocumentcontroller_class_name%%>();\r\n" +"}\r\n"; + +const char* jucer_AudioPluginARADocumentControllerTemplate_cpp = (const char*) temp_binary_data_36; + +//================== jucer_AudioPluginARADocumentControllerTemplate.h ================== +static const unsigned char temp_binary_data_37[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated!\r\n" +"\r\n" +" It contains the basic framework code for an ARA document controller implementation.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"#pragma once\r\n" +"\r\n" +"#include \r\n" +"\r\n" +"//==============================================================================\r\n" +"/**\r\n" +"*/\r\n" +"class %%aradocumentcontroller_class_name%% : public juce::ARADocumentControllerSpecialisation\r\n" +"{\r\n" +"public:\r\n" +" //==============================================================================\r\n" +" using ARADocumentControllerSpecialisation::ARADocumentControllerSpecialisation;\r\n" +"\r\n" +"protected:\r\n" +" //==============================================================================\r\n" +" // Override document controller customization methods here\r\n" +"\r\n" +" ARAPlaybackRenderer* doCreatePlaybackRenderer() noexcept override;\r\n" +"\r\n" +" bool doRestoreObjectsFromStream (juce::ARAInputStream& input, const juce::ARARestoreObjectsFilter* filter) noexcept override;\r\n" +" bool doStoreObjectsToStream (juce::ARAOutputStream& output, const juce::ARAStoreObjectsFilter* filter) noexcept override;\r\n" +"\r\n" +"private:\r\n" +" //==============================================================================\r\n" +" JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%aradocumentcontroller_class_name%%)\r\n" +"};\r\n"; + +const char* jucer_AudioPluginARADocumentControllerTemplate_h = (const char*) temp_binary_data_37; + +//================== jucer_AudioPluginARAPlaybackRendererTemplate.cpp ================== +static const unsigned char temp_binary_data_38[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated!\r\n" +"\r\n" +" It contains the basic framework code for an ARA playback renderer implementation.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"%%araplaybackrenderer_headers%%\r\n" +"\r\n" +"//==============================================================================\r\n" +"void %%araplaybackrenderer_class_name%%::prepareToPlay (double sampleRateIn, int maximumSamplesPerBlockIn, int numChannelsIn, juce::AudioProcessor::ProcessingPrecision, AlwaysNonRealtime alwaysNonRealtime)\r\n" +"{\r\n" +" numChannels = numChannelsIn;\r\n" +" sampleRate = sampleRateIn;\r\n" +" maximumSamplesPerBlock = maximumSamplesPerBlockIn;\r\n" +" useBufferedAudioSourceReader = alwaysNonRealtime == AlwaysNonRealtime::no;\r\n" +"}\r\n" +"\r\n" +"void %%araplaybackrenderer_class_name%%::releaseResources()\r\n" +"{\r\n" +"}\r\n" +"\r\n" +"//==============================================================================\r\n" +"bool %%araplaybackrenderer_class_name%%::processBlock (juce::AudioBuffer& buffer, juce::AudioProcessor::Realtime realtime, const juce::AudioPlayHead::CurrentPositionInfo& positionInfo) noexcept\r\n" +"{\r\n" +" const auto numSamples = buffer.getNumSamples();\r\n" +" jassert (numSamples <= maximumSamplesPerBlock);\r\n" +" jassert (numChannels == buffer.getNumChannels());\r\n" +" jassert (realtime == juce::AudioProcessor::Realtime::no || useBufferedAudioSourceReader);\r\n" +" const auto timeInSamples = positionInfo.timeInSamples;\r\n" +" const auto isPlaying = positionInfo.isPlaying;\r\n" +"\r\n" +" bool success = true;\r\n" +" bool didRenderAnyRegion = false;\r\n" +"\r\n" +" if (isPlaying)\r\n" +" {\r\n" +" const auto blockRange = juce::Range::withStartAndLength (timeInSamples, numSamples);\r\n" +"\r\n" +" for (const auto& playbackRegion : getPlaybackRegions())\r\n" +" {\r\n" +" // Evaluate region borders in song time, calculate sample range to render in song time.\r\n" +" // Note that this example does not use head- or tailtime, so the includeHeadAndTail\r\n" +" // parameter is set to false here - this might need to be adjusted in actual plug-ins.\r\n" +" const auto playbackSampleRange = playbackRegion->getSampleRange (sampleRate,\r\n" +" juce::ARAPlaybackRegion::IncludeHeadAndTail::no);\r\n" +" auto renderRange = blockRange.getIntersectionWith (playbackSampleRange);\r\n" +"\r\n" +" if (renderRange.isEmpty())\r\n" +" continue;\r\n" +"\r\n" +" // Evaluate region borders in modification/source time and calculate offset between\r\n" +" // song and source samples, then clip song samples accordingly\r\n" +" // (if an actual plug-in supports time stretching, this must be taken into account here).\r\n" +" juce::Range modificationSampleRange { playbackRegion->getStartInAudioModificationSamples(),\r\n" +" playbackRegion->getEndInAudioModificationSamples() };\r\n" +" const auto modificationSampleOffset = modificationSampleRange.getStart() - playbackSampleRange.getStart();\r\n" +"\r\n" +" renderRange = renderRange.getIntersectionWith (modificationSampleRange.movedToStartAt (playbackSampleRange.getStart()));\r\n" +"\r\n" +" if (renderRange.isEmpty())\r\n" +" continue;\r\n" +"\r\n" +" // Now calculate the samples in renderRange for this PlaybackRegion based on the ARA model\r\n" +" // graph. If didRenderAnyRegion is true, add the region's output samples in renderRange to\r\n" +" // the buffer. Otherwise the buffer needs to be initialised so the sample value must be\r\n" +" // overwritten.\r\n" +" const int numSamplesToRead = (int) renderRange.getLength();\r\n" +" const int startInBuffer = (int) (renderRange.getStart() - blockRange.getStart());\r\n" +" const auto startInSource = renderRange.getStart() + modificationSampleOffset;\r\n" +"\r\n" +" for (int c = 0; c < numChannels; ++c)\r\n" +" {\r\n" +" auto* channelData = buffer.getWritePointer (c);\r\n" +"\r\n" +" for (int i = 0; i < numSamplesToRead; ++i)\r\n" +" {\r\n" +" // Calculate region output sample at index startInSource + i ...\r\n" +" float sample = 0.0f;\r\n" +"\r\n" +" if (didRenderAnyRegion)\r\n" +" channelData[startInBuffer + i] += sample;\r\n" +" else\r\n" +" channelData[startInBuffer + i] = sample;\r\n" +" }\r\n" +" }\r\n" +"\r\n" +" // If rendering first region, clear any excess at start or end of the region.\r\n" +" if (! didRenderAnyRegion)\r\n" +" {\r\n" +" if (startInBuffer != 0)\r\n" +" buffer.clear (0, startInBuffer);\r\n" +"\r\n" +" const int endInBuffer = startInBuffer + numSamples;\r\n" +" const int remainingSamples = numSamples - endInBuffer;\r\n" +"\r\n" +" if (remainingSamples != 0)\r\n" +" buffer.clear (endInBuffer, remainingSamples);\r\n" +"\r\n" +" didRenderAnyRegion = true;\r\n" +" }\r\n" +" }\r\n" +" }\r\n" +"\r\n" +" if (! didRenderAnyRegion)\r\n" +" buffer.clear();\r\n" +"\r\n" +" return success;\r\n" +"}\r\n"; + +const char* jucer_AudioPluginARAPlaybackRendererTemplate_cpp = (const char*) temp_binary_data_38; + +//================== jucer_AudioPluginARAPlaybackRendererTemplate.h ================== +static const unsigned char temp_binary_data_39[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file was auto-generated!\r\n" +"\r\n" +" It contains the basic framework code for an ARA playback renderer implementation.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" +"#pragma once\r\n" +"\r\n" +"#include \r\n" +"\r\n" +"//==============================================================================\r\n" +"/**\r\n" +"*/\r\n" +"class %%araplaybackrenderer_class_name%% : public juce::ARAPlaybackRenderer\r\n" +"{\r\n" +"public:\r\n" +" //==============================================================================\r\n" +" using juce::ARAPlaybackRenderer::ARAPlaybackRenderer;\r\n" +"\r\n" +" //==============================================================================\r\n" +" void prepareToPlay (double sampleRate,\r\n" +" int maximumSamplesPerBlock,\r\n" +" int numChannels,\r\n" +" juce::AudioProcessor::ProcessingPrecision,\r\n" +" AlwaysNonRealtime alwaysNonRealtime) override;\r\n" +" void releaseResources() override;\r\n" +"\r\n" +" //==============================================================================\r\n" +" bool processBlock (juce::AudioBuffer & buffer,\r\n" +" juce::AudioProcessor::Realtime realtime,\r\n" +" const juce::AudioPlayHead::CurrentPositionInfo& positionInfo) noexcept override;\r\n" +"\r\n" +"private:\r\n" +" //==============================================================================\r\n" +" double sampleRate = 44100.0;\r\n" +" int maximumSamplesPerBlock = 4096;\r\n" +" int numChannels = 1;\r\n" +" bool useBufferedAudioSourceReader = true;\r\n" +"\r\n" +" JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%araplaybackrenderer_class_name%%)\r\n" +"};\r\n"; + +const char* jucer_AudioPluginARAPlaybackRendererTemplate_h = (const char*) temp_binary_data_39; //================== jucer_AudioPluginEditorTemplate.cpp ================== -static const unsigned char temp_binary_data_35[] = +static const unsigned char temp_binary_data_40[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -6827,10 +7083,10 @@ static const unsigned char temp_binary_data_35[] = " // subcomponents in your editor..\r\n" "}\r\n"; -const char* jucer_AudioPluginEditorTemplate_cpp = (const char*) temp_binary_data_35; +const char* jucer_AudioPluginEditorTemplate_cpp = (const char*) temp_binary_data_40; //================== jucer_AudioPluginEditorTemplate.h ================== -static const unsigned char temp_binary_data_36[] = +static const unsigned char temp_binary_data_41[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -6864,10 +7120,10 @@ static const unsigned char temp_binary_data_36[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%editor_class_name%%)\r\n" "};\r\n"; -const char* jucer_AudioPluginEditorTemplate_h = (const char*) temp_binary_data_36; +const char* jucer_AudioPluginEditorTemplate_h = (const char*) temp_binary_data_41; //================== jucer_AudioPluginFilterTemplate.cpp ================== -static const unsigned char temp_binary_data_37[] = +static const unsigned char temp_binary_data_42[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7059,10 +7315,10 @@ static const unsigned char temp_binary_data_37[] = " return new %%filter_class_name%%();\r\n" "}\r\n"; -const char* jucer_AudioPluginFilterTemplate_cpp = (const char*) temp_binary_data_37; +const char* jucer_AudioPluginFilterTemplate_cpp = (const char*) temp_binary_data_42; //================== jucer_AudioPluginFilterTemplate.h ================== -static const unsigned char temp_binary_data_38[] = +static const unsigned char temp_binary_data_43[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7079,6 +7335,9 @@ static const unsigned char temp_binary_data_38[] = "/**\r\n" "*/\r\n" "class %%filter_class_name%% : public juce::AudioProcessor\r\n" +" #if JucePlugin_Enable_ARA\r\n" +" , public juce::AudioProcessorARAExtension\r\n" +" #endif\r\n" "{\r\n" "public:\r\n" " //==============================================================================\r\n" @@ -7123,10 +7382,10 @@ static const unsigned char temp_binary_data_38[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%filter_class_name%%)\r\n" "};\r\n"; -const char* jucer_AudioPluginFilterTemplate_h = (const char*) temp_binary_data_38; +const char* jucer_AudioPluginFilterTemplate_h = (const char*) temp_binary_data_43; //================== jucer_ComponentTemplate.cpp ================== -static const unsigned char temp_binary_data_39[] = +static const unsigned char temp_binary_data_44[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7202,10 +7461,10 @@ static const unsigned char temp_binary_data_39[] = "//[EndFile] You can add extra defines here...\r\n" "//[/EndFile]\r\n"; -const char* jucer_ComponentTemplate_cpp = (const char*) temp_binary_data_39; +const char* jucer_ComponentTemplate_cpp = (const char*) temp_binary_data_44; //================== jucer_ComponentTemplate.h ================== -static const unsigned char temp_binary_data_40[] = +static const unsigned char temp_binary_data_45[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7268,10 +7527,10 @@ static const unsigned char temp_binary_data_40[] = "//[EndFile] You can add extra defines here...\r\n" "//[/EndFile]\r\n"; -const char* jucer_ComponentTemplate_h = (const char*) temp_binary_data_40; +const char* jucer_ComponentTemplate_h = (const char*) temp_binary_data_45; //================== jucer_ContentCompSimpleTemplate.h ================== -static const unsigned char temp_binary_data_41[] = +static const unsigned char temp_binary_data_46[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -7321,10 +7580,10 @@ static const unsigned char temp_binary_data_41[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_ContentCompSimpleTemplate_h = (const char*) temp_binary_data_41; +const char* jucer_ContentCompSimpleTemplate_h = (const char*) temp_binary_data_46; //================== jucer_ContentCompTemplate.cpp ================== -static const unsigned char temp_binary_data_42[] = +static const unsigned char temp_binary_data_47[] = "%%include_corresponding_header%%\r\n" "\r\n" "//==============================================================================\r\n" @@ -7355,10 +7614,10 @@ static const unsigned char temp_binary_data_42[] = " // update their positions.\r\n" "}\r\n"; -const char* jucer_ContentCompTemplate_cpp = (const char*) temp_binary_data_42; +const char* jucer_ContentCompTemplate_cpp = (const char*) temp_binary_data_47; //================== jucer_ContentCompTemplate.h ================== -static const unsigned char temp_binary_data_43[] = +static const unsigned char temp_binary_data_48[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -7387,10 +7646,10 @@ static const unsigned char temp_binary_data_43[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_ContentCompTemplate_h = (const char*) temp_binary_data_43; +const char* jucer_ContentCompTemplate_h = (const char*) temp_binary_data_48; //================== jucer_InlineComponentTemplate.h ================== -static const unsigned char temp_binary_data_44[] = +static const unsigned char temp_binary_data_49[] = "//==============================================================================\r\n" "class %%component_class%% : public juce::Component\r\n" "{\r\n" @@ -7432,10 +7691,10 @@ static const unsigned char temp_binary_data_44[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%component_class%%)\r\n" "};\r\n"; -const char* jucer_InlineComponentTemplate_h = (const char*) temp_binary_data_44; +const char* jucer_InlineComponentTemplate_h = (const char*) temp_binary_data_49; //================== jucer_MainConsoleAppTemplate.cpp ================== -static const unsigned char temp_binary_data_45[] = +static const unsigned char temp_binary_data_50[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7456,10 +7715,10 @@ static const unsigned char temp_binary_data_45[] = " return 0;\r\n" "}\r\n"; -const char* jucer_MainConsoleAppTemplate_cpp = (const char*) temp_binary_data_45; +const char* jucer_MainConsoleAppTemplate_cpp = (const char*) temp_binary_data_50; //================== jucer_MainTemplate_NoWindow.cpp ================== -static const unsigned char temp_binary_data_46[] = +static const unsigned char temp_binary_data_51[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7512,10 +7771,10 @@ static const unsigned char temp_binary_data_46[] = "// This macro generates the main() routine that launches the app.\r\n" "START_JUCE_APPLICATION (%%app_class_name%%)\r\n"; -const char* jucer_MainTemplate_NoWindow_cpp = (const char*) temp_binary_data_46; +const char* jucer_MainTemplate_NoWindow_cpp = (const char*) temp_binary_data_51; //================== jucer_MainTemplate_Window.cpp ================== -static const unsigned char temp_binary_data_47[] = +static const unsigned char temp_binary_data_52[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7621,10 +7880,10 @@ static const unsigned char temp_binary_data_47[] = "// This macro generates the main() routine that launches the app.\r\n" "START_JUCE_APPLICATION (%%app_class_name%%)\r\n"; -const char* jucer_MainTemplate_Window_cpp = (const char*) temp_binary_data_47; +const char* jucer_MainTemplate_Window_cpp = (const char*) temp_binary_data_52; //================== jucer_NewComponentTemplate.cpp ================== -static const unsigned char temp_binary_data_48[] = +static const unsigned char temp_binary_data_53[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7677,10 +7936,10 @@ static const unsigned char temp_binary_data_48[] = "\r\n" "}\r\n"; -const char* jucer_NewComponentTemplate_cpp = (const char*) temp_binary_data_48; +const char* jucer_NewComponentTemplate_cpp = (const char*) temp_binary_data_53; //================== jucer_NewComponentTemplate.h ================== -static const unsigned char temp_binary_data_49[] = +static const unsigned char temp_binary_data_54[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7711,10 +7970,10 @@ static const unsigned char temp_binary_data_49[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%component_class%%)\r\n" "};\r\n"; -const char* jucer_NewComponentTemplate_h = (const char*) temp_binary_data_49; +const char* jucer_NewComponentTemplate_h = (const char*) temp_binary_data_54; //================== jucer_NewCppFileTemplate.cpp ================== -static const unsigned char temp_binary_data_50[] = +static const unsigned char temp_binary_data_55[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7727,10 +7986,10 @@ static const unsigned char temp_binary_data_50[] = "\r\n" "%%include_corresponding_header%%\r\n"; -const char* jucer_NewCppFileTemplate_cpp = (const char*) temp_binary_data_50; +const char* jucer_NewCppFileTemplate_cpp = (const char*) temp_binary_data_55; //================== jucer_NewCppFileTemplate.h ================== -static const unsigned char temp_binary_data_51[] = +static const unsigned char temp_binary_data_56[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7743,10 +8002,10 @@ static const unsigned char temp_binary_data_51[] = "\r\n" "#pragma once\r\n"; -const char* jucer_NewCppFileTemplate_h = (const char*) temp_binary_data_51; +const char* jucer_NewCppFileTemplate_h = (const char*) temp_binary_data_56; //================== jucer_NewInlineComponentTemplate.h ================== -static const unsigned char temp_binary_data_52[] = +static const unsigned char temp_binary_data_57[] = "/*\r\n" " ==============================================================================\r\n" "\r\n" @@ -7809,10 +8068,10 @@ static const unsigned char temp_binary_data_52[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%component_class%%)\r\n" "};\r\n"; -const char* jucer_NewInlineComponentTemplate_h = (const char*) temp_binary_data_52; +const char* jucer_NewInlineComponentTemplate_h = (const char*) temp_binary_data_57; //================== jucer_OpenGLComponentSimpleTemplate.h ================== -static const unsigned char temp_binary_data_53[] = +static const unsigned char temp_binary_data_58[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -7881,10 +8140,10 @@ static const unsigned char temp_binary_data_53[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_OpenGLComponentSimpleTemplate_h = (const char*) temp_binary_data_53; +const char* jucer_OpenGLComponentSimpleTemplate_h = (const char*) temp_binary_data_58; //================== jucer_OpenGLComponentTemplate.cpp ================== -static const unsigned char temp_binary_data_54[] = +static const unsigned char temp_binary_data_59[] = "%%include_corresponding_header%%\r\n" "\r\n" "//==============================================================================\r\n" @@ -7934,10 +8193,10 @@ static const unsigned char temp_binary_data_54[] = " // update their positions.\r\n" "}\r\n"; -const char* jucer_OpenGLComponentTemplate_cpp = (const char*) temp_binary_data_54; +const char* jucer_OpenGLComponentTemplate_cpp = (const char*) temp_binary_data_59; //================== jucer_OpenGLComponentTemplate.h ================== -static const unsigned char temp_binary_data_55[] = +static const unsigned char temp_binary_data_60[] = "#pragma once\r\n" "\r\n" "%%include_juce%%\r\n" @@ -7971,10 +8230,10 @@ static const unsigned char temp_binary_data_55[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%content_component_class%%)\r\n" "};\r\n"; -const char* jucer_OpenGLComponentTemplate_h = (const char*) temp_binary_data_55; +const char* jucer_OpenGLComponentTemplate_h = (const char*) temp_binary_data_60; //================== jucer_PIPAudioProcessorTemplate.h ================== -static const unsigned char temp_binary_data_56[] = +static const unsigned char temp_binary_data_61[] = "class %%class_name%% : public juce::AudioProcessor\r\n" "{\r\n" "public:\r\n" @@ -8083,10 +8342,10 @@ static const unsigned char temp_binary_data_56[] = " JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%class_name%%)\r\n" "};\r\n"; -const char* jucer_PIPAudioProcessorTemplate_h = (const char*) temp_binary_data_56; +const char* jucer_PIPAudioProcessorTemplate_h = (const char*) temp_binary_data_61; //================== jucer_PIPTemplate.h ================== -static const unsigned char temp_binary_data_57[] = +static const unsigned char temp_binary_data_62[] = "/*******************************************************************************\r\n" " The block below describes the properties of this PIP. A PIP is a short snippet\r\n" " of code that can be read by the Projucer and used to generate a JUCE project.\r\n" @@ -8105,10 +8364,10 @@ static const unsigned char temp_binary_data_57[] = "//==============================================================================\r\n" "%%pip_code%%\r\n"; -const char* jucer_PIPTemplate_h = (const char*) temp_binary_data_57; +const char* jucer_PIPTemplate_h = (const char*) temp_binary_data_62; //================== colourscheme_dark.xml ================== -static const unsigned char temp_binary_data_58[] = +static const unsigned char temp_binary_data_63[] = "\r\n" "\r\n" "\r\n" @@ -8133,10 +8392,10 @@ static const unsigned char temp_binary_data_58[] = " \r\n" "\r\n"; -const char* colourscheme_dark_xml = (const char*) temp_binary_data_58; +const char* colourscheme_dark_xml = (const char*) temp_binary_data_63; //================== colourscheme_light.xml ================== -static const unsigned char temp_binary_data_59[] = +static const unsigned char temp_binary_data_64[] = "\r\n" "\r\n" "\r\n" @@ -8161,10 +8420,35 @@ static const unsigned char temp_binary_data_59[] = " \r\n" "\r\n"; -const char* colourscheme_light_xml = (const char*) temp_binary_data_59; +const char* colourscheme_light_xml = (const char*) temp_binary_data_64; //================== juce_runtime_arch_detection.cpp ================== -static const unsigned char temp_binary_data_60[] = +static const unsigned char temp_binary_data_65[] = +"/*\r\n" +" ==============================================================================\r\n" +"\r\n" +" This file is part of the JUCE library.\r\n" +" Copyright (c) 2022 - Raw Material Software Limited\r\n" +"\r\n" +" JUCE is an open source library subject to commercial or open-source\r\n" +" licensing.\r\n" +"\r\n" +" By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r\n" +" Agreement and JUCE Privacy Policy.\r\n" +"\r\n" +" End User License Agreement: www.juce.com/juce-7-licence\r\n" +" Privacy Policy: www.juce.com/juce-privacy-policy\r\n" +"\r\n" +" Or: You may also use this code under the terms of the GPL v3 (see\r\n" +" www.gnu.org/licenses).\r\n" +"\r\n" +" JUCE IS PROVIDED \"AS IS\" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r\n" +" EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r\n" +" DISCLAIMED.\r\n" +"\r\n" +" ==============================================================================\r\n" +"*/\r\n" +"\r\n" "#if defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(_M_ARM64) || defined(__aarch64__) || defined(__ARM64__)\r\n" "\r\n" " #if defined(_M_ARM64) || defined(__aarch64__) || defined(__ARM64__)\r\n" @@ -8225,7 +8509,7 @@ static const unsigned char temp_binary_data_60[] = "\r\n" "#endif\r\n"; -const char* juce_runtime_arch_detection_cpp = (const char*) temp_binary_data_60; +const char* juce_runtime_arch_detection_cpp = (const char*) temp_binary_data_65; const char* getNamedResource (const char* resourceNameUTF8, int& numBytes); @@ -8239,8 +8523,10 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes) switch (hash) { + case 0xd764ff7e: numBytes = 91; return JuceLV2Defines_h_in; case 0x31d21131: numBytes = 1042; return LaunchScreen_storyboard; case 0x24e5a04d: numBytes = 483; return PIPAudioProcessor_cpp_in; + case 0x956e0109: numBytes = 689; return PIPAudioProcessorWithARA_cpp_in; case 0xd572ce5a: numBytes = 2275; return PIPComponent_cpp_in; case 0x1a77c680: numBytes = 299; return PIPConsole_cpp_in; case 0xa41e649d: numBytes = 2842; return RecentFilesMenuTemplate_nib; @@ -8251,7 +8537,6 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes) case 0x34bc1021: numBytes = 11325; return LICENSE; case 0x406db5c1: numBytes = 3249; return background_logo_svg; case 0xbe17d889: numBytes = 3586; return export_android_svg; - case 0x84c51a59: numBytes = 2244; return export_clion_svg; case 0x83f049e3: numBytes = 1726; return export_codeBlocks_svg; case 0x96d2a1ce: numBytes = 28184; return export_linux_svg; case 0x2505bd06: numBytes = 1706; return export_visualStudio_svg; @@ -8274,10 +8559,14 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes) case 0xfb6f6d96: numBytes = 3554; return jucer_AudioComponentSimpleTemplate_h; case 0xafccbd3f: numBytes = 2941; return jucer_AudioComponentTemplate_cpp; case 0x915d7304: numBytes = 1187; return jucer_AudioComponentTemplate_h; + case 0x744d44d6: numBytes = 1920; return jucer_AudioPluginARADocumentControllerTemplate_cpp; + case 0x3eb8f45b: numBytes = 1439; return jucer_AudioPluginARADocumentControllerTemplate_h; + case 0xea35a37d: numBytes = 5192; return jucer_AudioPluginARAPlaybackRendererTemplate_cpp; + case 0x78a6d0c2: numBytes = 1765; return jucer_AudioPluginARAPlaybackRendererTemplate_h; case 0x27c5a93a: numBytes = 1355; return jucer_AudioPluginEditorTemplate_cpp; case 0x4d0721bf: numBytes = 973; return jucer_AudioPluginEditorTemplate_h; case 0x51b49ac5: numBytes = 6218; return jucer_AudioPluginFilterTemplate_cpp; - case 0x488afa0a: numBytes = 2299; return jucer_AudioPluginFilterTemplate_h; + case 0x488afa0a: numBytes = 2462; return jucer_AudioPluginFilterTemplate_h; case 0xabad7041: numBytes = 2147; return jucer_ComponentTemplate_cpp; case 0xfc72fe86: numBytes = 2065; return jucer_ComponentTemplate_h; case 0x1657b643: numBytes = 1524; return jucer_ContentCompSimpleTemplate_h; @@ -8299,7 +8588,7 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes) case 0x0b16e320: numBytes = 517; return jucer_PIPTemplate_h; case 0x763d39dc: numBytes = 1050; return colourscheme_dark_xml; case 0xe8b08520: numBytes = 1050; return colourscheme_light_xml; - case 0x7c03d519: numBytes = 2129; return juce_runtime_arch_detection_cpp; + case 0x7c03d519: numBytes = 3005; return juce_runtime_arch_detection_cpp; default: break; } @@ -8309,8 +8598,10 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes) const char* namedResourceList[] = { + "JuceLV2Defines_h_in", "LaunchScreen_storyboard", "PIPAudioProcessor_cpp_in", + "PIPAudioProcessorWithARA_cpp_in", "PIPComponent_cpp_in", "PIPConsole_cpp_in", "RecentFilesMenuTemplate_nib", @@ -8321,7 +8612,6 @@ const char* namedResourceList[] = "LICENSE", "background_logo_svg", "export_android_svg", - "export_clion_svg", "export_codeBlocks_svg", "export_linux_svg", "export_visualStudio_svg", @@ -8344,6 +8634,10 @@ const char* namedResourceList[] = "jucer_AudioComponentSimpleTemplate_h", "jucer_AudioComponentTemplate_cpp", "jucer_AudioComponentTemplate_h", + "jucer_AudioPluginARADocumentControllerTemplate_cpp", + "jucer_AudioPluginARADocumentControllerTemplate_h", + "jucer_AudioPluginARAPlaybackRendererTemplate_cpp", + "jucer_AudioPluginARAPlaybackRendererTemplate_h", "jucer_AudioPluginEditorTemplate_cpp", "jucer_AudioPluginEditorTemplate_h", "jucer_AudioPluginFilterTemplate_cpp", @@ -8374,8 +8668,10 @@ const char* namedResourceList[] = const char* originalFilenames[] = { + "JuceLV2Defines.h.in", "LaunchScreen.storyboard", "PIPAudioProcessor.cpp.in", + "PIPAudioProcessorWithARA.cpp.in", "PIPComponent.cpp.in", "PIPConsole.cpp.in", "RecentFilesMenuTemplate.nib", @@ -8386,7 +8682,6 @@ const char* originalFilenames[] = "LICENSE", "background_logo.svg", "export_android.svg", - "export_clion.svg", "export_codeBlocks.svg", "export_linux.svg", "export_visualStudio.svg", @@ -8409,6 +8704,10 @@ const char* originalFilenames[] = "jucer_AudioComponentSimpleTemplate.h", "jucer_AudioComponentTemplate.cpp", "jucer_AudioComponentTemplate.h", + "jucer_AudioPluginARADocumentControllerTemplate.cpp", + "jucer_AudioPluginARADocumentControllerTemplate.h", + "jucer_AudioPluginARAPlaybackRendererTemplate.cpp", + "jucer_AudioPluginARAPlaybackRendererTemplate.h", "jucer_AudioPluginEditorTemplate.cpp", "jucer_AudioPluginEditorTemplate.h", "jucer_AudioPluginFilterTemplate.cpp", @@ -8441,10 +8740,8 @@ const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8); const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8) { for (unsigned int i = 0; i < (sizeof (namedResourceList) / sizeof (namedResourceList[0])); ++i) - { - if (namedResourceList[i] == resourceNameUTF8) + if (strcmp (namedResourceList[i], resourceNameUTF8) == 0) return originalFilenames[i]; - } return nullptr; } diff --git a/extras/Projucer/JuceLibraryCode/BinaryData.h b/extras/Projucer/JuceLibraryCode/BinaryData.h index 1b59c7f9..1718d0ec 100644 --- a/extras/Projucer/JuceLibraryCode/BinaryData.h +++ b/extras/Projucer/JuceLibraryCode/BinaryData.h @@ -8,12 +8,18 @@ namespace BinaryData { + extern const char* JuceLV2Defines_h_in; + const int JuceLV2Defines_h_inSize = 91; + extern const char* LaunchScreen_storyboard; const int LaunchScreen_storyboardSize = 1042; extern const char* PIPAudioProcessor_cpp_in; const int PIPAudioProcessor_cpp_inSize = 483; + extern const char* PIPAudioProcessorWithARA_cpp_in; + const int PIPAudioProcessorWithARA_cpp_inSize = 689; + extern const char* PIPComponent_cpp_in; const int PIPComponent_cpp_inSize = 2275; @@ -44,9 +50,6 @@ namespace BinaryData extern const char* export_android_svg; const int export_android_svgSize = 3586; - extern const char* export_clion_svg; - const int export_clion_svgSize = 2244; - extern const char* export_codeBlocks_svg; const int export_codeBlocks_svgSize = 1726; @@ -113,6 +116,18 @@ namespace BinaryData extern const char* jucer_AudioComponentTemplate_h; const int jucer_AudioComponentTemplate_hSize = 1187; + extern const char* jucer_AudioPluginARADocumentControllerTemplate_cpp; + const int jucer_AudioPluginARADocumentControllerTemplate_cppSize = 1920; + + extern const char* jucer_AudioPluginARADocumentControllerTemplate_h; + const int jucer_AudioPluginARADocumentControllerTemplate_hSize = 1439; + + extern const char* jucer_AudioPluginARAPlaybackRendererTemplate_cpp; + const int jucer_AudioPluginARAPlaybackRendererTemplate_cppSize = 5192; + + extern const char* jucer_AudioPluginARAPlaybackRendererTemplate_h; + const int jucer_AudioPluginARAPlaybackRendererTemplate_hSize = 1765; + extern const char* jucer_AudioPluginEditorTemplate_cpp; const int jucer_AudioPluginEditorTemplate_cppSize = 1355; @@ -123,7 +138,7 @@ namespace BinaryData const int jucer_AudioPluginFilterTemplate_cppSize = 6218; extern const char* jucer_AudioPluginFilterTemplate_h; - const int jucer_AudioPluginFilterTemplate_hSize = 2299; + const int jucer_AudioPluginFilterTemplate_hSize = 2462; extern const char* jucer_ComponentTemplate_cpp; const int jucer_ComponentTemplate_cppSize = 2147; @@ -189,10 +204,10 @@ namespace BinaryData const int colourscheme_light_xmlSize = 1050; extern const char* juce_runtime_arch_detection_cpp; - const int juce_runtime_arch_detection_cppSize = 2129; + const int juce_runtime_arch_detection_cppSize = 3005; // Number of elements in the namedResourceList and originalFileNames arrays. - const int namedResourceListSize = 61; + const int namedResourceListSize = 66; // Points to the start of a list of resource names. extern const char* namedResourceList[]; diff --git a/extras/Projucer/JuceLibraryCode/JuceHeader.h b/extras/Projucer/JuceLibraryCode/JuceHeader.h index 80aa5999..ae119a05 100644 --- a/extras/Projucer/JuceLibraryCode/JuceHeader.h +++ b/extras/Projucer/JuceLibraryCode/JuceHeader.h @@ -44,7 +44,7 @@ namespace ProjectInfo { const char* const projectName = "Projucer"; const char* const companyName = "Raw Material Software Limited"; - const char* const versionString = "6.1.6"; - const int versionNumber = 0x60106; + const char* const versionString = "7.0.0"; + const int versionNumber = 0x70000; } #endif diff --git a/extras/Projucer/Projucer.jucer b/extras/Projucer/Projucer.jucer index 49dd7305..bc6e9430 100644 --- a/extras/Projucer/Projucer.jucer +++ b/extras/Projucer/Projucer.jucer @@ -1,7 +1,7 @@ @@ -27,25 +27,6 @@ - - - - - - - - - - - - - - - - @@ -187,10 +168,14 @@ file="Source/Application/jucer_MainWindow.h"/> + + - + + + + - ; @@ -94,6 +95,7 @@ namespace NewProjectTemplates if (opt == FileCreationOptions::header) return "header"; if (opt == FileCreationOptions::headerAndCpp) return "headercpp"; if (opt == FileCreationOptions::processorAndEditor) return "processoreditor"; + if (opt == FileCreationOptions::araPluginFiles) return "arapluginfiles"; jassertfalse; return {}; @@ -106,6 +108,7 @@ namespace NewProjectTemplates if (opt == "header") return FileCreationOptions::header; if (opt == "headercpp") return FileCreationOptions::headerAndCpp; if (opt == "processoreditor") return FileCreationOptions::processorAndEditor; + if (opt == "arapluginfiles") return FileCreationOptions::araPluginFiles; jassertfalse; return {}; @@ -118,6 +121,7 @@ namespace NewProjectTemplates if (opt == FileCreationOptions::header) return "Main.cpp + .h"; if (opt == FileCreationOptions::headerAndCpp) return "Main.cpp + .h/.cpp "; if (opt == FileCreationOptions::processorAndEditor) return "Processor and Editor"; + if (opt == FileCreationOptions::araPluginFiles) return "ARA Plugin Files"; jassertfalse; return {}; @@ -229,6 +233,24 @@ namespace NewProjectTemplates FileCreationOptions::processorAndEditor }, + { ProjectCategory::plugin, + "ARA", "Creates an ARA audio plug-in, augmenting the basic audio plug-in with ARA functionality.", + build_tools::ProjectType_ARAAudioPlugin::getTypeName(), + BinaryData::wizard_AudioPlugin_svg, + getModulesRequiredForAudioProcessor(), + { + { FileCreationOptions::araPluginFiles, { { "PluginProcessor.cpp", "jucer_AudioPluginFilterTemplate_cpp" }, + { "PluginProcessor.h", "jucer_AudioPluginFilterTemplate_h" }, + { "PluginEditor.cpp", "jucer_AudioPluginEditorTemplate_cpp" }, + { "PluginEditor.h", "jucer_AudioPluginEditorTemplate_h" }, + { "PluginARADocumentController.cpp", "jucer_AudioPluginARADocumentControllerTemplate_cpp" }, + { "PluginARADocumentController.h", "jucer_AudioPluginARADocumentControllerTemplate_h" }, + { "PluginARAPlaybackRenderer.cpp", "jucer_AudioPluginARAPlaybackRendererTemplate_cpp" }, + { "PluginARAPlaybackRenderer.h", "jucer_AudioPluginARAPlaybackRendererTemplate_h" }} } + }, + FileCreationOptions::araPluginFiles + }, + { ProjectCategory::library, "Static Library", "Creates a static library.", build_tools::ProjectType_StaticLibrary::getTypeName(), diff --git a/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.cpp b/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.cpp index 97fa67be..c7e655fe 100644 --- a/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.cpp +++ b/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -121,11 +121,28 @@ static std::map getPluginFileTokenReplacements (const String& na processorClassName = processorClassName.substring (0, 1).toUpperCase() + processorClassName.substring (1); auto editorClassName = processorClassName + "Editor"; + const auto araDocumentControllerCppFile = sourceFolder.getChildFile ("PluginARADocumentController.cpp"); + const auto araDocumentControllerHFile = araDocumentControllerCppFile.withFileExtension (".h"); + const auto araPlaybackRendererCppFile = sourceFolder.getChildFile ("PluginARAPlaybackRenderer.cpp"); + const auto araPlaybackRendererHFile = araPlaybackRendererCppFile.withFileExtension (".h"); + + const auto araDocumentControllerHInclude = CodeHelpers::createIncludeStatement (araDocumentControllerHFile, araDocumentControllerCppFile); + const auto araPlaybackRendererHInclude = CodeHelpers::createIncludeStatement (araPlaybackRendererHFile, araPlaybackRendererCppFile); + + auto araDocumentControllerClassName = build_tools::makeValidIdentifier (name, true, true, false) + "DocumentController"; + araDocumentControllerClassName = araDocumentControllerClassName.substring (0, 1).toUpperCase() + araDocumentControllerClassName.substring (1); + auto araPlaybackRendererClassName = build_tools::makeValidIdentifier (name, true, true, false) + "PlaybackRenderer"; + araPlaybackRendererClassName = araPlaybackRendererClassName.substring (0, 1).toUpperCase() + araPlaybackRendererClassName.substring (1); + tokenReplacements.insert ({"%%filter_headers%%", processorHInclude + newLine + editorHInclude }); tokenReplacements.insert ({"%%filter_class_name%%", processorClassName }); tokenReplacements.insert ({"%%editor_class_name%%", editorClassName }); tokenReplacements.insert ({"%%editor_cpp_headers%%", processorHInclude + newLine + editorHInclude }); tokenReplacements.insert ({"%%editor_headers%%", getJuceHeaderInclude() + newLine + processorHInclude }); + tokenReplacements.insert ({"%%aradocumentcontroller_headers%%", araDocumentControllerHInclude }); + tokenReplacements.insert ({"%%aradocumentcontroller_class_name%%", araDocumentControllerClassName }); + tokenReplacements.insert ({"%%araplaybackrenderer_headers%%", araPlaybackRendererHInclude }); + tokenReplacements.insert ({"%%araplaybackrenderer_class_name%%", araPlaybackRendererClassName }); return tokenReplacements; } diff --git a/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.h b/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.h index 8fe20df0..4ed698b7 100644 --- a/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.h +++ b/extras/Projucer/Source/Application/StartPage/jucer_NewProjectWizard.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.cpp b/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.cpp index 3c08474b..d26b5299 100644 --- a/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.cpp +++ b/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.h b/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.h index 44bfa19a..2f99e9a0 100644 --- a/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.h +++ b/extras/Projucer/Source/Application/StartPage/jucer_StartPageComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/StartPage/jucer_StartPageTreeHolder.h b/extras/Projucer/Source/Application/StartPage/jucer_StartPageTreeHolder.h index 68ea3424..bbbdf4f8 100644 --- a/extras/Projucer/Source/Application/StartPage/jucer_StartPageTreeHolder.h +++ b/extras/Projucer/Source/Application/StartPage/jucer_StartPageTreeHolder.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/UserAccount/jucer_LicenseController.h b/extras/Projucer/Source/Application/UserAccount/jucer_LicenseController.h index ec306e65..93c2c52f 100644 --- a/extras/Projucer/Source/Application/UserAccount/jucer_LicenseController.h +++ b/extras/Projucer/Source/Application/UserAccount/jucer_LicenseController.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/UserAccount/jucer_LicenseQueryThread.h b/extras/Projucer/Source/Application/UserAccount/jucer_LicenseQueryThread.h index 14c7ee9b..f60c26f3 100644 --- a/extras/Projucer/Source/Application/UserAccount/jucer_LicenseQueryThread.h +++ b/extras/Projucer/Source/Application/UserAccount/jucer_LicenseQueryThread.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/UserAccount/jucer_LicenseState.h b/extras/Projucer/Source/Application/UserAccount/jucer_LicenseState.h index 5d685038..df7d4d9e 100644 --- a/extras/Projucer/Source/Application/UserAccount/jucer_LicenseState.h +++ b/extras/Projucer/Source/Application/UserAccount/jucer_LicenseState.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/UserAccount/jucer_LoginFormComponent.h b/extras/Projucer/Source/Application/UserAccount/jucer_LoginFormComponent.h index 297680a6..e2e87e82 100644 --- a/extras/Projucer/Source/Application/UserAccount/jucer_LoginFormComponent.h +++ b/extras/Projucer/Source/Application/UserAccount/jucer_LoginFormComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/Windows/jucer_AboutWindowComponent.h b/extras/Projucer/Source/Application/Windows/jucer_AboutWindowComponent.h index c2fcdc50..274cfa28 100644 --- a/extras/Projucer/Source/Application/Windows/jucer_AboutWindowComponent.h +++ b/extras/Projucer/Source/Application/Windows/jucer_AboutWindowComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h b/extras/Projucer/Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h index 74f9d3b2..9482a3d3 100644 --- a/extras/Projucer/Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h +++ b/extras/Projucer/Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/Windows/jucer_FloatingToolWindow.h b/extras/Projucer/Source/Application/Windows/jucer_FloatingToolWindow.h index 75974ab3..af2f2ff1 100644 --- a/extras/Projucer/Source/Application/Windows/jucer_FloatingToolWindow.h +++ b/extras/Projucer/Source/Application/Windows/jucer_FloatingToolWindow.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h b/extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h index a9be3411..9552626e 100644 --- a/extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h +++ b/extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -225,13 +225,13 @@ private: "If you are building a legacy VST plug-in then this path should point to a VST2 SDK. " "The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK or JUCE version 5.3.2. " "You also need a VST2 license from Steinberg to distribute VST2 plug-ins."); + builder.add (new FilePathPropertyComponent (araPathValue, "ARA SDK", true, isThisOS), + "If you are building ARA enabled plug-ins, this should be the path to the ARA SDK folder."); if (getSelectedOS() != TargetOS::linux) { builder.add (new FilePathPropertyComponent (aaxPathValue, "AAX SDK", true, isThisOS), "If you are building AAX plug-ins, this should be the path to the AAX SDK folder."); - builder.add (new FilePathPropertyComponent (rtasPathValue, "RTAS SDK (deprecated)", true, isThisOS), - "If you are building RTAS plug-ins, this should be the path to the RTAS SDK folder."); } builder.add (new FilePathPropertyComponent (androidSDKPathValue, "Android SDK", true, isThisOS), @@ -249,8 +249,6 @@ private: String exeLabel ("startup script"); #endif - builder.add (new FilePathPropertyComponent (clionExePathValue, "CLion " + exeLabel, false, isThisOS), - "This path will be used for the \"Save Project and Open in IDE...\" option of the CLion exporter."); builder.add (new FilePathPropertyComponent (androidStudioExePathValue, "Android Studio " + exeLabel, false, isThisOS), "This path will be used for the \"Save Project and Open in IDE...\" option of the Android Studio exporter."); } @@ -271,10 +269,9 @@ private: juceModulePathValue = settings.getStoredPath (Ids::defaultJuceModulePath, os); userModulePathValue = settings.getStoredPath (Ids::defaultUserModulePath, os); vstPathValue = settings.getStoredPath (Ids::vstLegacyPath, os); - rtasPathValue = settings.getStoredPath (Ids::rtasPath, os); aaxPathValue = settings.getStoredPath (Ids::aaxPath, os); + araPathValue = settings.getStoredPath (Ids::araPath, os); androidSDKPathValue = settings.getStoredPath (Ids::androidSDKPath, os); - clionExePathValue = settings.getStoredPath (Ids::clionExePath, os); androidStudioExePathValue = settings.getStoredPath (Ids::androidStudioExePath, os); } @@ -284,10 +281,9 @@ private: juceModulePathValue .resetToDefault(); userModulePathValue .resetToDefault(); vstPathValue .resetToDefault(); - rtasPathValue .resetToDefault(); aaxPathValue .resetToDefault(); + araPathValue .resetToDefault(); androidSDKPathValue .resetToDefault(); - clionExePathValue .resetToDefault(); androidStudioExePathValue.resetToDefault(); repaint(); @@ -297,8 +293,8 @@ private: Value selectedOSValue; ValueTreePropertyWithDefault jucePathValue, juceModulePathValue, userModulePathValue, - vstPathValue, rtasPathValue, aaxPathValue, androidSDKPathValue, - clionExePathValue, androidStudioExePathValue; + vstPathValue, aaxPathValue, araPathValue, androidSDKPathValue, + androidStudioExePathValue; Viewport propertyViewport; PropertyGroupComponent propertyGroup { "Global Paths", { getIcons().openFolder, Colours::transparentBlack } }; diff --git a/extras/Projucer/Source/Application/Windows/jucer_PIPCreatorWindowComponent.h b/extras/Projucer/Source/Application/Windows/jucer_PIPCreatorWindowComponent.h index 8bd09eb4..85805cff 100644 --- a/extras/Projucer/Source/Application/Windows/jucer_PIPCreatorWindowComponent.h +++ b/extras/Projucer/Source/Application/Windows/jucer_PIPCreatorWindowComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/Windows/jucer_SVGPathDataWindowComponent.h b/extras/Projucer/Source/Application/Windows/jucer_SVGPathDataWindowComponent.h index 4dcdb579..1dff9885 100644 --- a/extras/Projucer/Source/Application/Windows/jucer_SVGPathDataWindowComponent.h +++ b/extras/Projucer/Source/Application/Windows/jucer_SVGPathDataWindowComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/Windows/jucer_TranslationToolWindowComponent.h b/extras/Projucer/Source/Application/Windows/jucer_TranslationToolWindowComponent.h index 271bb83c..86de5470 100644 --- a/extras/Projucer/Source/Application/Windows/jucer_TranslationToolWindowComponent.h +++ b/extras/Projucer/Source/Application/Windows/jucer_TranslationToolWindowComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/Windows/jucer_UTF8WindowComponent.h b/extras/Projucer/Source/Application/Windows/jucer_UTF8WindowComponent.h index c7fedeb7..b03a6abb 100644 --- a/extras/Projucer/Source/Application/Windows/jucer_UTF8WindowComponent.h +++ b/extras/Projucer/Source/Application/Windows/jucer_UTF8WindowComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/jucer_Application.cpp b/extras/Projucer/Source/Application/jucer_Application.cpp index a84df13b..1b1dfc1d 100644 --- a/extras/Projucer/Source/Application/jucer_Application.cpp +++ b/extras/Projucer/Source/Application/jucer_Application.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/jucer_Application.h b/extras/Projucer/Source/Application/jucer_Application.h index 15a3effc..8468c054 100644 --- a/extras/Projucer/Source/Application/jucer_Application.h +++ b/extras/Projucer/Source/Application/jucer_Application.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/jucer_AutoUpdater.cpp b/extras/Projucer/Source/Application/jucer_AutoUpdater.cpp index 6c087dd4..3b6fed5a 100644 --- a/extras/Projucer/Source/Application/jucer_AutoUpdater.cpp +++ b/extras/Projucer/Source/Application/jucer_AutoUpdater.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/jucer_AutoUpdater.h b/extras/Projucer/Source/Application/jucer_AutoUpdater.h index 54d4d9a6..cd9dc177 100644 --- a/extras/Projucer/Source/Application/jucer_AutoUpdater.h +++ b/extras/Projucer/Source/Application/jucer_AutoUpdater.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/jucer_CommandIDs.h b/extras/Projucer/Source/Application/jucer_CommandIDs.h index b4003ab5..7048da29 100644 --- a/extras/Projucer/Source/Application/jucer_CommandIDs.h +++ b/extras/Projucer/Source/Application/jucer_CommandIDs.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/jucer_CommandLine.cpp b/extras/Projucer/Source/Application/jucer_CommandLine.cpp index eff87122..39f09e54 100644 --- a/extras/Projucer/Source/Application/jucer_CommandLine.cpp +++ b/extras/Projucer/Source/Application/jucer_CommandLine.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -330,7 +330,7 @@ namespace var moduleInfo (new DynamicObject()); moduleInfo.getDynamicObject()->setProperty ("file", getModulePackageName (module)); - moduleInfo.getDynamicObject()->setProperty ("info", module.moduleInfo.getModuleInfo()); + moduleInfo.getDynamicObject()->setProperty ("info", module.moduleDescription.getModuleInfo()); infoList.append (moduleInfo); } } @@ -715,7 +715,7 @@ namespace static bool isValidPathIdentifier (const String& id, const String& os) { - return id == "vstLegacyPath" || (id == "aaxPath" && os != "linux") || (id == "rtasPath" && os != "linux") + return id == "vstLegacyPath" || (id == "aaxPath" && os != "linux") || id == "araPath" || id == "androidSDKPath" || id == "defaultJuceModulePath" || id == "defaultUserModulePath"; } @@ -877,7 +877,7 @@ namespace << std::endl << " " << appName << " --set-global-search-path os identifier_to_set new_path" << std::endl << " Sets the global path for a specified os and identifier. The os should be either osx, windows or linux and the identifiers can be any of the following: " - << "defaultJuceModulePath, defaultUserModulePath, vstLegacyPath, aaxPath (not valid on linux), rtasPath (not valid on linux), or androidSDKPath. " << std::endl + << "defaultJuceModulePath, defaultUserModulePath, vstLegacyPath, aaxPath (not valid on linux), or androidSDKPath. " << std::endl << std::endl << " " << appName << " --create-project-from-pip path/to/PIP path/to/output path/to/JUCE/modules (optional) path/to/user/modules (optional)" << std::endl << " Generates a folder containing a JUCE project in the specified output path using the specified PIP file. Use the optional JUCE and user module paths to override " diff --git a/extras/Projucer/Source/Application/jucer_CommandLine.h b/extras/Projucer/Source/Application/jucer_CommandLine.h index 467ef18a..8be57965 100644 --- a/extras/Projucer/Source/Application/jucer_CommandLine.h +++ b/extras/Projucer/Source/Application/jucer_CommandLine.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/jucer_CommonHeaders.h b/extras/Projucer/Source/Application/jucer_CommonHeaders.h index 7c0ab468..cfecff48 100644 --- a/extras/Projucer/Source/Application/jucer_CommonHeaders.h +++ b/extras/Projucer/Source/Application/jucer_CommonHeaders.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/jucer_Headers.h b/extras/Projucer/Source/Application/jucer_Headers.h index 8eb59ac1..87058869 100644 --- a/extras/Projucer/Source/Application/jucer_Headers.h +++ b/extras/Projucer/Source/Application/jucer_Headers.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/jucer_Main.cpp b/extras/Projucer/Source/Application/jucer_Main.cpp index ca1d4f53..6ac76068 100644 --- a/extras/Projucer/Source/Application/jucer_Main.cpp +++ b/extras/Projucer/Source/Application/jucer_Main.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/jucer_MainWindow.cpp b/extras/Projucer/Source/Application/jucer_MainWindow.cpp index b12e2419..f52fd4ff 100644 --- a/extras/Projucer/Source/Application/jucer_MainWindow.cpp +++ b/extras/Projucer/Source/Application/jucer_MainWindow.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Application/jucer_MainWindow.h b/extras/Projucer/Source/Application/jucer_MainWindow.h index 0bb11cce..a9234089 100644 --- a/extras/Projucer/Source/Application/jucer_MainWindow.h +++ b/extras/Projucer/Source/Application/jucer_MainWindow.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/BinaryData/Icons/export_clion.svg b/extras/Projucer/Source/BinaryData/Icons/export_clion.svg deleted file mode 100644 index e9edb044..00000000 --- a/extras/Projucer/Source/BinaryData/Icons/export_clion.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - icon_CLion - - - - - - - - - - - - - diff --git a/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.cpp b/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.cpp new file mode 100644 index 00000000..ebbe4952 --- /dev/null +++ b/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.cpp @@ -0,0 +1,42 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic framework code for an ARA document controller implementation. + + ============================================================================== +*/ + +%%aradocumentcontroller_headers%% +%%araplaybackrenderer_headers%% + +//============================================================================== +ARA::PlugIn::PlaybackRenderer* %%aradocumentcontroller_class_name%%::doCreatePlaybackRenderer() noexcept +{ + return new %%araplaybackrenderer_class_name%% (getDocumentController()); +} + +//============================================================================== +bool %%aradocumentcontroller_class_name%%::doRestoreObjectsFromStream (juce::ARAInputStream& input, const juce::ARARestoreObjectsFilter* filter) noexcept +{ + // You should use this method to read any persistent data associated with + // your ARA model graph stored in an archive using the supplied ARAInputStream. + // Be sure to check the ARARestoreObjectsFilter to determine which objects to restore. + return true; +} + +bool %%aradocumentcontroller_class_name%%::doStoreObjectsToStream (juce::ARAOutputStream& output, const juce::ARAStoreObjectsFilter* filter) noexcept +{ + // You should use this method to write any persistent data associated with + // your ARA model graph into the an archive using the supplied ARAOutputStream. + // Be sure to check the ARAStoreObjectsFilter to determine which objects to store. + return true; +} + +//============================================================================== +// This creates the static ARAFactory instances for the plugin. +const ARA::ARAFactory* JUCE_CALLTYPE createARAFactory() +{ + return juce::ARADocumentControllerSpecialisation::createARAFactory<%%aradocumentcontroller_class_name%%>(); +} diff --git a/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.h b/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.h new file mode 100644 index 00000000..8dbcb340 --- /dev/null +++ b/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARADocumentControllerTemplate.h @@ -0,0 +1,36 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic framework code for an ARA document controller implementation. + + ============================================================================== +*/ + +#pragma once + +#include + +//============================================================================== +/** +*/ +class %%aradocumentcontroller_class_name%% : public juce::ARADocumentControllerSpecialisation +{ +public: + //============================================================================== + using ARADocumentControllerSpecialisation::ARADocumentControllerSpecialisation; + +protected: + //============================================================================== + // Override document controller customization methods here + + ARAPlaybackRenderer* doCreatePlaybackRenderer() noexcept override; + + bool doRestoreObjectsFromStream (juce::ARAInputStream& input, const juce::ARARestoreObjectsFilter* filter) noexcept override; + bool doStoreObjectsToStream (juce::ARAOutputStream& output, const juce::ARAStoreObjectsFilter* filter) noexcept override; + +private: + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%aradocumentcontroller_class_name%%) +}; diff --git a/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.cpp b/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.cpp new file mode 100644 index 00000000..f7e547ba --- /dev/null +++ b/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.cpp @@ -0,0 +1,112 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic framework code for an ARA playback renderer implementation. + + ============================================================================== +*/ + +%%araplaybackrenderer_headers%% + +//============================================================================== +void %%araplaybackrenderer_class_name%%::prepareToPlay (double sampleRateIn, int maximumSamplesPerBlockIn, int numChannelsIn, juce::AudioProcessor::ProcessingPrecision, AlwaysNonRealtime alwaysNonRealtime) +{ + numChannels = numChannelsIn; + sampleRate = sampleRateIn; + maximumSamplesPerBlock = maximumSamplesPerBlockIn; + useBufferedAudioSourceReader = alwaysNonRealtime == AlwaysNonRealtime::no; +} + +void %%araplaybackrenderer_class_name%%::releaseResources() +{ +} + +//============================================================================== +bool %%araplaybackrenderer_class_name%%::processBlock (juce::AudioBuffer& buffer, juce::AudioProcessor::Realtime realtime, const juce::AudioPlayHead::CurrentPositionInfo& positionInfo) noexcept +{ + const auto numSamples = buffer.getNumSamples(); + jassert (numSamples <= maximumSamplesPerBlock); + jassert (numChannels == buffer.getNumChannels()); + jassert (realtime == juce::AudioProcessor::Realtime::no || useBufferedAudioSourceReader); + const auto timeInSamples = positionInfo.timeInSamples; + const auto isPlaying = positionInfo.isPlaying; + + bool success = true; + bool didRenderAnyRegion = false; + + if (isPlaying) + { + const auto blockRange = juce::Range::withStartAndLength (timeInSamples, numSamples); + + for (const auto& playbackRegion : getPlaybackRegions()) + { + // Evaluate region borders in song time, calculate sample range to render in song time. + // Note that this example does not use head- or tailtime, so the includeHeadAndTail + // parameter is set to false here - this might need to be adjusted in actual plug-ins. + const auto playbackSampleRange = playbackRegion->getSampleRange (sampleRate, + juce::ARAPlaybackRegion::IncludeHeadAndTail::no); + auto renderRange = blockRange.getIntersectionWith (playbackSampleRange); + + if (renderRange.isEmpty()) + continue; + + // Evaluate region borders in modification/source time and calculate offset between + // song and source samples, then clip song samples accordingly + // (if an actual plug-in supports time stretching, this must be taken into account here). + juce::Range modificationSampleRange { playbackRegion->getStartInAudioModificationSamples(), + playbackRegion->getEndInAudioModificationSamples() }; + const auto modificationSampleOffset = modificationSampleRange.getStart() - playbackSampleRange.getStart(); + + renderRange = renderRange.getIntersectionWith (modificationSampleRange.movedToStartAt (playbackSampleRange.getStart())); + + if (renderRange.isEmpty()) + continue; + + // Now calculate the samples in renderRange for this PlaybackRegion based on the ARA model + // graph. If didRenderAnyRegion is true, add the region's output samples in renderRange to + // the buffer. Otherwise the buffer needs to be initialised so the sample value must be + // overwritten. + const int numSamplesToRead = (int) renderRange.getLength(); + const int startInBuffer = (int) (renderRange.getStart() - blockRange.getStart()); + const auto startInSource = renderRange.getStart() + modificationSampleOffset; + + for (int c = 0; c < numChannels; ++c) + { + auto* channelData = buffer.getWritePointer (c); + + for (int i = 0; i < numSamplesToRead; ++i) + { + // Calculate region output sample at index startInSource + i ... + float sample = 0.0f; + + if (didRenderAnyRegion) + channelData[startInBuffer + i] += sample; + else + channelData[startInBuffer + i] = sample; + } + } + + // If rendering first region, clear any excess at start or end of the region. + if (! didRenderAnyRegion) + { + if (startInBuffer != 0) + buffer.clear (0, startInBuffer); + + const int endInBuffer = startInBuffer + numSamples; + const int remainingSamples = numSamples - endInBuffer; + + if (remainingSamples != 0) + buffer.clear (endInBuffer, remainingSamples); + + didRenderAnyRegion = true; + } + } + } + + if (! didRenderAnyRegion) + buffer.clear(); + + return success; +} diff --git a/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.h b/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.h new file mode 100644 index 00000000..60b3bd47 --- /dev/null +++ b/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginARAPlaybackRendererTemplate.h @@ -0,0 +1,45 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic framework code for an ARA playback renderer implementation. + + ============================================================================== +*/ + +#pragma once + +#include + +//============================================================================== +/** +*/ +class %%araplaybackrenderer_class_name%% : public juce::ARAPlaybackRenderer +{ +public: + //============================================================================== + using juce::ARAPlaybackRenderer::ARAPlaybackRenderer; + + //============================================================================== + void prepareToPlay (double sampleRate, + int maximumSamplesPerBlock, + int numChannels, + juce::AudioProcessor::ProcessingPrecision, + AlwaysNonRealtime alwaysNonRealtime) override; + void releaseResources() override; + + //============================================================================== + bool processBlock (juce::AudioBuffer & buffer, + juce::AudioProcessor::Realtime realtime, + const juce::AudioPlayHead::CurrentPositionInfo& positionInfo) noexcept override; + +private: + //============================================================================== + double sampleRate = 44100.0; + int maximumSamplesPerBlock = 4096; + int numChannels = 1; + bool useBufferedAudioSourceReader = true; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (%%araplaybackrenderer_class_name%%) +}; diff --git a/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h b/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h index bfc4dc95..ae40b224 100644 --- a/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h +++ b/extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h @@ -14,6 +14,9 @@ /** */ class %%filter_class_name%% : public juce::AudioProcessor + #if JucePlugin_Enable_ARA + , public juce::AudioProcessorARAExtension + #endif { public: //============================================================================== diff --git a/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.cpp b/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.cpp index 2c951a29..b09add26 100644 --- a/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.cpp +++ b/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.h b/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.h index e392c1b6..c105730a 100644 --- a/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.h +++ b/extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/CodeEditor/jucer_ItemPreviewComponent.h b/extras/Projucer/Source/CodeEditor/jucer_ItemPreviewComponent.h index a2f9f35a..a229c129 100644 --- a/extras/Projucer/Source/CodeEditor/jucer_ItemPreviewComponent.h +++ b/extras/Projucer/Source/CodeEditor/jucer_ItemPreviewComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.cpp b/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.cpp index d30ff4bc..8ed2cded 100644 --- a/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.cpp +++ b/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.h b/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.h index bfef885c..862e65bd 100644 --- a/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.h +++ b/extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.cpp b/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.cpp index 1b845d38..b1528921 100644 --- a/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.cpp +++ b/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.h b/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.h index e6f5e0fc..d0454ac3 100644 --- a/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.h +++ b/extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_ButtonHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_ButtonHandler.h index 67e0a262..d1643bff 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_ButtonHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_ButtonHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_ComboBoxHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_ComboBoxHandler.h index 2a573c97..43a623d8 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_ComboBoxHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_ComboBoxHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentNameProperty.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentNameProperty.h index 8f4ea3c5..b5f3d112 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentNameProperty.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentNameProperty.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp b/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp index c210099e..44378634 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.h index 2b2a2bcb..b4f0f155 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentUndoableAction.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentUndoableAction.h index 00229f2e..cc10a166 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentUndoableAction.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentUndoableAction.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_GenericComponentHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_GenericComponentHandler.h index 0fc716d7..1b89a402 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_GenericComponentHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_GenericComponentHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_GroupComponentHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_GroupComponentHandler.h index 3cb279a9..c1d9642d 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_GroupComponentHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_GroupComponentHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_HyperlinkButtonHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_HyperlinkButtonHandler.h index f33f9ba2..bd028f7d 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_HyperlinkButtonHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_HyperlinkButtonHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -83,7 +83,7 @@ public: HyperlinkButton* const hb = dynamic_cast (comp); return quotedString (hb->getButtonText(), code.shouldUseTransMacro()) - + ",\nURL (" + + ",\njuce::URL (" + quotedString (hb->getURL().toString (false), false) + ")"; } diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_ImageButtonHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_ImageButtonHandler.h index 4412d0dc..c19059b0 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_ImageButtonHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_ImageButtonHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_JucerComponentHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_JucerComponentHandler.h index f4893211..32086141 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_JucerComponentHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_JucerComponentHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_LabelHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_LabelHandler.h index 5c77a647..5dcc70c3 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_LabelHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_LabelHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_SliderHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_SliderHandler.h index dd087fac..5e04d934 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_SliderHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_SliderHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h index 0a777f38..e9ba793f 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_TextButtonHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_TextButtonHandler.h index ec4bf5fd..dffad5c6 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_TextButtonHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_TextButtonHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_TextEditorHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_TextEditorHandler.h index af96ae62..e98f7e2f 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_TextEditorHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_TextEditorHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h index aaa88c72..3632dc69 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_TreeViewHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_TreeViewHandler.h index 84c38457..139708d4 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_TreeViewHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_TreeViewHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Components/jucer_ViewportHandler.h b/extras/Projucer/Source/ComponentEditor/Components/jucer_ViewportHandler.h index 570f742b..ddd1657b 100644 --- a/extras/Projucer/Source/ComponentEditor/Components/jucer_ViewportHandler.h +++ b/extras/Projucer/Source/ComponentEditor/Components/jucer_ViewportHandler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp b/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp index c74d8f6f..8b34cfdb 100644 --- a/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp +++ b/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.h b/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.h index 2fa41bb9..f1125bcd 100644 --- a/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.h +++ b/extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp b/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp index 62a412ea..623689f3 100644 --- a/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp +++ b/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.h b/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.h index 775b3e34..afaf78fd 100644 --- a/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.h +++ b/extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp index 72decd39..97e4ec98 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.h index 8a3a2dd1..eb86dcb7 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ElementSiblingComponent.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ElementSiblingComponent.h index 8c191573..8f2b7471 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ElementSiblingComponent.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ElementSiblingComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_FillType.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_FillType.h index 77e60798..105f3f27 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_FillType.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_FillType.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h index 47e54159..78ef64e6 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h index 0e731bba..3ef8cfc4 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp index 1bc900cd..561fab59 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.h index cf7b8029..430e13c5 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementEllipse.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementEllipse.h index 6e0ba228..30ca2532 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementEllipse.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementEllipse.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp index e9efb40f..6d11c76a 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.h index 39b5d789..f6e1a34e 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp index 8185b3ee..9aaa0d0b 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.h index 5f6c3ca5..3b36ebb1 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp index 4b47ff28..e12f5fad 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.h index b06fdf4d..fc1eb504 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRectangle.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRectangle.h index aee6f147..204c0d01 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRectangle.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRectangle.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRoundedRectangle.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRoundedRectangle.h index 0fc6f4a0..aa21079e 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRoundedRectangle.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRoundedRectangle.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementText.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementText.h index 95166072..7d693d39 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementText.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementText.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h index 8c672b4f..c5cfa410 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PointComponent.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PointComponent.h index f3c80d54..76ba87e5 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PointComponent.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PointComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_StrokeType.h b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_StrokeType.h index b65ad3a4..04a215dc 100644 --- a/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_StrokeType.h +++ b/extras/Projucer/Source/ComponentEditor/PaintElements/jucer_StrokeType.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Properties/jucer_ColourPropertyComponent.h b/extras/Projucer/Source/ComponentEditor/Properties/jucer_ColourPropertyComponent.h index 2ba8f534..1b334024 100644 --- a/extras/Projucer/Source/ComponentEditor/Properties/jucer_ColourPropertyComponent.h +++ b/extras/Projucer/Source/ComponentEditor/Properties/jucer_ColourPropertyComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h b/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h index d8c0ba7d..8e80dc53 100644 --- a/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h +++ b/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentChoiceProperty.h b/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentChoiceProperty.h index 88cdbed0..73a914a4 100644 --- a/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentChoiceProperty.h +++ b/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentChoiceProperty.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentColourProperty.h b/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentColourProperty.h index c90fbaaf..b1665dca 100644 --- a/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentColourProperty.h +++ b/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentColourProperty.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h b/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h index 3a0054e2..2c3db50a 100644 --- a/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h +++ b/extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h b/extras/Projucer/Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h index 0ab20d62..0166f2d9 100644 --- a/extras/Projucer/Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h +++ b/extras/Projucer/Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h b/extras/Projucer/Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h index f967698d..0cb8f7f5 100644 --- a/extras/Projucer/Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h +++ b/extras/Projucer/Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Properties/jucer_JustificationProperty.h b/extras/Projucer/Source/ComponentEditor/Properties/jucer_JustificationProperty.h index 7ae577a6..4fddb34f 100644 --- a/extras/Projucer/Source/ComponentEditor/Properties/jucer_JustificationProperty.h +++ b/extras/Projucer/Source/ComponentEditor/Properties/jucer_JustificationProperty.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h b/extras/Projucer/Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h index 66055d33..34fc9e7d 100644 --- a/extras/Projucer/Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h +++ b/extras/Projucer/Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp b/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp index 92a5cbb3..c4ec373b 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h b/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h index 63e86a62..fc4b2d61 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h b/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h index 34576ba2..c4971823 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp b/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp index 94749122..4addcc2c 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.h b/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.h index 038f1959..6c8308d8 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.h +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp b/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp index 03486f56..35adf7ff 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.h b/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.h index 01c47343..a5dd8ccd 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.h +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerCommandIDs.h b/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerCommandIDs.h index 79e5cd49..96d9004a 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerCommandIDs.h +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerCommandIDs.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp b/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp index 7faa74bc..7dcd38e3 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.h b/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.h index d0efe69c..15051d49 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.h +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp b/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp index 6087349f..586e9eab 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h b/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h index d437e187..86f68a42 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp b/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp index 8488c927..fb5c1e84 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.h b/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.h index 9d2abd7b..fe7cb348 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.h +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h b/extras/Projucer/Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h index 176d9467..314dd7de 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp b/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp index 20d96d15..03d73fa4 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.h b/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.h index 600ca661..e54678a8 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.h +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_SnapGridPainter.h b/extras/Projucer/Source/ComponentEditor/UI/jucer_SnapGridPainter.h index 01209560..99544996 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_SnapGridPainter.h +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_SnapGridPainter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.cpp b/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.cpp index 30517543..e2dba0a7 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.cpp +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.h b/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.h index a23f36ec..0fa115b8 100644 --- a/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.h +++ b/extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.cpp b/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.cpp index 9f81596d..f9e393e4 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.cpp +++ b/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.h b/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.h index 733b1c8c..34e5ca26 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.h +++ b/extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp b/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp index b5602297..46af864f 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp +++ b/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.h b/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.h index 224acfe4..cb2eb306 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.h +++ b/extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.cpp b/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.cpp index 5c4d23b6..756f9ca2 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.cpp +++ b/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.h b/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.h index d4485fe6..e0631342 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.h +++ b/extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp b/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp index a216c066..111c0f09 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp +++ b/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.h b/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.h index b882cdfc..bcc399fc 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.h +++ b/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.cpp b/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.cpp index 09527a83..b5609eda 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.cpp +++ b/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.h b/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.h index cdf9f96c..6efe3e07 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.h +++ b/extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.cpp b/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.cpp index 20dbb5da..bc575e1b 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.cpp +++ b/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.h b/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.h index a04d08bd..b8c6cc4c 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.h +++ b/extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ComponentEditor/jucer_UtilityFunctions.h b/extras/Projucer/Source/ComponentEditor/jucer_UtilityFunctions.h index 691baa73..3fe37520 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_UtilityFunctions.h +++ b/extras/Projucer/Source/ComponentEditor/jucer_UtilityFunctions.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Licenses/jucer_LicenseController.cpp b/extras/Projucer/Source/Licenses/jucer_LicenseController.cpp index 7a79dad7..b8415bc2 100644 --- a/extras/Projucer/Source/Licenses/jucer_LicenseController.cpp +++ b/extras/Projucer/Source/Licenses/jucer_LicenseController.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ActivityListComponent.h b/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ActivityListComponent.h index 839e8c95..9acef3b2 100644 --- a/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ActivityListComponent.h +++ b/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ActivityListComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/LiveBuildEngine/UI/jucer_BuildTabStatusComponent.h b/extras/Projucer/Source/LiveBuildEngine/UI/jucer_BuildTabStatusComponent.h index 7528954e..7be5df69 100644 --- a/extras/Projucer/Source/LiveBuildEngine/UI/jucer_BuildTabStatusComponent.h +++ b/extras/Projucer/Source/LiveBuildEngine/UI/jucer_BuildTabStatusComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ComponentListComponent.h b/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ComponentListComponent.h index e3628803..796b4771 100644 --- a/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ComponentListComponent.h +++ b/extras/Projucer/Source/LiveBuildEngine/UI/jucer_ComponentListComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/Modules/jucer_AvailableModulesList.h b/extras/Projucer/Source/Project/Modules/jucer_AvailableModulesList.h index 6a43bade..186e0dd6 100644 --- a/extras/Projucer/Source/Project/Modules/jucer_AvailableModulesList.h +++ b/extras/Projucer/Source/Project/Modules/jucer_AvailableModulesList.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/Modules/jucer_ModuleDescription.h b/extras/Projucer/Source/Project/Modules/jucer_ModuleDescription.h index 6cb1e70e..a02d0b8b 100644 --- a/extras/Projucer/Source/Project/Modules/jucer_ModuleDescription.h +++ b/extras/Projucer/Source/Project/Modules/jucer_ModuleDescription.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/Modules/jucer_Modules.cpp b/extras/Projucer/Source/Project/Modules/jucer_Modules.cpp index fca72e17..b5ba7914 100644 --- a/extras/Projucer/Source/Project/Modules/jucer_Modules.cpp +++ b/extras/Projucer/Source/Project/Modules/jucer_Modules.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -30,7 +30,7 @@ //============================================================================== LibraryModule::LibraryModule (const ModuleDescription& d) - : moduleInfo (d) + : moduleDescription (d) { } @@ -43,15 +43,15 @@ void LibraryModule::writeIncludes (ProjectSaver& projectSaver, OutputStream& out if (modules.shouldCopyModuleFilesLocally (moduleID)) { - auto juceModuleFolder = moduleInfo.getFolder(); + auto juceModuleFolder = moduleDescription.getFolder(); auto localModuleFolder = project.getLocalModuleFolder (moduleID); localModuleFolder.createDirectory(); projectSaver.copyFolder (juceModuleFolder, localModuleFolder); } - out << "#include <" << moduleInfo.getModuleFolder().getFileName() << "/" - << moduleInfo.getHeader().getFileName() + out << "#include <" << moduleDescription.getModuleFolder().getFileName() << "/" + << moduleDescription.getHeader().getFileName() << ">" << newLine; } @@ -78,7 +78,7 @@ void LibraryModule::addSearchPathsToExporter (ProjectExporter& exporter) const if (moduleLibDir.exists()) exporter.addToModuleLibPaths ({ libSubdirPath, moduleRelativePath.getRoot() }); - auto extraInternalSearchPaths = moduleInfo.getExtraSearchPaths().trim(); + auto extraInternalSearchPaths = moduleDescription.getExtraSearchPaths().trim(); if (extraInternalSearchPaths.isNotEmpty()) { @@ -91,7 +91,7 @@ void LibraryModule::addSearchPathsToExporter (ProjectExporter& exporter) const void LibraryModule::addDefinesToExporter (ProjectExporter& exporter) const { - auto extraDefs = moduleInfo.getPreprocessorDefs().trim(); + auto extraDefs = moduleDescription.getPreprocessorDefs().trim(); if (extraDefs.isNotEmpty()) exporter.getExporterPreprocessorDefsValue() = exporter.getExporterPreprocessorDefsString() + "\n" + extraDefs; @@ -105,7 +105,7 @@ void LibraryModule::addCompileUnitsToExporter (ProjectExporter& exporter, Projec auto moduleID = getID(); auto localModuleFolder = modules.shouldCopyModuleFilesLocally (moduleID) ? project.getLocalModuleFolder (moduleID) - : moduleInfo.getFolder(); + : moduleDescription.getFolder(); Array compiled; findAndAddCompiledUnits (exporter, &projectSaver, compiled); @@ -125,6 +125,8 @@ void LibraryModule::addLibsToExporter (ProjectExporter& exporter) const auto& project = exporter.getProject(); + auto moduleInfo = moduleDescription.getModuleInfo(); + if (exporter.isXcode()) { auto& xcodeExporter = dynamic_cast (exporter); @@ -137,26 +139,29 @@ void LibraryModule::addLibsToExporter (ProjectExporter& exporter) const xcodeExporter.xcodeFrameworks.add ("AudioUnit"); } - auto frameworks = moduleInfo.getModuleInfo() [xcodeExporter.isOSX() ? "OSXFrameworks" : "iOSFrameworks"].toString(); + auto frameworks = moduleInfo[xcodeExporter.isOSX() ? "OSXFrameworks" : "iOSFrameworks"].toString(); xcodeExporter.xcodeFrameworks.addTokens (frameworks, ", ", {}); - parseAndAddLibsToList (xcodeExporter.xcodeLibs, moduleInfo.getModuleInfo() [exporter.isOSX() ? "OSXLibs" : "iOSLibs"].toString()); + auto weakFrameworks = moduleInfo[xcodeExporter.isOSX() ? "WeakOSXFrameworks" : "WeakiOSFrameworks"].toString(); + xcodeExporter.xcodeWeakFrameworks.addTokens (weakFrameworks, ", ", {}); + + parseAndAddLibsToList (xcodeExporter.xcodeLibs, moduleInfo[exporter.isOSX() ? "OSXLibs" : "iOSLibs"].toString()); } else if (exporter.isLinux()) { - parseAndAddLibsToList (exporter.linuxLibs, moduleInfo.getModuleInfo() ["linuxLibs"].toString()); - parseAndAddLibsToList (exporter.linuxPackages, moduleInfo.getModuleInfo() ["linuxPackages"].toString()); + parseAndAddLibsToList (exporter.linuxLibs, moduleInfo["linuxLibs"].toString()); + parseAndAddLibsToList (exporter.linuxPackages, moduleInfo["linuxPackages"].toString()); } else if (exporter.isWindows()) { if (exporter.isCodeBlocks()) - parseAndAddLibsToList (exporter.mingwLibs, moduleInfo.getModuleInfo() ["mingwLibs"].toString()); + parseAndAddLibsToList (exporter.mingwLibs, moduleInfo["mingwLibs"].toString()); else - parseAndAddLibsToList (exporter.windowsLibs, moduleInfo.getModuleInfo() ["windowsLibs"].toString()); + parseAndAddLibsToList (exporter.windowsLibs, moduleInfo["windowsLibs"].toString()); } else if (exporter.isAndroid()) { - parseAndAddLibsToList (exporter.androidLibs, moduleInfo.getModuleInfo() ["androidLibs"].toString()); + parseAndAddLibsToList (exporter.androidLibs, moduleInfo["androidLibs"].toString()); } } @@ -170,7 +175,7 @@ void LibraryModule::addSettingsForModuleToExporter (ProjectExporter& exporter, P void LibraryModule::getConfigFlags (Project& project, OwnedArray& flags) const { - auto header = moduleInfo.getHeader(); + auto header = moduleDescription.getHeader(); jassert (header.exists()); StringArray lines; @@ -355,7 +360,7 @@ void LibraryModule::addBrowseableCode (ProjectExporter& exporter, const ArrayisAndroid()) return Icon (getIcons().android, Colours::transparentBlack); else if (e->isCodeBlocks()) return Icon (getIcons().codeBlocks, Colours::transparentBlack); else if (e->isMakefile()) return Icon (getIcons().linux, Colours::transparentBlack); - else if (e->isCLion()) return Icon (getIcons().clion, Colours::transparentBlack); } return Icon(); diff --git a/extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h b/extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h index a7d1ad73..481e7b1f 100644 --- a/extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h +++ b/extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h b/extras/Projucer/Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h index b25027ff..5360756d 100644 --- a/extras/Projucer/Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h +++ b/extras/Projucer/Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -165,9 +165,6 @@ private: for (Project::ExporterIterator exporter (project); exporter.next();) { - if (exporter->isCLion()) - continue; - auto modulePathValue = exporter->getPathForModuleValue (moduleID); const auto fallbackPath = getAppSettings().getStoredPath (isJUCEModule (moduleID) ? Ids::defaultJuceModulePath : Ids::defaultUserModulePath, diff --git a/extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h b/extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h index fd57ac41..f4b1a5d4 100644 --- a/extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h +++ b/extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/UI/Sidebar/jucer_Sidebar.h b/extras/Projucer/Source/Project/UI/Sidebar/jucer_Sidebar.h index f88e8a73..927ef5e3 100644 --- a/extras/Projucer/Source/Project/UI/Sidebar/jucer_Sidebar.h +++ b/extras/Projucer/Source/Project/UI/Sidebar/jucer_Sidebar.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/UI/Sidebar/jucer_TreeItemTypes.h b/extras/Projucer/Source/Project/UI/Sidebar/jucer_TreeItemTypes.h index b0a56666..5d032c00 100644 --- a/extras/Projucer/Source/Project/UI/Sidebar/jucer_TreeItemTypes.h +++ b/extras/Projucer/Source/Project/UI/Sidebar/jucer_TreeItemTypes.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/UI/jucer_ContentViewComponent.h b/extras/Projucer/Source/Project/UI/jucer_ContentViewComponent.h index 39f93307..7a703a08 100644 --- a/extras/Projucer/Source/Project/UI/jucer_ContentViewComponent.h +++ b/extras/Projucer/Source/Project/UI/jucer_ContentViewComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/UI/jucer_ContentViewComponents.h b/extras/Projucer/Source/Project/UI/jucer_ContentViewComponents.h index e6c79f8e..ba618d06 100644 --- a/extras/Projucer/Source/Project/UI/jucer_ContentViewComponents.h +++ b/extras/Projucer/Source/Project/UI/jucer_ContentViewComponents.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/UI/jucer_FileGroupInformationComponent.h b/extras/Projucer/Source/Project/UI/jucer_FileGroupInformationComponent.h index 78bb426c..cd4c954c 100644 --- a/extras/Projucer/Source/Project/UI/jucer_FileGroupInformationComponent.h +++ b/extras/Projucer/Source/Project/UI/jucer_FileGroupInformationComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp b/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp index 86b30fad..9751417c 100644 --- a/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp +++ b/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.h b/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.h index 4a56ce0a..46e2b7cb 100644 --- a/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.h +++ b/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h b/extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h index 490c2fca..555ef839 100644 --- a/extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h +++ b/extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp index 985486c9..28b72d7b 100644 --- a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp +++ b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h index 3bcc6368..cfba44cd 100644 --- a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h +++ b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/UI/jucer_ProjectMessagesComponent.h b/extras/Projucer/Source/Project/UI/jucer_ProjectMessagesComponent.h index a7b60e63..14819f90 100644 --- a/extras/Projucer/Source/Project/UI/jucer_ProjectMessagesComponent.h +++ b/extras/Projucer/Source/Project/UI/jucer_ProjectMessagesComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/UI/jucer_UserAvatarComponent.h b/extras/Projucer/Source/Project/UI/jucer_UserAvatarComponent.h index a51d8ec3..789f52e8 100644 --- a/extras/Projucer/Source/Project/UI/jucer_UserAvatarComponent.h +++ b/extras/Projucer/Source/Project/UI/jucer_UserAvatarComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Project/jucer_Project.cpp b/extras/Projucer/Source/Project/jucer_Project.cpp index 28dc55f4..d0b8c2ac 100644 --- a/extras/Projucer/Source/Project/jucer_Project.cpp +++ b/extras/Projucer/Source/Project/jucer_Project.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -162,6 +162,10 @@ void Project::updateTitleDependencies() bundleIdentifierValue. setDefault (getDefaultBundleIdentifierString()); pluginAUExportPrefixValue.setDefault (build_tools::makeValidIdentifier (projectName, false, true, false) + "AU"); pluginAAXIdentifierValue. setDefault (getDefaultAAXIdentifierString()); + pluginLV2URIValue. setDefault (getDefaultLV2URI()); + pluginARAFactoryIDValue. setDefault (getDefaultARAFactoryIDString()); + pluginARAArchiveIDValue. setDefault (getDefaultARADocumentArchiveID()); + pluginARACompatibleArchiveIDsValue.setDefault (getDefaultARACompatibleArchiveIDs()); } String Project::getDocumentTitle() @@ -172,12 +176,20 @@ String Project::getDocumentTitle() void Project::updateCompanyNameDependencies() { bundleIdentifierValue.setDefault (getDefaultBundleIdentifierString()); + companyWebsiteValue.setDefault (getDefaultCompanyWebsiteString()); pluginAAXIdentifierValue.setDefault (getDefaultAAXIdentifierString()); + pluginARAFactoryIDValue.setDefault (getDefaultARAFactoryIDString()); + pluginARAArchiveIDValue.setDefault (getDefaultARADocumentArchiveID()); pluginManufacturerValue.setDefault (getDefaultPluginManufacturerString()); updateLicenseWarning(); } +void Project::updateWebsiteDependencies() +{ + pluginLV2URIValue.setDefault (getDefaultLV2URI()); +} + void Project::updateProjectSettings() { projectRoot.setProperty (Ids::name, getDocumentTitle(), nullptr); @@ -274,7 +286,7 @@ void Project::initialiseProjectValues() companyNameValue.referTo (projectRoot, Ids::companyName, getUndoManager()); companyCopyrightValue.referTo (projectRoot, Ids::companyCopyright, getUndoManager()); - companyWebsiteValue.referTo (projectRoot, Ids::companyWebsite, getUndoManager()); + companyWebsiteValue.referTo (projectRoot, Ids::companyWebsite, getUndoManager(), getDefaultCompanyWebsiteString()); companyEmailValue.referTo (projectRoot, Ids::companyEmail, getUndoManager()); projectTypeValue.referTo (projectRoot, Ids::projectType, getUndoManager(), build_tools::ProjectType_GUIApp::getTypeName()); @@ -330,6 +342,8 @@ void Project::initialiseAudioPluginValues() pluginCodeValue.referTo (projectRoot, Ids::pluginCode, getUndoManager(), makeValid4CC (getProjectUIDString() + getProjectUIDString())); pluginChannelConfigsValue.referTo (projectRoot, Ids::pluginChannelConfigs, getUndoManager()); pluginAAXIdentifierValue.referTo (projectRoot, Ids::aaxIdentifier, getUndoManager(), getDefaultAAXIdentifierString()); + pluginARAFactoryIDValue.referTo (projectRoot, Ids::araFactoryID, getUndoManager(), getDefaultARAFactoryIDString()); + pluginARAArchiveIDValue.referTo (projectRoot, Ids::araDocumentArchiveID, getUndoManager(), getDefaultARADocumentArchiveID()); pluginAUExportPrefixValue.referTo (projectRoot, Ids::pluginAUExportPrefix, getUndoManager(), build_tools::makeValidIdentifier (getProjectNameString(), false, true, false) + "AU"); @@ -337,11 +351,17 @@ void Project::initialiseAudioPluginValues() pluginAUSandboxSafeValue.referTo (projectRoot, Ids::pluginAUIsSandboxSafe, getUndoManager(), false); pluginVSTCategoryValue.referTo (projectRoot, Ids::pluginVSTCategory, getUndoManager(), getDefaultVSTCategories(), ","); pluginVST3CategoryValue.referTo (projectRoot, Ids::pluginVST3Category, getUndoManager(), getDefaultVST3Categories(), ","); - pluginRTASCategoryValue.referTo (projectRoot, Ids::pluginRTASCategory, getUndoManager(), getDefaultRTASCategories(), ","); pluginAAXCategoryValue.referTo (projectRoot, Ids::pluginAAXCategory, getUndoManager(), getDefaultAAXCategories(), ","); + pluginEnableARA.referTo (projectRoot, Ids::enableARA, getUndoManager(), shouldEnableARA(), ","); + pluginARAAnalyzableContentValue.referTo (projectRoot, Ids::pluginARAAnalyzableContent, getUndoManager(), getDefaultARAContentTypes(), ","); + pluginARATransformFlagsValue.referTo (projectRoot, Ids::pluginARATransformFlags, getUndoManager(), getDefaultARATransformationFlags(), ","); + pluginARACompatibleArchiveIDsValue.referTo (projectRoot, Ids::araCompatibleArchiveIDs, getUndoManager(), getDefaultARACompatibleArchiveIDs()); + pluginVSTNumMidiInputsValue.referTo (projectRoot, Ids::pluginVSTNumMidiInputs, getUndoManager(), 16); pluginVSTNumMidiOutputsValue.referTo (projectRoot, Ids::pluginVSTNumMidiOutputs, getUndoManager(), 16); + + pluginLV2URIValue.referTo (projectRoot, Ids::lv2Uri, getUndoManager(), getDefaultLV2URI()); } void Project::updateOldStyleConfigList() @@ -397,6 +417,10 @@ void Project::removeDefunctExporters() oldExporters.set ("VS2010", "Visual Studio 2010"); oldExporters.set ("VS2012", "Visual Studio 2012"); oldExporters.set ("VS2013", "Visual Studio 2013"); + oldExporters.set ("VS2015", "Visual Studio 2015"); + oldExporters.set ("CLION", "CLion"); + + std::vector removedExporterKeys; for (auto& key : oldExporters.getAllKeys()) { @@ -404,16 +428,36 @@ void Project::removeDefunctExporters() if (oldExporter.isValid()) { - if (ProjucerApplication::getApp().isRunningCommandLine) - std::cout << "WARNING! The " + oldExporters[key] + " Exporter is deprecated. The exporter will be removed from this project." << std::endl; - else - AlertWindow::showMessageBoxAsync (MessageBoxIconType::WarningIcon, - TRANS (oldExporters[key]), - TRANS ("The " + oldExporters[key] + " Exporter is deprecated. The exporter will be removed from this project.")); - + removedExporterKeys.push_back (key); exporters.removeChild (oldExporter, nullptr); } } + + if (! removedExporterKeys.empty()) + { + if (ProjucerApplication::getApp().isRunningCommandLine) + { + for (const auto& key : removedExporterKeys) + std::cout << "WARNING! The " + oldExporters[key] + + " Exporter is deprecated. The exporter will be removed from this project." + << std::endl; + } + else + { + const String warningTitle { TRANS ("Unsupported exporters") }; + + String warningMessage; + warningMessage << TRANS ("The following exporters are no longer supported") << "\n\n"; + + for (const auto& key : removedExporterKeys) + warningMessage << " - " + oldExporters[key] + "\n"; + + warningMessage << "\n" + << TRANS ("These exporters have been removed from the project. If you save the project they will be also erased from the .jucer file."); + + AlertWindow::showMessageBoxAsync (MessageBoxIconType::WarningIcon, warningTitle, warningMessage); + } + } } void Project::updateOldModulePaths() @@ -425,7 +469,7 @@ void Project::updateOldModulePaths() Array Project::getLegacyPluginFormatIdentifiers() noexcept { static Array legacyPluginFormatIdentifiers { Ids::buildVST, Ids::buildVST3, Ids::buildAU, Ids::buildAUv3, - Ids::buildRTAS, Ids::buildAAX, Ids::buildStandalone, Ids::enableIAA }; + Ids::buildAAX, Ids::buildStandalone, Ids::enableIAA }; return legacyPluginFormatIdentifiers; } @@ -433,8 +477,8 @@ Array Project::getLegacyPluginFormatIdentifiers() noexcept Array Project::getLegacyPluginCharacteristicsIdentifiers() noexcept { static Array legacyPluginCharacteristicsIdentifiers { Ids::pluginIsSynth, Ids::pluginWantsMidiIn, Ids::pluginProducesMidiOut, - Ids::pluginIsMidiEffectPlugin, Ids::pluginEditorRequiresKeys, Ids::pluginRTASDisableBypass, - Ids::pluginRTASDisableMultiMono, Ids::pluginAAXDisableBypass, Ids::pluginAAXDisableMultiMono }; + Ids::pluginIsMidiEffectPlugin, Ids::pluginEditorRequiresKeys, + Ids::pluginAAXDisableBypass, Ids::pluginAAXDisableMultiMono }; return legacyPluginCharacteristicsIdentifiers; } @@ -495,15 +539,6 @@ void Project::updatePluginCategories() pluginAAXCategoryValue = Array (getAllAAXCategoryVars()[getAllAAXCategoryStrings().indexOf (aaxCategory)]); } - { - auto rtasCategory = projectRoot.getProperty (Ids::pluginRTASCategory, {}).toString(); - - if (getAllRTASCategoryVars().contains (rtasCategory)) - pluginRTASCategoryValue = rtasCategory; - else if (getAllRTASCategoryStrings().contains (rtasCategory)) - pluginRTASCategoryValue = Array (getAllRTASCategoryVars()[getAllRTASCategoryStrings().indexOf (rtasCategory)]); - } - { auto vstCategory = projectRoot.getProperty (Ids::pluginVSTCategory, {}).toString(); @@ -663,7 +698,6 @@ Result Project::loadDocument (const File& file) setChangedFlag (false); - updateExporterWarnings(); updateLicenseWarning(); return Result::ok(); @@ -863,20 +897,6 @@ void Project::updateModuleWarnings() updateModuleNotFoundWarning (moduleNotFound); } -void Project::updateExporterWarnings() -{ - auto isClionPresent = [this]() - { - for (ExporterIterator exporter (*this); exporter.next();) - if (exporter->isCLion()) - return true; - - return false; - }(); - - updateCLionWarning (isClionPresent); -} - void Project::updateCppStandardWarning (bool showWarning) { if (showWarning) @@ -942,14 +962,6 @@ void Project::updateOldProjucerWarning (bool showWarning) removeProjectMessage (ProjectMessages::Ids::oldProjucer); } -void Project::updateCLionWarning (bool showWarning) -{ - if (showWarning) - addProjectMessage (ProjectMessages::Ids::cLion, {}); - else - removeProjectMessage (ProjectMessages::Ids::cLion); -} - void Project::updateModuleNotFoundWarning (bool showWarning) { if (showWarning) @@ -1071,6 +1083,10 @@ void Project::valueTreePropertyChanged (ValueTree& tree, const Identifier& prope { updateCompanyNameDependencies(); } + else if (property == Ids::companyWebsite) + { + updateWebsiteDependencies(); + } else if (property == Ids::defines) { parsedPreprocessorDefs = parsePreprocessorDefs (preprocessorDefsValue.get()); @@ -1085,8 +1101,10 @@ void Project::valueTreePropertyChanged (ValueTree& tree, const Identifier& prope pluginAUMainTypeValue.setDefault (getDefaultAUMainTypes()); pluginVSTCategoryValue.setDefault (getDefaultVSTCategories()); pluginVST3CategoryValue.setDefault (getDefaultVST3Categories()); - pluginRTASCategoryValue.setDefault (getDefaultRTASCategories()); pluginAAXCategoryValue.setDefault (getDefaultAAXCategories()); + pluginEnableARA.setDefault (getDefaultEnableARA()); + pluginARAAnalyzableContentValue.setDefault (getDefaultARAContentTypes()); + pluginARATransformFlagsValue.setDefault (getDefaultARATransformationFlags()); if (shouldWriteLegacyPluginCharacteristicsSettings) writeLegacyPluginCharacteristicsSettings(); @@ -1118,8 +1136,6 @@ void Project::valueTreeChildAdded (ValueTree& parent, ValueTree& child) if (child.getType() == Ids::MODULE) updateModuleWarnings(); - else if (parent.getType() == Ids::EXPORTFORMATS) - updateExporterWarnings(); changed(); } @@ -1130,8 +1146,6 @@ void Project::valueTreeChildRemoved (ValueTree& parent, ValueTree& child, int in if (child.getType() == Ids::MODULE) updateModuleWarnings(); - else if (parent.getType() == Ids::EXPORTFORMATS) - updateExporterWarnings(); changed(); } @@ -1231,33 +1245,36 @@ bool Project::shouldBuildTargetType (build_tools::ProjectType::Target::Type targ if (! projectType.supportsTargetType (targetType)) return false; + using Target = build_tools::ProjectType::Target; + switch (targetType) { - case build_tools::ProjectType::Target::VSTPlugIn: + case Target::VSTPlugIn: return shouldBuildVST(); - case build_tools::ProjectType::Target::VST3PlugIn: + case Target::VST3PlugIn: return shouldBuildVST3(); - case build_tools::ProjectType::Target::AAXPlugIn: + case Target::AAXPlugIn: return shouldBuildAAX(); - case build_tools::ProjectType::Target::RTASPlugIn: - return shouldBuildRTAS(); - case build_tools::ProjectType::Target::AudioUnitPlugIn: + case Target::AudioUnitPlugIn: return shouldBuildAU(); - case build_tools::ProjectType::Target::AudioUnitv3PlugIn: + case Target::AudioUnitv3PlugIn: return shouldBuildAUv3(); - case build_tools::ProjectType::Target::StandalonePlugIn: + case Target::StandalonePlugIn: return shouldBuildStandalonePlugin(); - case build_tools::ProjectType::Target::UnityPlugIn: + case Target::UnityPlugIn: return shouldBuildUnityPlugin(); - case build_tools::ProjectType::Target::AggregateTarget: - case build_tools::ProjectType::Target::SharedCodeTarget: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: + return shouldBuildLV2(); + case Target::AggregateTarget: + case Target::SharedCodeTarget: return projectType.isAudioPlugin(); - case build_tools::ProjectType::Target::unspecified: + case Target::unspecified: return false; - case build_tools::ProjectType::Target::GUIApp: - case build_tools::ProjectType::Target::ConsoleApp: - case build_tools::ProjectType::Target::StaticLibrary: - case build_tools::ProjectType::Target::DynamicLibrary: + case Target::GUIApp: + case Target::ConsoleApp: + case Target::StaticLibrary: + case Target::DynamicLibrary: default: break; } @@ -1284,14 +1301,27 @@ build_tools::ProjectType::Target::Type Project::getTargetTypeFromFilePath (const return path.contains (prefix + ".") || path.contains (prefix + "_"); }; - if (isPluginClientSource ("AU") || isInPluginClientSubdir ("AU")) return build_tools::ProjectType::Target::AudioUnitPlugIn; - if (isPluginClientSource ("AUv3") || isInPluginClientSubdir ("AU")) return build_tools::ProjectType::Target::AudioUnitv3PlugIn; - if (isPluginClientSource ("AAX") || isInPluginClientSubdir ("AAX")) return build_tools::ProjectType::Target::AAXPlugIn; - if (isPluginClientSource ("RTAS") || isInPluginClientSubdir ("RTAS")) return build_tools::ProjectType::Target::RTASPlugIn; - if (isPluginClientSource ("VST2") || isInPluginClientSubdir ("VST")) return build_tools::ProjectType::Target::VSTPlugIn; - if (isPluginClientSource ("VST3") || isInPluginClientSubdir ("VST3")) return build_tools::ProjectType::Target::VST3PlugIn; - if (isPluginClientSource ("Standalone") || isInPluginClientSubdir ("Standalone")) return build_tools::ProjectType::Target::StandalonePlugIn; - if (isPluginClientSource ("Unity") || isInPluginClientSubdir ("Unity")) return build_tools::ProjectType::Target::UnityPlugIn; + using Target = build_tools::ProjectType::Target::Type; + + struct FormatInfo + { + const char* source; + const char* subdir; + Target target; + }; + + const FormatInfo formatInfo[] { { "AU", "AU", Target::AudioUnitPlugIn }, + { "AUv3", "AU", Target::AudioUnitv3PlugIn }, + { "AAX", "AAX", Target::AAXPlugIn }, + { "VST2", "VST", Target::VSTPlugIn }, + { "VST3", "VST3", Target::VST3PlugIn }, + { "Standalone", "Standalone", Target::StandalonePlugIn }, + { "Unity", "Unity", Target::UnityPlugIn }, + { "LV2", "LV2", Target::LV2PlugIn } }; + + for (const auto& info : formatInfo) + if (isPluginClientSource (info.source) || isInPluginClientSubdir (info.subdir)) + return info.target; return (returnSharedTargetIfNoValidSuffix ? build_tools::ProjectType::Target::SharedCodeTarget : build_tools::ProjectType::Target::unspecified); @@ -1336,7 +1366,7 @@ void Project::createPropertyEditors (PropertyListBuilder& props) props.add (new ChoicePropertyComponent (displaySplashScreenValue, "Display the JUCE Splash Screen (required for closed source applications without an Indie or Pro JUCE license)"), "This option controls the display of the standard JUCE splash screen. " - "In accordance with the terms of the JUCE 6 End-Use License Agreement (www.juce.com/juce-6-licence), " + "In accordance with the terms of the JUCE 7 End-Use License Agreement (www.juce.com/juce-7-licence), " "this option can only be disabled for closed source applications if you have a JUCE Indie or Pro " "license, or are using JUCE under the GPL v3 license."); @@ -1417,20 +1447,29 @@ void Project::createPropertyEditors (PropertyListBuilder& props) void Project::createAudioPluginPropertyEditors (PropertyListBuilder& props) { - props.add (new MultiChoicePropertyComponent (pluginFormatsValue, "Plugin Formats", - { "VST3", "AU", "AUv3", "RTAS (deprecated)", "AAX", "Standalone", "Unity", "Enable IAA", "VST (Legacy)" }, - { Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildAUv3.toString(), - Ids::buildRTAS.toString(), Ids::buildAAX.toString(), Ids::buildStandalone.toString(), Ids::buildUnity.toString(), - Ids::enableIAA.toString(), Ids::buildVST.toString() }), - "Plugin formats to build. If you have selected \"VST (Legacy)\" then you will need to ensure that you have a VST2 SDK " - "in your header search paths. The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK " - "or JUCE version 5.3.2. You also need a VST2 license from Steinberg to distribute VST2 plug-ins."); + { + StringArray pluginFormatChoices { "VST3", "AU", "AUv3", "AAX", "Standalone", "LV2", "Unity", "Enable IAA", "VST (Legacy)" }; + Array pluginFormatChoiceValues { Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildAUv3.toString(), + Ids::buildAAX.toString(), Ids::buildStandalone.toString(), + Ids::buildLV2.toString(), Ids::buildUnity.toString(), Ids::enableIAA.toString(), Ids::buildVST.toString() }; + if (! getProjectType().isARAAudioPlugin()) + { + pluginFormatChoices.add ("Enable ARA"); + pluginFormatChoiceValues.add (Ids::enableARA.toString()); + } + props.add (new MultiChoicePropertyComponent (pluginFormatsValue, "Plugin Formats", pluginFormatChoices, pluginFormatChoiceValues), + "Plugin formats to build. If you have selected \"VST (Legacy)\" then you will need to ensure that you have a VST2 SDK " + "in your header search paths. The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK " + "or JUCE version 5.3.2. You also need a VST2 license from Steinberg to distribute VST2 plug-ins. If you enable ARA you " + "will have to obtain the ARA SDK by recursively cloning https://github.com/Celemony/ARA_SDK and checking out the tag " + "releases/2.1.0."); + } props.add (new MultiChoicePropertyComponent (pluginCharacteristicsValue, "Plugin Characteristics", { "Plugin is a Synth", "Plugin MIDI Input", "Plugin MIDI Output", "MIDI Effect Plugin", "Plugin Editor Requires Keyboard Focus", - "Disable RTAS Bypass", "Disable AAX Bypass", "Disable RTAS Multi-Mono", "Disable AAX Multi-Mono" }, + "Disable AAX Bypass", "Disable AAX Multi-Mono" }, { Ids::pluginIsSynth.toString(), Ids::pluginWantsMidiIn.toString(), Ids::pluginProducesMidiOut.toString(), - Ids::pluginIsMidiEffectPlugin.toString(), Ids::pluginEditorRequiresKeys.toString(), Ids::pluginRTASDisableBypass.toString(), - Ids::pluginAAXDisableBypass.toString(), Ids::pluginRTASDisableMultiMono.toString(), Ids::pluginAAXDisableMultiMono.toString() }), + Ids::pluginIsMidiEffectPlugin.toString(), Ids::pluginEditorRequiresKeys.toString(), + Ids::pluginAAXDisableBypass.toString(), Ids::pluginAAXDisableMultiMono.toString() }), "Some characteristics of your plugin such as whether it is a synth, produces MIDI messages, accepts MIDI messages etc."); props.add (new TextPropertyComponent (pluginNameValue, "Plugin Name", 128, false), "The name of your plugin (keep it short!)"); @@ -1489,8 +1528,6 @@ void Project::createAudioPluginPropertyEditors (PropertyListBuilder& props) "If neither of these are selected, the appropriate one will be automatically added based on the \"Plugin is a synth\" option."); } - props.add (new MultiChoicePropertyComponent (pluginRTASCategoryValue, "Plugin RTAS Category", getAllRTASCategoryStrings(), getAllRTASCategoryVars()), - "RTAS category."); props.add (new MultiChoicePropertyComponent (pluginAAXCategoryValue, "Plugin AAX Category", getAllAAXCategoryStrings(), getAllAAXCategoryVars()), "AAX category."); @@ -1502,6 +1539,30 @@ void Project::createAudioPluginPropertyEditors (PropertyListBuilder& props) props.add (new MultiChoicePropertyComponent (pluginVSTCategoryValue, "Plugin VST (Legacy) Category", getAllVSTCategoryStrings(), vstCategoryVars, 1), "VST category."); } + + props.add (new TextPropertyComponent (pluginLV2URIValue, "LV2 URI", 128, false), + "This acts as a unique identifier for this plugin. " + "If you make any incompatible changes to your plugin (remove parameters, reorder parameters, change preset format etc.) " + "you MUST change this value. LV2 hosts will assume that any plugins with the same URI are interchangeable."); + + if (shouldEnableARA()) + { + props.add (new MultiChoicePropertyComponent (pluginARAAnalyzableContentValue, "Plugin ARA Analyzeable Content Types", getAllARAContentTypeStrings(), getAllARAContentTypeVars()), + "ARA Analyzeable Content Types."); + + props.add (new MultiChoicePropertyComponent (pluginARATransformFlagsValue, "Plugin ARA Transformation Flags", getAllARATransformationFlagStrings(), getAllARATransformationFlagVars()), + "ARA Transformation Flags."); + + props.add (new TextPropertyComponent (pluginARAFactoryIDValue, "Plugin ARA Factory ID", 256, false), + "ARA Factory ID."); + + props.add (new TextPropertyComponent (pluginARAArchiveIDValue, "Plugin ARA Document Archive ID", 256, false), + "ARA Document Archive ID."); + + props.add (new TextPropertyComponent (pluginARACompatibleArchiveIDsValue, "Plugin ARA Compatible Document Archive IDs", 1024, true), + "List of compatible ARA Document Archive IDs - one per line"); + + } } //============================================================================== @@ -2097,11 +2158,31 @@ String Project::getDefaultBundleIdentifierString() const + "." + build_tools::makeValidIdentifier (getProjectNameString(), false, true, false); } +String Project::getDefaultCompanyWebsiteString() const +{ + return "www." + build_tools::makeValidIdentifier (getCompanyNameOrDefault (getCompanyNameString()), false, true, false) + ".com"; +} + String Project::getDefaultPluginManufacturerString() const { return getCompanyNameOrDefault (getCompanyNameString()); } +String Project::getDefaultARAFactoryIDString() const +{ + return getDefaultBundleIdentifierString() + ".factory"; +} + +String Project::getDefaultARADocumentArchiveID() const +{ + return getDefaultBundleIdentifierString() + ".aradocumentarchive." + getVersionString(); +} + +String Project::getDefaultARACompatibleArchiveIDs() const +{ + return String(); +} + String Project::getAUMainTypeString() const noexcept { auto v = pluginAUMainTypeValue.get(); @@ -2181,21 +2262,6 @@ int Project::getAAXCategory() const noexcept return res; } -int Project::getRTASCategory() const noexcept -{ - int res = 0; - - auto v = pluginRTASCategoryValue.get(); - - if (auto* arr = v.getArray()) - { - for (auto c : *arr) - res |= static_cast (c); - } - - return res; -} - String Project::getIAATypeCode() const { String s; @@ -2224,6 +2290,32 @@ String Project::getIAAPluginName() const return s; } +int Project::getARAContentTypes() const noexcept +{ + int res = 0; + + if (auto* arr = pluginARAAnalyzableContentValue.get().getArray()) + { + for (auto c : *arr) + res |= (int) c; + } + + return res; +} + +int Project::getARATransformationFlags() const noexcept +{ + int res = 0; + + if (auto* arr = pluginARATransformFlagsValue.get().getArray()) + { + for (auto c : *arr) + res |= (int) c; + } + + return res; +} + //============================================================================== bool Project::isAUPluginHost() { @@ -2240,6 +2332,21 @@ bool Project::isVST3PluginHost() return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_VST3", false); } +bool Project::isLV2PluginHost() +{ + return getEnabledModules().isModuleEnabled ("juce_audio_processors") && isConfigFlagEnabled ("JUCE_PLUGINHOST_LV2", false); +} + +bool Project::isARAPluginHost() +{ + return (isVST3PluginHost() || isAUPluginHost()) && isConfigFlagEnabled ("JUCE_PLUGINHOST_ARA", false); +} + +void Project::disableStandaloneForARAPlugIn() +{ + pluginFormatsValue.referTo (projectRoot, Ids::pluginFormats, getUndoManager(), Array (Ids::buildVST3.toString(), Ids::buildAU.toString()), ","); +} + //============================================================================== StringArray Project::getAllAUMainTypeStrings() noexcept { @@ -2329,32 +2436,65 @@ Array Project::getDefaultAAXCategories() const noexcept return getAllAAXCategoryVars()[getAllAAXCategoryStrings().indexOf ("AAX_ePlugInCategory_None")]; } -StringArray Project::getAllRTASCategoryStrings() noexcept +bool Project::getDefaultEnableARA() const noexcept +{ + return false; +} + +StringArray Project::getAllARAContentTypeStrings() noexcept { - static StringArray rtasCategoryStrings { "ePlugInCategory_None", "ePlugInCategory_EQ", "ePlugInCategory_Dynamics", "ePlugInCategory_PitchShift", - "ePlugInCategory_Reverb", "ePlugInCategory_Delay", "ePlugInCategory_Modulation", "ePlugInCategory_Harmonic", - "ePlugInCategory_NoiseReduction", "ePlugInCategory_Dither", "ePlugInCategory_SoundField", "ePlugInCategory_HWGenerators", - "ePlugInCategory_SWGenerators", "ePlugInCategory_WrappedPlugin", "ePlugInCategory_Effect" }; + static StringArray araContentTypes { "Notes", + "Tempo Entries", + "Bar Signatures", + "Static Tuning", + "Dynamic Tuning Offsets", + "Key Signatures", + "Sheet Chords" }; + return araContentTypes; +} - return rtasCategoryStrings; +Array Project::getAllARAContentTypeVars() noexcept +{ + static Array araContentVars { + /*kARAContentTypeNotes =*/ 1 << 0, + /*kARAContentTypeTempoEntries =*/ 1 << 1, + /*kARAContentTypeBarSignatures =*/ 1 << 2, + /*kARAContentTypeStaticTuning =*/ 1 << 3, + /*kARAContentTypeDynamicTuningOffsets =*/ 1 << 4, + /*kARAContentTypeKeySignatures =*/ 1 << 5, + /*kARAContentTypeSheetChords =*/ 1 << 6, + }; + return araContentVars; } -Array Project::getAllRTASCategoryVars() noexcept +Array Project::getDefaultARAContentTypes() const noexcept { - static Array rtasCategoryVars { 0x00000000, 0x00000001, 0x00000002, 0x00000004, - 0x00000008, 0x00000010, 0x00000020, 0x00000040, - 0x00000080, 0x00000100, 0x00000200, 0x00000400, - 0x00000800, 0x00001000, 0x00002000 }; + return {}; +} - return rtasCategoryVars; +StringArray Project::getAllARATransformationFlagStrings() noexcept +{ + static StringArray araTransformationFlags { "Time Stretch", + "Time Stretch (reflecting tempo)", + "Content Based Fades At Tail", + "Content Based Fades At Head" }; + return araTransformationFlags; } -Array Project::getDefaultRTASCategories() const noexcept +Array Project::getAllARATransformationFlagVars() noexcept { - if (isPluginSynth()) - return getAllRTASCategoryVars()[getAllRTASCategoryStrings().indexOf ("ePlugInCategory_SWGenerators")]; + static Array araContentVars { + /*kARAPlaybackTransformationTimestretch =*/ 1 << 0, + /*kARAPlaybackTransformationTimestretchReflectingTempo =*/ 1 << 1, + /*kARAPlaybackTransformationContentBasedFadesAtTail =*/ 1 << 2, + /*kARAPlaybackTransformationContentBasedFadesAtHead =*/ 1 << 3 + }; + return araContentVars; +} - return getAllRTASCategoryVars()[getAllRTASCategoryStrings().indexOf ("ePlugInCategory_None")]; +Array Project::getDefaultARATransformationFlags() const noexcept +{ + return {}; } //============================================================================== @@ -2607,11 +2747,12 @@ StringPairArray Project::getAudioPluginFlags() const flags.set ("JucePlugin_Build_VST3", boolToString (shouldBuildVST3())); flags.set ("JucePlugin_Build_AU", boolToString (shouldBuildAU())); flags.set ("JucePlugin_Build_AUv3", boolToString (shouldBuildAUv3())); - flags.set ("JucePlugin_Build_RTAS", boolToString (shouldBuildRTAS())); flags.set ("JucePlugin_Build_AAX", boolToString (shouldBuildAAX())); flags.set ("JucePlugin_Build_Standalone", boolToString (shouldBuildStandalonePlugin())); flags.set ("JucePlugin_Build_Unity", boolToString (shouldBuildUnityPlugin())); + flags.set ("JucePlugin_Build_LV2", boolToString (shouldBuildLV2())); flags.set ("JucePlugin_Enable_IAA", boolToString (shouldEnableIAA())); + flags.set ("JucePlugin_Enable_ARA", boolToString (shouldEnableARA())); flags.set ("JucePlugin_Name", toStringLiteral (getPluginNameString())); flags.set ("JucePlugin_Desc", toStringLiteral (getPluginDescriptionString())); flags.set ("JucePlugin_Manufacturer", toStringLiteral (getPluginManufacturerString())); @@ -2636,11 +2777,6 @@ StringPairArray Project::getAudioPluginFlags() const flags.set ("JucePlugin_AUExportPrefixQuoted", toStringLiteral (getPluginAUExportPrefixString())); flags.set ("JucePlugin_AUManufacturerCode", "JucePlugin_ManufacturerCode"); flags.set ("JucePlugin_CFBundleIdentifier", getBundleIdentifierString()); - flags.set ("JucePlugin_RTASCategory", String (getRTASCategory())); - flags.set ("JucePlugin_RTASManufacturerCode", "JucePlugin_ManufacturerCode"); - flags.set ("JucePlugin_RTASProductId", "JucePlugin_PluginCode"); - flags.set ("JucePlugin_RTASDisableBypass", boolToString (isPluginRTASBypassDisabled())); - flags.set ("JucePlugin_RTASDisableMultiMono", boolToString (isPluginRTASMultiMonoDisabled())); flags.set ("JucePlugin_AAXIdentifier", getAAXIdentifierString()); flags.set ("JucePlugin_AAXManufacturerCode", "JucePlugin_ManufacturerCode"); flags.set ("JucePlugin_AAXProductId", "JucePlugin_PluginCode"); @@ -2652,6 +2788,11 @@ StringPairArray Project::getAudioPluginFlags() const flags.set ("JucePlugin_IAAName", toStringLiteral (getIAAPluginName())); flags.set ("JucePlugin_VSTNumMidiInputs", getVSTNumMIDIInputsString()); flags.set ("JucePlugin_VSTNumMidiOutputs", getVSTNumMIDIOutputsString()); + flags.set ("JucePlugin_ARAContentTypes", String (getARAContentTypes())); + flags.set ("JucePlugin_ARATransformationFlags", String (getARATransformationFlags())); + flags.set ("JucePlugin_ARAFactoryID", toStringLiteral(getARAFactoryIDString())); + flags.set ("JucePlugin_ARADocumentArchiveID", toStringLiteral(getARADocumentArchiveIDString())); + flags.set ("JucePlugin_ARACompatibleArchiveIDs", toStringLiteral(getARACompatibleArchiveIDStrings())); { String plugInChannelConfig = getPluginChannelConfigsString(); diff --git a/extras/Projucer/Source/Project/jucer_Project.h b/extras/Projucer/Source/Project/jucer_Project.h index 8f1a3a91..03401681 100644 --- a/extras/Projucer/Source/Project/jucer_Project.h +++ b/extras/Projucer/Source/Project/jucer_Project.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -48,7 +48,6 @@ namespace ProjectMessages DECLARE_ID (jucerFileModified); DECLARE_ID (missingModuleDependencies); DECLARE_ID (oldProjucer); - DECLARE_ID (cLion); DECLARE_ID (newVersionAvailable); DECLARE_ID (pluginCodeInvalid); DECLARE_ID (manufacturerCodeInvalid); @@ -65,7 +64,7 @@ namespace ProjectMessages { static Identifier warnings[] = { Ids::incompatibleLicense, Ids::cppStandard, Ids::moduleNotFound, Ids::jucePath, Ids::jucerFileModified, Ids::missingModuleDependencies, - Ids::oldProjucer, Ids::cLion, Ids::pluginCodeInvalid, Ids::manufacturerCodeInvalid }; + Ids::oldProjucer, Ids::pluginCodeInvalid, Ids::manufacturerCodeInvalid }; if (std::find (std::begin (warnings), std::end (warnings), message) != std::end (warnings)) return Ids::warning; @@ -87,7 +86,6 @@ namespace ProjectMessages if (message == Ids::missingModuleDependencies) return "Missing Module Dependencies"; if (message == Ids::oldProjucer) return "Projucer Out of Date"; if (message == Ids::newVersionAvailable) return "New Version Available"; - if (message == Ids::cLion) return "Deprecated Exporter"; if (message == Ids::pluginCodeInvalid) return "Invalid Plugin Code"; if (message == Ids::manufacturerCodeInvalid) return "Invalid Manufacturer Code"; @@ -105,7 +103,6 @@ namespace ProjectMessages if (message == Ids::missingModuleDependencies) return "Module(s) have missing dependencies."; if (message == Ids::oldProjucer) return "The version of the Projucer you are using is out of date."; if (message == Ids::newVersionAvailable) return "A new version of JUCE is available to download."; - if (message == Ids::cLion) return "The CLion exporter is deprecated. Use JUCE's CMake support instead."; if (message == Ids::pluginCodeInvalid) return "The plugin code should be exactly four characters in length."; if (message == Ids::manufacturerCodeInvalid) return "The manufacturer code should be exactly four characters in length."; @@ -160,6 +157,8 @@ public: static String getAppConfigFilename() { return "AppConfig.h"; } static String getPluginDefinesFilename() { return "JucePluginDefines.h"; } static String getJuceSourceHFilename() { return "JuceHeader.h"; } + static String getJuceLV2DefinesFilename() { return "JuceLV2Defines.h"; } + static String getLV2FileWriterName() { return "juce_lv2_helper"; } //============================================================================== template @@ -197,8 +196,13 @@ public: String getBundleIdentifierString() const { return bundleIdentifierValue.get(); } String getDefaultBundleIdentifierString() const; + String getDefaultCompanyWebsiteString() const; String getDefaultAAXIdentifierString() const { return getDefaultBundleIdentifierString(); } String getDefaultPluginManufacturerString() const; + String getDefaultLV2URI() const { return getCompanyWebsiteString() + "/plugins/" + build_tools::makeValidIdentifier (getProjectNameString(), false, true, false); } + String getDefaultARAFactoryIDString() const; + String getDefaultARADocumentArchiveID() const; + String getDefaultARACompatibleArchiveIDs() const; String getCompanyNameString() const { return companyNameValue.get(); } String getCompanyCopyrightString() const { return companyCopyrightValue.get(); } @@ -245,7 +249,11 @@ public: String getPluginCodeString() const { return pluginCodeValue.get(); } String getPluginChannelConfigsString() const { return pluginChannelConfigsValue.get(); } String getAAXIdentifierString() const { return pluginAAXIdentifierValue.get(); } + String getARAFactoryIDString() const { return pluginARAFactoryIDValue.get(); } + String getARADocumentArchiveIDString() const { return pluginARAArchiveIDValue.get(); } + String getARACompatibleArchiveIDStrings() const { return pluginARACompatibleArchiveIDsValue.get(); } String getPluginAUExportPrefixString() const { return pluginAUExportPrefixValue.get(); } + String getPluginAUMainTypeString() const { return pluginAUMainTypeValue.get(); } String getVSTNumMIDIInputsString() const { return pluginVSTNumMidiInputsValue.get(); } String getVSTNumMIDIOutputsString() const { return pluginVSTNumMidiOutputsValue.get(); } @@ -268,22 +276,23 @@ public: bool shouldBuildVST3() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildVST3); } bool shouldBuildAU() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildAU); } bool shouldBuildAUv3() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildAUv3); } - bool shouldBuildRTAS() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildRTAS); } bool shouldBuildAAX() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildAAX); } bool shouldBuildStandalonePlugin() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildStandalone); } bool shouldBuildUnityPlugin() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildUnity); } + bool shouldBuildLV2() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::buildLV2); } bool shouldEnableIAA() const { return isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::enableIAA); } + bool shouldEnableARA() const { return (isAudioPluginProject() && checkMultiChoiceVar (pluginFormatsValue, Ids::enableARA)) || getProjectType().isARAAudioPlugin(); } bool isPluginSynth() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginIsSynth); } bool pluginWantsMidiInput() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginWantsMidiIn); } bool pluginProducesMidiOutput() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginProducesMidiOut); } bool isPluginMidiEffect() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginIsMidiEffectPlugin); } bool pluginEditorNeedsKeyFocus() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginEditorRequiresKeys); } - bool isPluginRTASBypassDisabled() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginRTASDisableBypass); } - bool isPluginRTASMultiMonoDisabled() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginRTASDisableMultiMono); } bool isPluginAAXBypassDisabled() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginAAXDisableBypass); } bool isPluginAAXMultiMonoDisabled() const { return checkMultiChoiceVar (pluginCharacteristicsValue, Ids::pluginAAXDisableMultiMono); } + void disableStandaloneForARAPlugIn(); + static StringArray getAllAUMainTypeStrings() noexcept; static Array getAllAUMainTypeVars() noexcept; Array getDefaultAUMainTypes() const noexcept; @@ -298,16 +307,22 @@ public: static Array getAllAAXCategoryVars() noexcept; Array getDefaultAAXCategories() const noexcept; - static StringArray getAllRTASCategoryStrings() noexcept; - static Array getAllRTASCategoryVars() noexcept; - Array getDefaultRTASCategories() const noexcept; + bool getDefaultEnableARA() const noexcept; + static StringArray getAllARAContentTypeStrings() noexcept; + static Array getAllARAContentTypeVars() noexcept; + Array getDefaultARAContentTypes() const noexcept; + + static StringArray getAllARATransformationFlagStrings() noexcept; + static Array getAllARATransformationFlagVars() noexcept; + Array getDefaultARATransformationFlags() const noexcept; String getAUMainTypeString() const noexcept; bool isAUSandBoxSafe() const noexcept; String getVSTCategoryString() const noexcept; String getVST3CategoryString() const noexcept; int getAAXCategory() const noexcept; - int getRTASCategory() const noexcept; + int getARAContentTypes() const noexcept; + int getARATransformationFlags() const noexcept; String getIAATypeCode() const; String getIAAPluginName() const; @@ -321,10 +336,14 @@ public: return name; } + String getLV2URI() const { return pluginLV2URIValue.get(); } + //============================================================================== bool isAUPluginHost(); bool isVSTPluginHost(); bool isVST3PluginHost(); + bool isLV2PluginHost(); + bool isARAPluginHost(); //============================================================================== bool shouldBuildTargetType (build_tools::ProjectType::Target::Type targetType) const noexcept; @@ -555,8 +574,9 @@ private: ValueTreePropertyWithDefault pluginFormatsValue, pluginNameValue, pluginDescriptionValue, pluginManufacturerValue, pluginManufacturerCodeValue, pluginCodeValue, pluginChannelConfigsValue, pluginCharacteristicsValue, pluginAUExportPrefixValue, pluginAAXIdentifierValue, - pluginAUMainTypeValue, pluginAUSandboxSafeValue, pluginRTASCategoryValue, pluginVSTCategoryValue, pluginVST3CategoryValue, pluginAAXCategoryValue, - pluginVSTNumMidiInputsValue, pluginVSTNumMidiOutputsValue; + pluginAUMainTypeValue, pluginAUSandboxSafeValue, pluginVSTCategoryValue, pluginVST3CategoryValue, pluginAAXCategoryValue, + pluginEnableARA, pluginARAAnalyzableContentValue, pluginARAFactoryIDValue, pluginARAArchiveIDValue, pluginARACompatibleArchiveIDsValue, pluginARATransformFlagsValue, + pluginVSTNumMidiInputsValue, pluginVSTNumMidiOutputsValue, pluginLV2URIValue; //============================================================================== std::unique_ptr enabledModulesList; @@ -585,7 +605,6 @@ private: std::pair cachedFileState; //============================================================================== - friend class Item; StringPairArray parsedPreprocessorDefs; //============================================================================== @@ -601,6 +620,7 @@ private: void updateTitleDependencies(); void updateCompanyNameDependencies(); void updateProjectSettings(); + void updateWebsiteDependencies(); ValueTree getConfigurations() const; ValueTree getConfigNode(); @@ -618,11 +638,9 @@ private: void updateJUCEPathWarning(); void updateModuleWarnings(); - void updateExporterWarnings(); void updateCppStandardWarning (bool showWarning); void updateMissingModuleDependenciesWarning (bool showWarning); void updateOldProjucerWarning (bool showWarning); - void updateCLionWarning (bool showWarning); void updateModuleNotFoundWarning (bool showWarning); void updateCodeWarning (Identifier identifier, String value); diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h index b4312a6a..9021db21 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -36,7 +36,6 @@ public: bool isCodeBlocks() const override { return false; } bool isMakefile() const override { return false; } bool isAndroidStudio() const override { return true; } - bool isCLion() const override { return false; } bool isAndroid() const override { return true; } bool isWindows() const override { return false; } @@ -519,9 +518,12 @@ private: if (excludeFromBuild.size() > 0) { + mo << "set_source_files_properties(" << newLine; + for (auto& exclude : excludeFromBuild) - mo << "set_source_files_properties(\"" << exclude.toUnixStyle() << "\" PROPERTIES HEADER_FILE_ONLY TRUE)" << newLine; + mo << " \"" << exclude.toUnixStyle() << '"' << newLine; + mo << " PROPERTIES HEADER_FILE_ONLY TRUE)" << newLine; mo << newLine; } @@ -864,7 +866,7 @@ private: mo << " implementation files('libs/" << File (d).getFileName() << "')" << newLine; if (isInAppBillingEnabled()) - mo << " implementation 'com.android.billingclient:billing:2.1.0'" << newLine; + mo << " implementation 'com.android.billingclient:billing:5.0.0'" << newLine; if (areRemoteNotificationsEnabled()) { @@ -1670,7 +1672,15 @@ private: } for (int i = permissions.size(); --i >= 0;) - manifest.createNewChildElement ("uses-permission")->setAttribute ("android:name", permissions[i]); + { + const auto permission = permissions[i]; + auto* usesPermission = manifest.createNewChildElement ("uses-permission"); + usesPermission->setAttribute ("android:name", permission); + + // This permission only has an effect on SDK version 28 and lower + if (permission == "android.permission.WRITE_EXTERNAL_STORAGE") + usesPermission->setAttribute ("android:maxSdkVersion", "28"); + } } void createOpenGlFeatureElement (XmlElement& manifest) const diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h deleted file mode 100644 index 1ad86918..00000000 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h +++ /dev/null @@ -1,1216 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#pragma once - -#include "jucer_ProjectExport_CodeBlocks.h" -#include "jucer_ProjectExport_Make.h" -#include "jucer_ProjectExport_Xcode.h" - -//============================================================================== -class CLionProjectExporter : public ProjectExporter -{ -protected: - //============================================================================== - class CLionBuildConfiguration : public BuildConfiguration - { - public: - CLionBuildConfiguration (Project& p, const ValueTree& settings, const ProjectExporter& e) - : BuildConfiguration (p, settings, e) - { - } - - void createConfigProperties (PropertyListBuilder&) override {} - String getModuleLibraryArchName() const override { return {}; } - }; - - BuildConfiguration::Ptr createBuildConfig (const ValueTree& tree) const override - { - return *new CLionBuildConfiguration (project, tree, *this); - } - -public: - //============================================================================== - static String getDisplayName() { return "CLion [Deprecated]"; } - static String getValueTreeTypeName() { return "CLION"; } - static String getTargetFolderName() { return "CLion"; } - - Identifier getExporterIdentifier() const override { return getValueTreeTypeName(); } - - static CLionProjectExporter* createForSettings (Project& projectToUse, const ValueTree& settingsToUse) - { - if (settingsToUse.hasType (getValueTreeTypeName())) - return new CLionProjectExporter (projectToUse, settingsToUse); - - return nullptr; - } - - static bool isExporterSupported (const ProjectExporter& exporter) - { - return exporter.isMakefile() - || (exporter.isXcode() && ! exporter.isiOS()) - || (exporter.isCodeBlocks() && exporter.isWindows()); - } - - //============================================================================== - CLionProjectExporter (Project& p, const ValueTree& t) : ProjectExporter (p, t) - { - name = getDisplayName(); - targetLocationValue.setDefault (getDefaultBuildsRootFolder() + getTargetFolderName()); - } - - //============================================================================== - bool usesMMFiles() const override { return false; } - bool canCopeWithDuplicateFiles() override { return false; } - bool supportsUserDefinedConfigurations() const override { return false; } - - bool isXcode() const override { return false; } - bool isVisualStudio() const override { return false; } - bool isCodeBlocks() const override { return false; } - bool isMakefile() const override { return false; } - bool isAndroidStudio() const override { return false; } - bool isCLion() const override { return true; } - - bool isAndroid() const override { return false; } - bool isWindows() const override { return false; } - bool isLinux() const override { return false; } - bool isOSX() const override { return false; } - bool isiOS() const override { return false; } - - String getNewLineString() const override { return "\n"; } - - bool supportsTargetType (build_tools::ProjectType::Target::Type) const override { return true; } - - void addPlatformSpecificSettingsForProjectType (const build_tools::ProjectType&) override {} - - //============================================================================== - bool canLaunchProject() override - { - #if JUCE_MAC - static Identifier exporterName (XcodeProjectExporter::getValueTreeTypeNameMac()); - #elif JUCE_WINDOWS - static Identifier exporterName (CodeBlocksProjectExporter::getValueTreeTypeNameWindows()); - #elif JUCE_LINUX || JUCE_BSD - static Identifier exporterName (MakefileProjectExporter::getValueTreeTypeName()); - #else - static Identifier exporterName; - #endif - - if (getProject().getExporters().getChildWithName (exporterName).isValid()) - return getCLionExecutableOrApp().exists(); - - return false; - } - - bool launchProject() override - { - return getCLionExecutableOrApp().startAsProcess (getTargetFolder().getFullPathName().quoted()); - } - - String getDescription() override - { - String description; - - description << "*****" << newLine - << newLine - << "This exporter is deprecated." << newLine - << newLine - << "CLion can open any CMake-based projects and JUCE's direct CMake support provides a much more " - << "flexible way of configuring CMake. To get started using JUCE with CMake please see the guide in " - << "the 'docs/CMake API.md' file in the JUCE source code." << newLine - << newLine - << "This exporter will no longer be updated and will eventually be removed from the Projucer." << newLine - << newLine - << "*****" << newLine - << newLine - << "This CLion exporter produces a single CMakeLists.txt file with " - << "multiple platform dependent sections, where the configuration for each section " - << "is inherited from other exporters added to this project." << newLine - << newLine - << "The exporters which provide the CLion configuration for the corresponding platform are:" << newLine - << newLine; - - for (auto& exporterInfo : getExporterTypeInfos()) - { - std::unique_ptr exporter (createNewExporter (getProject(), exporterInfo.identifier)); - - if (isExporterSupported (*exporter)) - description << exporterInfo.displayName << newLine; - } - - description << newLine - << "Add these exporters to the project to enable CLion builds." << newLine - << newLine - << "Not all features of all the exporters are currently supported. Notable omissions are AUv3 " - << "plug-ins, embedding resources and fat binaries on MacOS. On Windows the CLion exporter " - << "requires a GCC-based compiler like MinGW."; - - return description; - } - - void createExporterProperties (PropertyListBuilder& properties) override - { - for (Project::ExporterIterator exporter (getProject()); exporter.next();) - if (isExporterSupported (*exporter)) - properties.add (new BooleanPropertyComponent (getExporterEnabledValue (*exporter), "Import settings from exporter", exporter->getUniqueName()), - "If this is enabled then settings from the corresponding exporter will " - "be used in the generated CMakeLists.txt"); - } - - void createDefaultConfigs() override {} - - void create (const OwnedArray&) const override - { - // We'll append to this later. - build_tools::writeStreamToFile (getTargetFolder().getChildFile ("CMakeLists.txt"), [this] (MemoryOutputStream& mo) - { - mo.setNewLineString (getNewLineString()); - - mo << "# Automatically generated CMakeLists, created by the Projucer" << newLine - << "# Do not edit this file! Your changes will be overwritten when you re-save the Projucer project!" << newLine - << newLine; - - mo << "cmake_minimum_required (VERSION 3.4.1)" << newLine - << newLine; - - mo << "if (NOT CMAKE_BUILD_TYPE)" << newLine - << " set (CMAKE_BUILD_TYPE \"Debug\" CACHE STRING \"Choose the type of build.\" FORCE)" << newLine - << "endif (NOT CMAKE_BUILD_TYPE)" << newLine - << newLine; - }); - - // CMake has stopped adding PkgInfo files to bundles, so we need to do it manually - build_tools::writeStreamToFile (getTargetFolder().getChildFile ("PkgInfo"), - [] (MemoryOutputStream& mo) { mo << "BNDL????"; }); - } - - void writeCMakeListsExporterSection (ProjectExporter* exporter) const - { - if (! (isExporterSupported (*exporter) && isExporterEnabled (*exporter))) - return; - - MemoryBlock existingContent; - getTargetFolder().getChildFile ("CMakeLists.txt").loadFileAsData (existingContent); - - MemoryOutputStream out (existingContent, true); - out.setNewLineString (getNewLineString()); - - out << "###############################################################################" << newLine - << "# " << exporter->getUniqueName() << newLine - << "###############################################################################" << newLine - << newLine; - - if (auto* makefileExporter = dynamic_cast (exporter)) - { - out << "if (UNIX AND NOT APPLE)" << newLine << newLine; - writeCMakeListsMakefileSection (out, *makefileExporter); - } - else if (auto* xcodeExporter = dynamic_cast (exporter)) - { - out << "if (APPLE)" << newLine << newLine; - writeCMakeListsXcodeSection (out, *xcodeExporter); - } - else if (auto* codeBlocksExporter = dynamic_cast (exporter)) - { - out << "if (WIN32)" << newLine << newLine; - writeCMakeListsCodeBlocksSection (out, *codeBlocksExporter); - } - - out << "endif()" << newLine << newLine; - - build_tools::overwriteFileIfDifferentOrThrow (getTargetFolder().getChildFile ("CMakeLists.txt"), out); - } - -private: - //============================================================================== - static File getCLionExecutableOrApp() - { - File clionExeOrApp (getAppSettings() - .getStoredPath (Ids::clionExePath, TargetOS::getThisOS()).get() - .toString() - .replace ("${user.home}", File::getSpecialLocation (File::userHomeDirectory).getFullPathName())); - - #if JUCE_MAC - if (clionExeOrApp.getFullPathName().endsWith ("/Contents/MacOS/clion")) - clionExeOrApp = clionExeOrApp.getParentDirectory() - .getParentDirectory() - .getParentDirectory(); - #endif - - return clionExeOrApp; - } - - //============================================================================== - Identifier getExporterEnabledId (const ProjectExporter& exporter) const - { - jassert (isExporterSupported (exporter)); - - if (exporter.isMakefile()) return Ids::clionMakefileEnabled; - else if (exporter.isXcode()) return Ids::clionXcodeEnabled; - else if (exporter.isCodeBlocks()) return Ids::clionCodeBlocksEnabled; - - jassertfalse; - return {}; - } - - bool isExporterEnabled (const ProjectExporter& exporter) const - { - auto setting = settings[getExporterEnabledId (exporter)]; - return setting.isVoid() || setting; - } - - Value getExporterEnabledValue (const ProjectExporter& exporter) - { - auto enabledID = getExporterEnabledId (exporter); - getSetting (enabledID) = isExporterEnabled (exporter); - return getSetting (enabledID); - } - - //============================================================================== - static bool isWindowsAbsolutePath (const String& path) - { - return path.length() > 1 && path[1] == ':'; - } - - static bool isUnixAbsolutePath (const String& path) - { - return path.isNotEmpty() && (path[0] == '/' || path[0] == '~' || path.startsWith ("$ENV{HOME}")); - } - - //============================================================================== - static String setCMakeVariable (const String& variableName, const String& value) - { - return "set (" + variableName + " \"" + value + "\")"; - } - - static String addToCMakeVariable (const String& variableName, const String& value) - { - return setCMakeVariable (variableName, "${" + variableName + "} " + value); - } - - static String getTargetVarName (build_tools::ProjectType::Target& target) - { - return String (target.getName()).toUpperCase().replaceCharacter (L' ', L'_'); - } - - template - void getFileInfoList (Target& target, Exporter& exporter, const Project::Item& projectItem, std::vector>& fileInfoList) const - { - auto targetType = (getProject().isAudioPluginProject() ? target.type : Target::Type::SharedCodeTarget); - - if (projectItem.isGroup()) - { - for (int i = 0; i < projectItem.getNumChildren(); ++i) - getFileInfoList (target, exporter, projectItem.getChild(i), fileInfoList); - } - else if (projectItem.shouldBeAddedToTargetProject() && projectItem.shouldBeAddedToTargetExporter (*this) - && getProject().getTargetTypeFromFilePath (projectItem.getFile(), true) == targetType ) - { - auto path = build_tools::RelativePath (projectItem.getFile(), exporter.getTargetFolder(), build_tools::RelativePath::buildTargetFolder).toUnixStyle(); - - fileInfoList.push_back (std::make_tuple (path, - projectItem.shouldBeCompiled(), - exporter.compilerFlagSchemesMap[projectItem.getCompilerFlagSchemeString()].get().toString())); - } - } - - template - void writeCMakeTargets (OutputStream& out, Exporter& exporter) const - { - for (auto* target : exporter.targets) - { - if (target->type == build_tools::ProjectType::Target::Type::AggregateTarget - || target->type == build_tools::ProjectType::Target::Type::AudioUnitv3PlugIn) - continue; - - String functionName; - StringArray properties; - - switch (target->getTargetFileType()) - { - case build_tools::ProjectType::Target::TargetFileType::executable: - functionName = "add_executable"; - - if (exporter.isCodeBlocks() && exporter.isWindows() - && target->type != - build_tools::ProjectType::Target::Type::ConsoleApp) - properties.add ("WIN32"); - - break; - case build_tools::ProjectType::Target::TargetFileType::staticLibrary: - case build_tools::ProjectType::Target::TargetFileType::sharedLibraryOrDLL: - case build_tools::ProjectType::Target::TargetFileType::pluginBundle: - functionName = "add_library"; - - if (target->getTargetFileType() == - build_tools::ProjectType::Target::TargetFileType::staticLibrary) - properties.add ("STATIC"); - else if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::sharedLibraryOrDLL) - properties.add ("SHARED"); - else - properties.add ("MODULE"); - - break; - case build_tools::ProjectType::Target::TargetFileType::macOSAppex: - case build_tools::ProjectType::Target::TargetFileType::unknown: - default: - continue; - } - - out << functionName << " (" << getTargetVarName (*target); - - if (! properties.isEmpty()) - out << " " << properties.joinIntoString (" "); - - out << newLine; - - std::vector> fileInfoList; - for (auto& group : exporter.getAllGroups()) - getFileInfoList (*target, exporter, group, fileInfoList); - - for (auto& fileInfo : fileInfoList) - out << " " << std::get<0> (fileInfo).quoted() << newLine; - - auto isCMakeBundle = exporter.isXcode() - && target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle; - auto pkgInfoPath = String ("PkgInfo").quoted(); - - if (isCMakeBundle) - out << " " << pkgInfoPath << newLine; - - auto xcodeIcnsFilePath = [&]() -> String - { - if (exporter.isXcode() - && target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::executable) - { - StringArray pathComponents = { "..", "MacOSX", "Icon.icns" }; - auto xcodeIcnsFile = getTargetFolder(); - - for (auto& comp : pathComponents) - xcodeIcnsFile = xcodeIcnsFile.getChildFile (comp); - - if (xcodeIcnsFile.existsAsFile()) - return pathComponents.joinIntoString ("/").quoted(); - } - - return {}; - }(); - - if (xcodeIcnsFilePath.isNotEmpty()) - out << " " << xcodeIcnsFilePath << newLine; - - if (exporter.isCodeBlocks() - && target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::executable) - { - StringArray pathComponents = { "..", "CodeBlocksWindows", "resources.rc" }; - auto windowsRcFile = getTargetFolder(); - - for (auto& comp : pathComponents) - windowsRcFile = windowsRcFile.getChildFile (comp); - - if (windowsRcFile.existsAsFile()) - out << " " << pathComponents.joinIntoString ("/").quoted() << newLine; - } - - out << ")" << newLine << newLine; - - if (isCMakeBundle) - out << "set_source_files_properties (" << pkgInfoPath << " PROPERTIES MACOSX_PACKAGE_LOCATION .)" << newLine; - - if (xcodeIcnsFilePath.isNotEmpty()) - out << "set_source_files_properties (" << xcodeIcnsFilePath << " PROPERTIES MACOSX_PACKAGE_LOCATION \"Resources\")" << newLine; - - for (auto& fileInfo : fileInfoList) - { - if (std::get<1> (fileInfo)) - { - auto extraCompilerFlags = std::get<2> (fileInfo); - - if (extraCompilerFlags.isNotEmpty()) - out << "set_source_files_properties(" << std::get<0> (fileInfo).quoted() << " PROPERTIES COMPILE_FLAGS " << extraCompilerFlags << " )" << newLine; - } - else - { - out << "set_source_files_properties (" << std::get<0> (fileInfo).quoted() << " PROPERTIES HEADER_FILE_ONLY TRUE)" << newLine; - } - } - - out << newLine; - } - } - - //============================================================================== - void writeCMakeListsMakefileSection (OutputStream& out, MakefileProjectExporter& exporter) const - { - out << "project (" << getProject().getProjectNameString().quoted() << " C CXX)" << newLine - << newLine; - - out << "find_package (PkgConfig REQUIRED)" << newLine; - - for (auto& package : exporter.getCompilePackages()) - out << "pkg_search_module (" << package.toUpperCase() << " REQUIRED " << package << ")" << newLine; - - out << newLine; - - writeCMakeTargets (out, exporter); - - for (auto* target : exporter.targets) - { - if (target->type == build_tools::ProjectType::Target::Type::AggregateTarget) - continue; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle) - out << "set_target_properties (" << getTargetVarName (*target) << " PROPERTIES PREFIX \"\")" << newLine; - - out << "set_target_properties (" << getTargetVarName (*target) << " PROPERTIES SUFFIX \"" << target->getTargetFileSuffix() << "\")" << newLine - << newLine; - } - - for (ProjectExporter::ConstConfigIterator c (exporter); c.next();) - { - auto& config = dynamic_cast (*c); - - out << "#------------------------------------------------------------------------------" << newLine - << "# Config: " << config.getName() << newLine - << "#------------------------------------------------------------------------------" << newLine - << newLine; - - auto buildTypeCondition = String ("CMAKE_BUILD_TYPE STREQUAL " + config.getName()); - out << "if (" << buildTypeCondition << ")" << newLine - << newLine; - - out << "execute_process (COMMAND uname -m OUTPUT_VARIABLE JUCE_ARCH_LABEL OUTPUT_STRIP_TRAILING_WHITESPACE)" << newLine - << newLine; - - out << "include_directories (" << newLine; - - for (auto& path : exporter.getHeaderSearchPaths (config)) - out << " " << path.quoted() << newLine; - - for (auto& package : exporter.getCompilePackages()) - out << " ${" << package.toUpperCase() << "_INCLUDE_DIRS}" << newLine; - - out << ")" << newLine << newLine; - - StringArray cmakeFoundLibraries; - - for (auto& library : exporter.getLibraryNames (config)) - { - String cmakeLibraryID (library.toUpperCase()); - cmakeFoundLibraries.add (String ("${") + cmakeLibraryID + "}"); - out << "find_library (" << cmakeLibraryID << " " << library << newLine; - - for (auto& path : exporter.getLibrarySearchPaths (config)) - out << " " << path.quoted() << newLine; - - out << ")" << newLine - << newLine; - } - - for (auto* target : exporter.targets) - { - if (target->type == build_tools::ProjectType::Target::Type::AggregateTarget) - continue; - - auto targetVarName = getTargetVarName (*target); - - out << "set_target_properties (" << targetVarName << " PROPERTIES" << newLine - << " OUTPUT_NAME " << config.getTargetBinaryNameString().quoted() << newLine; - - auto cxxStandard = project.getCppStandardString(); - - if (cxxStandard == "latest") - cxxStandard = project.getLatestNumberedCppStandardString(); - - out << " CXX_STANDARD " << cxxStandard << newLine; - - if (! shouldUseGNUExtensions()) - out << " CXX_EXTENSIONS OFF" << newLine; - - out << ")" << newLine << newLine; - - auto defines = exporter.getDefines (config); - defines.addArray (target->getDefines (config)); - - out << "target_compile_definitions (" << targetVarName << " PRIVATE" << newLine; - - for (auto& key : defines.getAllKeys()) - out << " " << key << "=" << defines[key] << newLine; - - out << ")" << newLine << newLine; - - auto targetFlags = target->getCompilerFlags(); - - if (! targetFlags.isEmpty()) - { - out << "target_compile_options (" << targetVarName << " PRIVATE" << newLine; - - for (auto& flag : targetFlags) - out << " " << flag << newLine; - - out << ")" << newLine << newLine; - } - - out << "target_link_libraries (" << targetVarName << " PRIVATE" << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle - || target->type == build_tools::ProjectType::Target::Type::StandalonePlugIn) - out << " SHARED_CODE" << newLine; - - out << " " << exporter.getArchFlags (config) << newLine; - - for (auto& flag : target->getLinkerFlags()) - out << " " << flag << newLine; - - for (auto& flag : exporter.getLinkerFlags (config)) - out << " " << flag << newLine; - - for (auto& lib : cmakeFoundLibraries) - out << " " << lib << newLine; - - for (auto& package : exporter.getLinkPackages()) - out << " ${" << package.toUpperCase() << "_LIBRARIES}" << newLine; - - out << ")" << newLine << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle - || target->type == build_tools::ProjectType::Target::Type::StandalonePlugIn) - out << "add_dependencies (" << targetVarName << " " << "SHARED_CODE)" << newLine << newLine; - } - - StringArray cFlags; - cFlags.add (exporter.getArchFlags (config)); - cFlags.addArray (exporter.getCPreprocessorFlags (config)); - cFlags.addArray (exporter.getCFlags (config)); - out << addToCMakeVariable ("CMAKE_C_FLAGS", cFlags.joinIntoString (" ")) << newLine; - - String cxxFlags; - - for (auto& flag : exporter.getCXXFlags (config)) - if (! flag.startsWith ("-std=")) - cxxFlags += " " + flag; - - out << addToCMakeVariable ("CMAKE_CXX_FLAGS", "${CMAKE_C_FLAGS} " + cxxFlags) << newLine - << newLine; - - out << "endif (" << buildTypeCondition << ")" << newLine - << newLine; - } - } - - //============================================================================== - void writeCMakeListsCodeBlocksSection (OutputStream& out, CodeBlocksProjectExporter& exporter) const - { - out << "project (" << getProject().getProjectNameString().quoted() << " C CXX)" << newLine - << newLine; - - writeCMakeTargets (out, exporter); - - for (auto* target : exporter.targets) - { - if (target->type == build_tools::ProjectType::Target::Type::AggregateTarget) - continue; - - out << "set_target_properties (" << getTargetVarName (*target) << " PROPERTIES PREFIX \"\")" << newLine - << "set_target_properties (" << getTargetVarName (*target) << " PROPERTIES SUFFIX " << target->getTargetSuffix().quoted() << ")" << newLine - << newLine; - } - - for (ProjectExporter::ConstConfigIterator c (exporter); c.next();) - { - auto& config = dynamic_cast (*c); - - out << "#------------------------------------------------------------------------------" << newLine - << "# Config: " << config.getName() << newLine - << "#------------------------------------------------------------------------------" << newLine - << newLine; - - auto buildTypeCondition = String ("CMAKE_BUILD_TYPE STREQUAL " + config.getName()); - out << "if (" << buildTypeCondition << ")" << newLine - << newLine; - - out << "include_directories (" << newLine; - - for (auto& path : exporter.getIncludePaths (config)) - out << " " << path.replace ("\\", "/").quoted() << newLine; - - out << ")" << newLine << newLine; - - for (auto* target : exporter.targets) - { - if (target->type == build_tools::ProjectType::Target::Type::AggregateTarget) - continue; - - auto targetVarName = getTargetVarName (*target); - - out << "set_target_properties (" << targetVarName << " PROPERTIES" << newLine - << " OUTPUT_NAME " << config.getTargetBinaryNameString().quoted() << newLine; - - auto cxxStandard = project.getCppStandardString(); - - if (cxxStandard == "latest") - cxxStandard = project.getLatestNumberedCppStandardString(); - - out << " CXX_STANDARD " << cxxStandard << newLine; - - if (! shouldUseGNUExtensions()) - out << " CXX_EXTENSIONS OFF" << newLine; - - out << ")" << newLine << newLine; - - out << "target_compile_definitions (" << targetVarName << " PRIVATE" << newLine; - - for (auto& def : exporter.getDefines (config, *target)) - out << " " << def << newLine; - - out << ")" << newLine << newLine; - - out << "target_compile_options (" << targetVarName << " PRIVATE" << newLine; - - for (auto& option : exporter.getCompilerFlags (config, *target)) - if (! option.startsWith ("-std=")) - out << " " << option.quoted() << newLine; - - out << ")" << newLine << newLine; - - out << "target_link_libraries (" << targetVarName << " PRIVATE" << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle - || target->type == build_tools::ProjectType::Target::Type::StandalonePlugIn) - out << " SHARED_CODE" << newLine - << " -L." << newLine; - - for (auto& path : exporter.getLinkerSearchPaths (config, *target)) - { - out << " \"-L\\\""; - - if (! isWindowsAbsolutePath (path)) - out << "${CMAKE_CURRENT_SOURCE_DIR}/"; - - out << path.replace ("\\", "/").unquoted() << "\\\"\"" << newLine; - } - - for (auto& flag : exporter.getLinkerFlags (config, *target)) - out << " " << flag << newLine; - - for (auto& flag : exporter.getProjectLinkerLibs()) - out << " -l" << flag << newLine; - - for (auto& lib : exporter.mingwLibs) - out << " -l" << lib << newLine; - - out << ")" << newLine << newLine; - } - - out << addToCMakeVariable ("CMAKE_CXX_FLAGS", exporter.getProjectCompilerOptions().joinIntoString (" ")) << newLine - << addToCMakeVariable ("CMAKE_C_FLAGS", "${CMAKE_CXX_FLAGS}") << newLine - << newLine; - - out << "endif (" << buildTypeCondition << ")" << newLine - << newLine; - } - } - - //============================================================================== - void writeCMakeListsXcodeSection (OutputStream& out, XcodeProjectExporter& exporter) const - { - // We need to find out the SDK root before defining the project. Unfortunately this is - // set per-target in the Xcode project, but we want it per-configuration. - for (ProjectExporter::ConstConfigIterator c (exporter); c.next();) - { - auto& config = dynamic_cast (*c); - - for (auto* target : exporter.targets) - { - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::macOSAppex - || target->type == build_tools::ProjectType::Target::Type::AggregateTarget - || target->type == build_tools::ProjectType::Target::Type::AudioUnitv3PlugIn) - continue; - - auto targetAttributes = target->getTargetSettings (config); - auto targetAttributeKeys = targetAttributes.getAllKeys(); - - if (targetAttributes.getAllKeys().contains ("SDKROOT")) - { - out << "if (CMAKE_BUILD_TYPE STREQUAL " + config.getName() << ")" << newLine - << " set (CMAKE_OSX_SYSROOT " << targetAttributes["SDKROOT"] << ")" << newLine - << "endif()" << newLine << newLine; - break; - } - } - } - - out << "project (" << getProject().getProjectNameString().quoted() << " C CXX)" << newLine << newLine; - - writeCMakeTargets (out, exporter); - - for (auto* target : exporter.targets) - { - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::macOSAppex - || target->type == build_tools::ProjectType::Target::Type::AggregateTarget - || target->type == build_tools::ProjectType::Target::Type::AudioUnitv3PlugIn) - continue; - - if (target->type == build_tools::ProjectType::Target::Type::AudioUnitPlugIn) - out << "find_program (RC_COMPILER Rez NO_DEFAULT_PATHS PATHS \"/Applications/Xcode.app/Contents/Developer/usr/bin\")" << newLine - << "if (NOT RC_COMPILER)" << newLine - << " message (WARNING \"failed to find Rez; older resource-based AU plug-ins may not work correctly\")" << newLine - << "endif (NOT RC_COMPILER)" << newLine << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::staticLibrary - || target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::sharedLibraryOrDLL) - out << "set_target_properties (" << getTargetVarName (*target) << " PROPERTIES SUFFIX \"" << target->xcodeBundleExtension << "\")" << newLine - << newLine; - } - - for (ProjectExporter::ConstConfigIterator c (exporter); c.next();) - { - auto& config = dynamic_cast (*c); - - out << "#------------------------------------------------------------------------------" << newLine - << "# Config: " << config.getName() << newLine - << "#------------------------------------------------------------------------------" << newLine - << newLine; - - auto buildTypeCondition = String ("CMAKE_BUILD_TYPE STREQUAL " + config.getName()); - out << "if (" << buildTypeCondition << ")" << newLine - << newLine; - - out << "execute_process (COMMAND uname -m OUTPUT_VARIABLE JUCE_ARCH_LABEL OUTPUT_STRIP_TRAILING_WHITESPACE)" << newLine - << newLine; - - auto configSettings = exporter.getProjectSettings (config); - auto configSettingsKeys = configSettings.getAllKeys(); - - auto binaryName = config.getTargetBinaryNameString(); - - if (configSettingsKeys.contains ("PRODUCT_NAME")) - binaryName = configSettings["PRODUCT_NAME"].unquoted(); - - for (auto* target : exporter.targets) - { - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::macOSAppex - || target->type == build_tools::ProjectType::Target::Type::AggregateTarget - || target->type == build_tools::ProjectType::Target::Type::AudioUnitv3PlugIn) - continue; - - auto targetVarName = getTargetVarName (*target); - - auto targetAttributes = target->getTargetSettings (config); - auto targetAttributeKeys = targetAttributes.getAllKeys(); - - StringArray headerSearchPaths; - - if (targetAttributeKeys.contains ("HEADER_SEARCH_PATHS")) - { - auto paths = targetAttributes["HEADER_SEARCH_PATHS"].trim().substring (1).dropLastCharacters (1); - paths = paths.replace ("\"$(inherited)\"", {}) - .replace ("$(HOME)", "$ENV{HOME}") - .replace ("~", "$ENV{HOME}"); - headerSearchPaths.addTokens (paths, ",\"\t\\", {}); - headerSearchPaths.removeEmptyStrings(); - targetAttributeKeys.removeString ("HEADER_SEARCH_PATHS"); - } - - out << "target_include_directories (" << targetVarName << " PRIVATE" << newLine; - - for (auto& path : headerSearchPaths) - out << " " << path.quoted() << newLine; - - out << ")" << newLine << newLine; - - StringArray defines; - - if (targetAttributeKeys.contains ("GCC_PREPROCESSOR_DEFINITIONS")) - { - defines.addTokens (targetAttributes["GCC_PREPROCESSOR_DEFINITIONS"], "(),\t", {}); - defines.removeEmptyStrings(); - targetAttributeKeys.removeString ("GCC_PREPROCESSOR_DEFINITIONS"); - } - - out << "target_compile_definitions (" << targetVarName << " PRIVATE" << newLine; - - for (auto& def : defines) - out << " " << def.replace ("\\\\\\\"", "\\\"").replace ("\\\\ ", " ") << newLine; - - out << ")" << newLine << newLine; - - StringArray cppFlags; - - String archLabel ("${JUCE_ARCH_LABEL}"); - - // Fat binaries are not supported. - if (targetAttributeKeys.contains ("ARCHS")) - { - auto value = targetAttributes["ARCHS"].unquoted(); - - if (value.contains ("NATIVE_ARCH_ACTUAL")) - { - cppFlags.add ("-march=native"); - } - else if (value.contains ("ARCHS_STANDARD_32_BIT")) - { - archLabel = "i386"; - cppFlags.add ("-arch x86"); - } - else if (value.contains ("ARCHS_STANDARD_32_64_BIT") - || value.contains ("ARCHS_STANDARD_64_BIT")) - { - archLabel = "x86_64"; - cppFlags.add ("-arch x86_64"); - } - - targetAttributeKeys.removeString ("ARCHS"); - } - - if (targetAttributeKeys.contains ("MACOSX_DEPLOYMENT_TARGET")) - { - cppFlags.add ("-mmacosx-version-min=" + targetAttributes["MACOSX_DEPLOYMENT_TARGET"]); - targetAttributeKeys.removeString ("MACOSX_DEPLOYMENT_TARGET"); - } - - if (targetAttributeKeys.contains ("OTHER_CPLUSPLUSFLAGS")) - { - cppFlags.add (targetAttributes["OTHER_CPLUSPLUSFLAGS"].unquoted()); - targetAttributeKeys.removeString ("OTHER_CPLUSPLUSFLAGS"); - } - - if (targetAttributeKeys.contains ("GCC_OPTIMIZATION_LEVEL")) - { - cppFlags.add ("-O" + targetAttributes["GCC_OPTIMIZATION_LEVEL"]); - targetAttributeKeys.removeString ("GCC_OPTIMIZATION_LEVEL"); - } - - if (targetAttributeKeys.contains ("LLVM_LTO")) - { - cppFlags.add ("-flto"); - targetAttributeKeys.removeString ("LLVM_LTO"); - } - - if (targetAttributeKeys.contains ("GCC_FAST_MATH")) - { - cppFlags.add ("-ffast-math"); - targetAttributeKeys.removeString ("GCC_FAST_MATH"); - } - - // We'll take this setting from the project - targetAttributeKeys.removeString ("CLANG_CXX_LANGUAGE_STANDARD"); - - if (targetAttributeKeys.contains ("CLANG_CXX_LIBRARY")) - { - cppFlags.add ("-stdlib=" + targetAttributes["CLANG_CXX_LIBRARY"].unquoted()); - targetAttributeKeys.removeString ("CLANG_CXX_LIBRARY"); - } - - out << "target_compile_options (" << targetVarName << " PRIVATE" << newLine; - - for (auto& flag : cppFlags) - out << " " << flag << newLine; - - out << ")" << newLine << newLine; - - StringArray libSearchPaths; - - if (targetAttributeKeys.contains ("LIBRARY_SEARCH_PATHS")) - { - auto paths = targetAttributes["LIBRARY_SEARCH_PATHS"].trim().substring (1).dropLastCharacters (1); - paths = paths.replace ("\"$(inherited)\"", {}); - paths = paths.replace ("$(HOME)", "$ENV{HOME}"); - libSearchPaths.addTokens (paths, ",\"\t\\", {}); - libSearchPaths.removeEmptyStrings(); - - for (auto& libPath : libSearchPaths) - { - libPath = libPath.replace ("${CURRENT_ARCH}", archLabel); - - if (! isUnixAbsolutePath (libPath)) - libPath = "${CMAKE_CURRENT_SOURCE_DIR}/" + libPath; - } - - targetAttributeKeys.removeString ("LIBRARY_SEARCH_PATHS"); - } - - StringArray linkerFlags; - - if (targetAttributeKeys.contains ("OTHER_LDFLAGS")) - { - // CMake adds its own SHARED_CODE library linking flags - auto flagsWithReplacedSpaces = targetAttributes["OTHER_LDFLAGS"].unquoted().replace ("\\\\ ", "^^%%^^"); - linkerFlags.addTokens (flagsWithReplacedSpaces, true); - linkerFlags.removeString ("-bundle"); - linkerFlags.removeString ("-l" + binaryName.replace (" ", "^^%%^^")); - - for (auto& flag : linkerFlags) - flag = flag.replace ("^^%%^^", " "); - - targetAttributeKeys.removeString ("OTHER_LDFLAGS"); - } - - if (target->type == build_tools::ProjectType::Target::Type::AudioUnitPlugIn) - { - String rezFlags; - - if (targetAttributeKeys.contains ("OTHER_REZFLAGS")) - { - rezFlags = targetAttributes["OTHER_REZFLAGS"]; - targetAttributeKeys.removeString ("OTHER_REZFLAGS"); - } - - for (auto& item : exporter.getAllGroups()) - { - if (item.getName() == ProjectSaver::getJuceCodeGroupName()) - { - auto resSourcesVar = targetVarName + "_REZ_SOURCES"; - auto resOutputVar = targetVarName + "_REZ_OUTPUT"; - - auto sdkVersion = config.getMacOSBaseSDKString().upToFirstOccurrenceOf (" ", false, false); - auto sysroot = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX" + sdkVersion + ".sdk"; - - build_tools::RelativePath rFile ("JuceLibraryCode/include_juce_audio_plugin_client_AU.r", build_tools::RelativePath::projectFolder); - rFile = rebaseFromProjectFolderToBuildTarget (rFile); - - out << "if (RC_COMPILER)" << newLine - << " set (" << resSourcesVar << newLine - << " " << ("${CMAKE_CURRENT_SOURCE_DIR}/" + rFile.toUnixStyle()).quoted() << newLine - << " )" << newLine - << " set (" << resOutputVar << " " << ("${CMAKE_CURRENT_BINARY_DIR}/" + binaryName + ".rsrc").quoted() << ")" << newLine - << " target_sources (" << targetVarName << " PRIVATE" << newLine - << " ${" << resSourcesVar << "}" << newLine - << " ${" << resOutputVar << "}" << newLine - << " )" << newLine - << " execute_process (COMMAND" << newLine - << " ${RC_COMPILER}" << newLine - << " " << rezFlags.unquoted().removeCharacters ("\\") << newLine - << " -isysroot " << sysroot.quoted() << newLine; - - for (auto& path : headerSearchPaths) - { - out << " -I \""; - - if (! isUnixAbsolutePath (path)) - out << "${PROJECT_SOURCE_DIR}/"; - - out << path << "\"" << newLine; - } - - out << " ${" << resSourcesVar << "}" << newLine - << " -o ${" << resOutputVar << "}" << newLine - << " )" << newLine - << " set_source_files_properties (${" << resOutputVar << "} PROPERTIES" << newLine - << " GENERATED TRUE" << newLine - << " MACOSX_PACKAGE_LOCATION Resources" << newLine - << " )" << newLine - << "endif (RC_COMPILER)" << newLine << newLine; - break; - } - } - } - - if (targetAttributeKeys.contains ("INFOPLIST_FILE")) - { - auto plistFile = exporter.getTargetFolder().getChildFile (targetAttributes["INFOPLIST_FILE"]); - - if (auto plist = parseXML (plistFile)) - { - if (auto* dict = plist->getChildByName ("dict")) - { - if (auto* entry = dict->getChildByName ("key")) - { - while (entry != nullptr) - { - if (entry->getAllSubText() == "CFBundleExecutable") - { - if (auto* bundleName = entry->getNextElementWithTagName ("string")) - { - bundleName->deleteAllTextElements(); - bundleName->addTextElement (binaryName); - } - } - - entry = entry->getNextElementWithTagName ("key"); - } - } - } - - auto updatedPlist = getTargetFolder().getChildFile (config.getName() + "-" + plistFile.getFileName()); - - XmlElement::TextFormat format; - format.dtd = ""; - plist->writeTo (updatedPlist, format); - - targetAttributes.set ("INFOPLIST_FILE", ("${CMAKE_CURRENT_SOURCE_DIR}/" + updatedPlist.getFileName()).quoted()); - } - else - { - targetAttributeKeys.removeString ("INFOPLIST_FILE"); - } - } - - targetAttributeKeys.sort (false); - - out << "set_target_properties (" << targetVarName << " PROPERTIES" << newLine - << " OUTPUT_NAME " << binaryName.quoted() << newLine; - - auto cxxStandard = project.getCppStandardString(); - - if (cxxStandard == "latest") - cxxStandard = project.getLatestNumberedCppStandardString(); - - out << " CXX_STANDARD " << cxxStandard << newLine; - - if (! shouldUseGNUExtensions()) - out << " CXX_EXTENSIONS OFF" << newLine; - - if (targetAttributeKeys.contains ("MTL_HEADER_SEARCH_PATHS")) - { - auto pathsString = targetAttributes["MTL_HEADER_SEARCH_PATHS"].trim().substring (1).dropLastCharacters (1); - - pathsString = pathsString.replace ("\"$(inherited)\"", {}) - .replace ("$(HOME)", "$ENV{HOME}") - .replace ("~", "$ENV{HOME}"); - - auto paths = StringArray::fromTokens (pathsString, ",\"\t\\", {}); - paths.removeEmptyStrings(); - - out << " XCODE_ATTRIBUTE_MTL_HEADER_SEARCH_PATHS" << " " << paths.joinIntoString (" ").quoted() << newLine; - targetAttributeKeys.removeString ("MTL_HEADER_SEARCH_PATHS"); - } - - for (auto& key : targetAttributeKeys) - out << " XCODE_ATTRIBUTE_" << key << " " << targetAttributes[key] << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::executable - || target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle) - { - out << " MACOSX_BUNDLE_INFO_PLIST " << targetAttributes.getValue ("INFOPLIST_FILE", "\"\"") << newLine - << " XCODE_ATTRIBUTE_PRODUCT_NAME " << binaryName.quoted() << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::executable) - { - out << " MACOSX_BUNDLE TRUE" << newLine; - } - else - { - out << " BUNDLE TRUE" << newLine - << " BUNDLE_EXTENSION " << targetAttributes.getValue ("WRAPPER_EXTENSION", "\"\"") << newLine - << " XCODE_ATTRIBUTE_MACH_O_TYPE \"mh_bundle\"" << newLine; - } - } - - out << ")" << newLine << newLine; - - out << "target_link_libraries (" << targetVarName << " PRIVATE" << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle - || target->type == build_tools::ProjectType::Target::Type::StandalonePlugIn) - out << " SHARED_CODE" << newLine; - - for (auto& path : libSearchPaths) - out << " \"-L\\\"" << path << "\\\"\"" << newLine; - - for (auto& flag : linkerFlags) - out << " " << flag.quoted() << newLine; - - for (auto& framework : target->frameworkNames) - out << " \"-framework " << framework << "\"" << newLine; - - out << ")" << newLine << newLine; - - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle - || target->type == build_tools::ProjectType::Target::Type::StandalonePlugIn) - { - if (target->getTargetFileType() == build_tools::ProjectType::Target::TargetFileType::pluginBundle - && targetAttributeKeys.contains("INSTALL_PATH")) - { - auto installPath = targetAttributes["INSTALL_PATH"].unquoted().replace ("$(HOME)", "$ENV{HOME}"); - auto productFilename = binaryName + (targetAttributeKeys.contains ("WRAPPER_EXTENSION") ? "." + targetAttributes["WRAPPER_EXTENSION"] : String()); - auto productPath = (installPath + productFilename).quoted(); - out << "add_custom_command (TARGET " << targetVarName << " POST_BUILD" << newLine - << " COMMAND ${CMAKE_COMMAND} -E remove_directory " << productPath << newLine - << " COMMAND ${CMAKE_COMMAND} -E copy_directory \"${CMAKE_BINARY_DIR}/" << productFilename << "\" " << productPath << newLine - << " COMMENT \"Copying \\\"" << productFilename << "\\\" to \\\"" << installPath.unquoted() << "\\\"\"" << newLine - << ")" << newLine << newLine; - } - } - } - - std::map basicWarnings - { - { "CLANG_WARN_BOOL_CONVERSION", "bool-conversion" }, - { "CLANG_WARN_COMMA", "comma" }, - { "CLANG_WARN_CONSTANT_CONVERSION", "constant-conversion" }, - { "CLANG_WARN_EMPTY_BODY", "empty-body" }, - { "CLANG_WARN_ENUM_CONVERSION", "enum-conversion" }, - { "CLANG_WARN_INFINITE_RECURSION", "infinite-recursion" }, - { "CLANG_WARN_INT_CONVERSION", "int-conversion" }, - { "CLANG_WARN_RANGE_LOOP_ANALYSIS", "range-loop-analysis" }, - { "CLANG_WARN_STRICT_PROTOTYPES", "strict-prototypes" }, - { "GCC_WARN_CHECK_SWITCH_STATEMENTS", "switch" }, - { "GCC_WARN_UNUSED_VARIABLE", "unused-variable" }, - { "GCC_WARN_MISSING_PARENTHESES", "parentheses" }, - { "GCC_WARN_NON_VIRTUAL_DESTRUCTOR", "non-virtual-dtor" }, - { "GCC_WARN_64_TO_32_BIT_CONVERSION", "shorten-64-to-32" }, - { "GCC_WARN_UNDECLARED_SELECTOR", "undeclared-selector" }, - { "GCC_WARN_UNUSED_FUNCTION", "unused-function" } - }; - - StringArray compilerFlags; - - for (auto& key : configSettingsKeys) - { - auto basicWarning = basicWarnings.find (key); - - if (basicWarning != basicWarnings.end()) - { - compilerFlags.add (configSettings[key] == "YES" ? "-W" + basicWarning->second : "-Wno-" + basicWarning->second); - } - else if (key == "CLANG_WARN_SUSPICIOUS_MOVE" && configSettings[key] == "YES") compilerFlags.add ("-Wmove"); - else if (key == "CLANG_WARN_UNREACHABLE_CODE" && configSettings[key] == "YES") compilerFlags.add ("-Wunreachable-code"); - else if (key == "CLANG_WARN__DUPLICATE_METHOD_MATCH" && configSettings[key] == "YES") compilerFlags.add ("-Wduplicate-method-match"); - else if (key == "GCC_INLINES_ARE_PRIVATE_EXTERN" && configSettings[key] == "YES") compilerFlags.add ("-fvisibility-inlines-hidden"); - else if (key == "GCC_NO_COMMON_BLOCKS" && configSettings[key] == "YES") compilerFlags.add ("-fno-common"); - else if (key == "GCC_WARN_ABOUT_RETURN_TYPE" && configSettings[key] != "YES") compilerFlags.add (configSettings[key] == "YES_ERROR" ? "-Werror=return-type" : "-Wno-return-type"); - else if (key == "GCC_WARN_TYPECHECK_CALLS_TO_PRINTF" && configSettings[key] != "YES") compilerFlags.add ("-Wno-format"); - else if (key == "GCC_WARN_UNINITIALIZED_AUTOS") - { - if (configSettings[key] == "YES") compilerFlags.add ("-Wuninitialized"); - else if (configSettings[key] == "YES_AGGRESSIVE") compilerFlags.add ("--Wconditional-uninitialized"); - else compilerFlags.add (")-Wno-uninitialized"); - } - else if (key == "WARNING_CFLAGS") compilerFlags.add (configSettings[key].unquoted()); - } - - out << addToCMakeVariable ("CMAKE_CXX_FLAGS", compilerFlags.joinIntoString (" ")) << newLine - << addToCMakeVariable ("CMAKE_C_FLAGS", "${CMAKE_CXX_FLAGS}") << newLine - << newLine; - - out << "endif (" << buildTypeCondition << ")" << newLine - << newLine; - } - } - - //============================================================================== - JUCE_DECLARE_NON_COPYABLE (CLionProjectExporter) -}; diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h index 8a0794c5..f8359fb2 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -90,7 +90,6 @@ public: bool isCodeBlocks() const override { return true; } bool isMakefile() const override { return false; } bool isAndroidStudio() const override { return false; } - bool isCLion() const override { return false; } bool isAndroid() const override { return false; } bool isWindows() const override { return os == windowsTarget; } @@ -107,24 +106,27 @@ public: bool supportsTargetType (build_tools::ProjectType::Target::Type type) const override { + using Target = build_tools::ProjectType::Target; + switch (type) { - case build_tools::ProjectType::Target::StandalonePlugIn: - case build_tools::ProjectType::Target::GUIApp: - case build_tools::ProjectType::Target::ConsoleApp: - case build_tools::ProjectType::Target::StaticLibrary: - case build_tools::ProjectType::Target::SharedCodeTarget: - case build_tools::ProjectType::Target::AggregateTarget: - case build_tools::ProjectType::Target::VSTPlugIn: - case build_tools::ProjectType::Target::DynamicLibrary: + case Target::StandalonePlugIn: + case Target::GUIApp: + case Target::ConsoleApp: + case Target::StaticLibrary: + case Target::SharedCodeTarget: + case Target::AggregateTarget: + case Target::VSTPlugIn: + case Target::DynamicLibrary: return true; - case build_tools::ProjectType::Target::AAXPlugIn: - case build_tools::ProjectType::Target::RTASPlugIn: - case build_tools::ProjectType::Target::UnityPlugIn: - case build_tools::ProjectType::Target::VST3PlugIn: - case build_tools::ProjectType::Target::AudioUnitPlugIn: - case build_tools::ProjectType::Target::AudioUnitv3PlugIn: - case build_tools::ProjectType::Target::unspecified: + case Target::AAXPlugIn: + case Target::UnityPlugIn: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: + case Target::VST3PlugIn: + case Target::AudioUnitPlugIn: + case Target::AudioUnitv3PlugIn: + case Target::unspecified: default: break; } @@ -823,7 +825,5 @@ private: OwnedArray targets; - friend class CLionProjectExporter; - JUCE_DECLARE_NON_COPYABLE (CodeBlocksProjectExporter) }; diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h index cf4c000f..86f0a72e 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -139,8 +139,8 @@ public: aaxPathValueWrapper.init ({ settings, Ids::aaxFolder, nullptr }, getAppSettings().getStoredPath (Ids::aaxPath, TargetOS::windows), TargetOS::windows); - rtasPathValueWrapper.init ({ settings, Ids::rtasFolder, nullptr }, - getAppSettings().getStoredPath (Ids::rtasPath, TargetOS::windows), TargetOS::windows); + araPathValueWrapper.init ({ settings, Ids::araFolder, nullptr }, + getAppSettings().getStoredPath (Ids::araPath, TargetOS::windows), TargetOS::windows); } //============================================================================== @@ -167,8 +167,8 @@ public: pluginBinaryCopyStepValue (config, Ids::enablePluginBinaryCopyStep, getUndoManager(), false), vstBinaryLocation (config, Ids::vstBinaryLocation, getUndoManager()), vst3BinaryLocation (config, Ids::vst3BinaryLocation, getUndoManager()), - rtasBinaryLocation (config, Ids::rtasBinaryLocation, getUndoManager()), aaxBinaryLocation (config, Ids::aaxBinaryLocation, getUndoManager()), + lv2BinaryLocation (config, Ids::aaxBinaryLocation, getUndoManager()), unityPluginBinaryLocation (config, Ids::unityPluginBinaryLocation, getUndoManager(), {}) { setPluginBinaryCopyLocationDefaults(); @@ -186,8 +186,8 @@ public: String getPostbuildCommandString() const { return postbuildCommandValue.get(); } String getVSTBinaryLocationString() const { return vstBinaryLocation.get(); } String getVST3BinaryLocationString() const { return vst3BinaryLocation.get(); } - String getRTASBinaryLocationString() const { return rtasBinaryLocation.get();} String getAAXBinaryLocationString() const { return aaxBinaryLocation.get();} + String getLV2BinaryLocationString() const { return lv2BinaryLocation.get();} String getUnityPluginBinaryLocationString() const { return unityPluginBinaryLocation.get(); } String getIntermediatesPathString() const { return intermediatesPathValue.get(); } String getCharacterSetString() const { return characterSetValue.get(); } @@ -211,8 +211,16 @@ public: return getName() + "|" + (is64Bit() ? "x64" : "Win32"); } - String getOutputFilename (const String& suffix, bool forceSuffix, bool forceUnityPrefix) const + String getOutputFilename (const String& suffix, + bool forceSuffix, + build_tools::ProjectType::Target::Type type) const { + using Target = build_tools::ProjectType::Target::Type; + + if (type == Target::LV2TurtleProgram) + return Project::getLV2FileWriterName() + suffix; + + const auto forceUnityPrefix = type == Target::UnityPlugIn; auto target = File::createLegalFileName (getTargetBinaryNameString (forceUnityPrefix).trim()); if (forceSuffix || ! target.containsChar ('.')) @@ -323,14 +331,14 @@ public: intermediatesPathValue, characterSetValue, architectureTypeValue, fastMathValue, debugInformationFormatValue, pluginBinaryCopyStepValue; - ValueTreePropertyWithDefault vstBinaryLocation, vst3BinaryLocation, rtasBinaryLocation, aaxBinaryLocation, unityPluginBinaryLocation; + ValueTreePropertyWithDefault vstBinaryLocation, vst3BinaryLocation, aaxBinaryLocation, lv2BinaryLocation, unityPluginBinaryLocation; Value architectureValueToListenTo; //============================================================================== void addVisualStudioPluginInstallPathProperties (PropertyListBuilder& props) { - auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildRTAS() + auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildAAX() || project.shouldBuildUnityPlugin()); if (isBuildingAnyPlugins) @@ -342,16 +350,16 @@ public: 1024, false), "The folder in which the compiled VST3 binary should be placed."); - if (project.shouldBuildRTAS()) - props.add (new TextPropertyComponentWithEnablement (rtasBinaryLocation, pluginBinaryCopyStepValue, "RTAS Binary Location", - 1024, false), - "The folder in which the compiled RTAS binary should be placed."); - if (project.shouldBuildAAX()) props.add (new TextPropertyComponentWithEnablement (aaxBinaryLocation, pluginBinaryCopyStepValue, "AAX Binary Location", 1024, false), "The folder in which the compiled AAX binary should be placed."); + if (project.shouldBuildLV2()) + props.add (new TextPropertyComponentWithEnablement (lv2BinaryLocation, pluginBinaryCopyStepValue, "LV2 Binary Location", + 1024, false), + "The folder in which the compiled LV2 binary should be placed."); + if (project.shouldBuildUnityPlugin()) props.add (new TextPropertyComponentWithEnablement (unityPluginBinaryLocation, pluginBinaryCopyStepValue, "Unity Binary Location", 1024, false), @@ -372,8 +380,8 @@ public: : "%CommonProgramFiles(x86)%"; vst3BinaryLocation.setDefault (prefix + String ("\\VST3")); - rtasBinaryLocation.setDefault (prefix + String ("\\Digidesign\\DAE\\Plug-Ins")); aaxBinaryLocation.setDefault (prefix + String ("\\Avid\\Audio\\Plug-Ins")); + lv2BinaryLocation.setDefault ("%APPDATA%\\LV2"); } void valueChanged (Value&) override @@ -520,7 +528,7 @@ public: { auto* targetName = props->createNewChildElement ("TargetName"); setConditionAttribute (*targetName, config); - targetName->addTextElement (msBuildEscape (config.getOutputFilename ("", false, type == UnityPlugIn))); + targetName->addTextElement (msBuildEscape (config.getOutputFilename ("", false, type))); } { @@ -546,6 +554,22 @@ public: { auto& config = dynamic_cast (*i); + enum class EscapeQuotes { no, yes }; + + // VS doesn't correctly escape double quotes in preprocessor definitions, so we have + // to add our own layer of escapes + const auto addIncludePathsAndPreprocessorDefinitions = [this, &config] (XmlElement& xml, EscapeQuotes escapeQuotes) + { + auto includePaths = getOwner().getHeaderSearchPaths (config); + includePaths.add ("%(AdditionalIncludeDirectories)"); + xml.createNewChildElement ("AdditionalIncludeDirectories")->addTextElement (includePaths.joinIntoString (";")); + + const auto preprocessorDefs = getPreprocessorDefs (config, ";") + ";%(PreprocessorDefinitions)"; + const auto preprocessorDefsEscaped = escapeQuotes == EscapeQuotes::yes ? preprocessorDefs.replace ("\"", "\\\"") + : preprocessorDefs; + xml.createNewChildElement ("PreprocessorDefinitions")->addTextElement (preprocessorDefsEscaped); + }; + bool isDebug = config.isDebug(); auto* group = projectXml.createNewChildElement ("ItemDefinitionGroup"); @@ -562,7 +586,7 @@ public: } bool isUsingEditAndContinue = false; - const auto pdbFilename = getOwner().getIntDirFile (config, config.getOutputFilename (".pdb", true, type == UnityPlugIn)); + const auto pdbFilename = getOwner().getIntDirFile (config, config.getOutputFilename (".pdb", true, type)); { auto* cl = group->createNewChildElement ("ClCompile"); @@ -572,15 +596,10 @@ public: if (isDebug || config.shouldGenerateDebugSymbols()) { cl->createNewChildElement ("DebugInformationFormat") - ->addTextElement (config.getDebugInformationFormatString()); + ->addTextElement (config.getDebugInformationFormatString()); } - auto includePaths = getOwner().getHeaderSearchPaths (config); - includePaths.addArray (getExtraSearchPaths()); - includePaths.add ("%(AdditionalIncludeDirectories)"); - - cl->createNewChildElement ("AdditionalIncludeDirectories")->addTextElement (includePaths.joinIntoString (";")); - cl->createNewChildElement ("PreprocessorDefinitions")->addTextElement (getPreprocessorDefs (config, ";") + ";%(PreprocessorDefinitions)"); + addIncludePathsAndPreprocessorDefinitions (*cl, EscapeQuotes::no); cl->createNewChildElement ("RuntimeLibrary")->addTextElement (config.isUsingRuntimeLibDLL() ? (isDebug ? "MultiThreadedDebugDLL" : "MultiThreadedDLL") : (isDebug ? "MultiThreadedDebug" : "MultiThreaded")); @@ -609,29 +628,28 @@ public: { auto* res = group->createNewChildElement ("ResourceCompile"); - res->createNewChildElement ("PreprocessorDefinitions")->addTextElement (isDebug ? "_DEBUG;%(PreprocessorDefinitions)" - : "NDEBUG;%(PreprocessorDefinitions)"); + addIncludePathsAndPreprocessorDefinitions (*res, EscapeQuotes::yes); } auto externalLibraries = getExternalLibraries (config, getOwner().getExternalLibrariesStringArray()); - auto additionalDependencies = type != SharedCodeTarget && ! externalLibraries.isEmpty() + auto additionalDependencies = type != SharedCodeTarget && type != LV2TurtleProgram && ! externalLibraries.isEmpty() ? externalLibraries.joinIntoString (";") + ";%(AdditionalDependencies)" : String(); auto librarySearchPaths = config.getLibrarySearchPaths(); - auto additionalLibraryDirs = type != SharedCodeTarget && librarySearchPaths.size() > 0 + auto additionalLibraryDirs = type != SharedCodeTarget && type != LV2TurtleProgram && librarySearchPaths.size() > 0 ? getOwner().replacePreprocessorTokens (config, librarySearchPaths.joinIntoString (";")) + ";%(AdditionalLibraryDirectories)" : String(); { auto* link = group->createNewChildElement ("Link"); - link->createNewChildElement ("OutputFile")->addTextElement (getOutputFilePath (config, type == UnityPlugIn)); + link->createNewChildElement ("OutputFile")->addTextElement (getOutputFilePath (config)); link->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true"); link->createNewChildElement ("IgnoreSpecificDefaultLibraries")->addTextElement (isDebug ? "libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries)" : "%(IgnoreSpecificDefaultLibraries)"); link->createNewChildElement ("GenerateDebugInformation")->addTextElement ((isDebug || config.shouldGenerateDebugSymbols()) ? "true" : "false"); link->createNewChildElement ("ProgramDatabaseFile")->addTextElement (pdbFilename); - link->createNewChildElement ("SubSystem")->addTextElement (type == ConsoleApp ? "Console" : "Windows"); + link->createNewChildElement ("SubSystem")->addTextElement (type == ConsoleApp || type == LV2TurtleProgram ? "Console" : "Windows"); if (! config.is64Bit()) link->createNewChildElement ("TargetMachine")->addTextElement ("MachineX86"); @@ -661,7 +679,7 @@ public: link->createNewChildElement ("AdditionalOptions")->addTextElement (getOwner().replacePreprocessorTokens (config, extraLinkerOptions).trim() + " %(AdditionalOptions)"); - auto delayLoadedDLLs = getDelayLoadedDLLs(); + auto delayLoadedDLLs = getOwner().msvcDelayLoadedDLLs; if (delayLoadedDLLs.isNotEmpty()) link->createNewChildElement ("DelayLoadDLLs")->addTextElement (delayLoadedDLLs); @@ -674,10 +692,10 @@ public: { auto* bsc = group->createNewChildElement ("Bscmake"); bsc->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true"); - bsc->createNewChildElement ("OutputFile")->addTextElement (getOwner().getIntDirFile (config, config.getOutputFilename (".bsc", true, type == UnityPlugIn))); + bsc->createNewChildElement ("OutputFile")->addTextElement (getOwner().getIntDirFile (config, config.getOutputFilename (".bsc", true, type))); } - if (type != SharedCodeTarget) + if (type != SharedCodeTarget && type != LV2TurtleProgram) { auto* lib = group->createNewChildElement ("Lib"); @@ -732,6 +750,12 @@ public: if (group.getNumChildren() > 0) addFilesToCompile (group, *cppFiles, *headerFiles, *otherFilesGroup); } + + if (type == LV2TurtleProgram) + { + cppFiles->createNewChildElement ("ClCompile") + ->setAttribute ("Include", owner.getLV2TurtleDumpProgramSource().toWindowsStyle()); + } } if (getOwner().iconFile.existsAsFile()) @@ -862,9 +886,6 @@ public: auto* e = cpps.createNewChildElement ("ClCompile"); e->setAttribute ("Include", path.toWindowsStyle()); - if (shouldUseStdCall (path)) - e->createNewChildElement ("CallingConvention")->addTextElement ("StdCall"); - if (projectItem.shouldBeCompiled()) { auto extraCompilerFlags = owner.compilerFlagSchemesMap[projectItem.getCompilerFlagSchemeString()].get().toString(); @@ -1062,8 +1083,12 @@ public: String getConfigTargetPath (const BuildConfiguration& config) const { - auto solutionTargetFolder = getSolutionTargetPath (config); - return solutionTargetFolder + "\\" + getName(); + const auto result = getSolutionTargetPath (config) + "\\" + getName(); + + if (type == LV2PlugIn) + return result + "\\" + config.getTargetBinaryNameString() + ".lv2"; + + return result; } String getIntermediatesPath (const MSVCBuildConfiguration& config) const @@ -1100,7 +1125,6 @@ public: { if (type == VST3PlugIn) return ".vst3"; if (type == AAXPlugIn) return ".aaxdll"; - if (type == RTASPlugIn) return ".dpm"; return ".dll"; } @@ -1108,13 +1132,6 @@ public: return {}; } - XmlElement* createToolElement (XmlElement& parent, const String& toolName) const - { - auto* e = parent.createNewChildElement ("Tool"); - e->setAttribute ("Name", toolName); - return e; - } - String getPreprocessorDefs (const BuildConfiguration& config, const String& joinString) const { auto defines = getOwner().msvcExtraPreprocessorDefs; @@ -1175,13 +1192,13 @@ public: build_tools::RelativePath bundleScript = aaxSDK.getChildFile ("Utilities").getChildFile ("CreatePackage.bat"); build_tools::RelativePath iconFilePath = getAAXIconFile(); - auto outputFilename = config.getOutputFilename (".aaxplugin", true, false); + auto outputFilename = config.getOutputFilename (".aaxplugin", true, type); auto bundleDir = getOwner().getOutDirFile (config, outputFilename); auto bundleContents = bundleDir + "\\Contents"; auto archDir = bundleContents + String ("\\") + (config.is64Bit() ? "x64" : "Win32"); auto executablePath = archDir + String ("\\") + outputFilename; - auto pkgScript = String ("copy /Y ") + getOutputFilePath (config, false).quoted() + String (" ") + executablePath.quoted() + String ("\r\ncall ") + auto pkgScript = String ("copy /Y ") + getOutputFilePath (config).quoted() + String (" ") + executablePath.quoted() + String ("\r\ncall ") + createRebasedPath (bundleScript) + String (" ") + archDir.quoted() + String (" ") + createRebasedPath (iconFilePath); if (config.isPluginBinaryCopyStepEnabled()) @@ -1190,11 +1207,12 @@ public: return pkgScript; } - else if (type == UnityPlugIn) + + if (type == UnityPlugIn) { build_tools::RelativePath scriptPath (config.project.getGeneratedCodeFolder().getChildFile (config.project.getUnityScriptName()), - getOwner().getTargetFolder(), - build_tools::RelativePath::projectFolder); + getOwner().getTargetFolder(), + build_tools::RelativePath::projectFolder); auto pkgScript = String ("copy /Y ") + scriptPath.toWindowsStyle().quoted() + " \"$(OutDir)\""; @@ -1208,13 +1226,40 @@ public: return pkgScript; } - else if (config.isPluginBinaryCopyStepEnabled()) + + if (type == LV2PlugIn) + { + const auto* writerTarget = [&]() -> MSVCTargetBase* + { + for (auto* target : owner.targets) + if (target->type == LV2TurtleProgram) + return target; + + return nullptr; + }(); + + const auto writer = writerTarget->getConfigTargetPath (config) + + "\\" + + writerTarget->getBinaryNameWithSuffix (config); + + const auto copyScript = [&]() -> String + { + if (! config.isPluginBinaryCopyStepEnabled()) + return ""; + + return "xcopy /E /H /I /K /R /Y \"$(OutDir)\" \"" + config.getLV2BinaryLocationString() + + '\\' + config.getTargetBinaryNameString() + ".lv2\"\r\n"; + }(); + + return writer.quoted() + " \"$(OutDir)$(TargetFileName)\"\r\n" + copyScript; + } + + if (config.isPluginBinaryCopyStepEnabled()) { auto copyScript = String ("copy /Y \"$(OutDir)$(TargetFileName)\"") + String (" \"$COPYDIR$\\$(TargetFileName)\""); if (type == VSTPlugIn) return copyScript.replace ("$COPYDIR$", config.getVSTBinaryLocationString()); if (type == VST3PlugIn) return copyScript.replace ("$COPYDIR$", config.getVST3BinaryLocationString()); - if (type == RTASPlugIn) return copyScript.replace ("$COPYDIR$", config.getRTASBinaryLocationString()); } return {}; @@ -1226,7 +1271,7 @@ public: { String script; - auto bundleDir = getOwner().getOutDirFile (config, config.getOutputFilename (".aaxplugin", false, false)); + auto bundleDir = getOwner().getOutDirFile (config, config.getOutputFilename (".aaxplugin", false, type)); auto bundleContents = bundleDir + "\\Contents"; auto archDir = bundleContents + String ("\\") + (config.is64Bit() ? "x64" : "Win32"); @@ -1262,77 +1307,23 @@ public: auto aaxLibsFolder = build_tools::RelativePath (owner.getAAXPathString(), build_tools::RelativePath::projectFolder).getChildFile ("Libs"); defines.set ("JucePlugin_AAXLibs_path", createRebasedPath (aaxLibsFolder)); } - else if (type == RTASPlugIn) - { - build_tools::RelativePath rtasFolder (owner.getRTASPathString(), build_tools::RelativePath::projectFolder); - defines.set ("JucePlugin_WinBag_path", createRebasedPath (rtasFolder.getChildFile ("WinBag"))); - } - } - - String getExtraLinkerFlags() const - { - if (type == RTASPlugIn) - return "/FORCE:multiple"; - - return {}; - } - - StringArray getExtraSearchPaths() const - { - StringArray searchPaths; - if (type == RTASPlugIn) - { - build_tools::RelativePath rtasFolder (owner.getRTASPathString(), build_tools::RelativePath::projectFolder); - - static const char* p[] = { "AlturaPorts/TDMPlugins/PluginLibrary/EffectClasses", - "AlturaPorts/TDMPlugins/PluginLibrary/ProcessClasses", - "AlturaPorts/TDMPlugins/PluginLibrary/ProcessClasses/Interfaces", - "AlturaPorts/TDMPlugins/PluginLibrary/Utilities", - "AlturaPorts/TDMPlugins/PluginLibrary/RTASP_Adapt", - "AlturaPorts/TDMPlugins/PluginLibrary/CoreClasses", - "AlturaPorts/TDMPlugins/PluginLibrary/Controls", - "AlturaPorts/TDMPlugins/PluginLibrary/Meters", - "AlturaPorts/TDMPlugins/PluginLibrary/ViewClasses", - "AlturaPorts/TDMPlugins/PluginLibrary/DSPClasses", - "AlturaPorts/TDMPlugins/PluginLibrary/Interfaces", - "AlturaPorts/TDMPlugins/common", - "AlturaPorts/TDMPlugins/common/Platform", - "AlturaPorts/TDMPlugins/common/Macros", - "AlturaPorts/TDMPlugins/SignalProcessing/Public", - "AlturaPorts/TDMPlugIns/DSPManager/Interfaces", - "AlturaPorts/SADriver/Interfaces", - "AlturaPorts/DigiPublic/Interfaces", - "AlturaPorts/DigiPublic", - "AlturaPorts/Fic/Interfaces/DAEClient", - "AlturaPorts/NewFileLibs/Cmn", - "AlturaPorts/NewFileLibs/DOA", - "AlturaPorts/AlturaSource/PPC_H", - "AlturaPorts/AlturaSource/AppSupport", - "AvidCode/AVX2sdk/AVX/avx2/avx2sdk/inc", - "xplat/AVX/avx2/avx2sdk/inc" }; - - for (auto* path : p) - searchPaths.add (createRebasedPath (rtasFolder.getChildFile (path))); - } - - return searchPaths; } - String getBinaryNameWithSuffix (const MSVCBuildConfiguration& config, bool forceUnityPrefix) const + String getBinaryNameWithSuffix (const MSVCBuildConfiguration& config) const { - return config.getOutputFilename (getTargetSuffix(), true, forceUnityPrefix); + return config.getOutputFilename (getTargetSuffix(), true, type); } - String getOutputFilePath (const MSVCBuildConfiguration& config, bool forceUnityPrefix) const + String getOutputFilePath (const MSVCBuildConfiguration& config) const { - return getOwner().getOutDirFile (config, getBinaryNameWithSuffix (config, forceUnityPrefix)); + return getOwner().getOutDirFile (config, getBinaryNameWithSuffix (config)); } StringArray getLibrarySearchPaths (const BuildConfiguration& config) const { auto librarySearchPaths = config.getLibrarySearchPaths(); - if (type != SharedCodeTarget) + if (type != SharedCodeTarget && type != LV2TurtleProgram) if (auto* shared = getOwner().getSharedCodeTarget()) librarySearchPaths.add (shared->getConfigTargetPath (config)); @@ -1355,24 +1346,13 @@ public: result.addArray (msBuildEscape (getOwner().getModuleLibs())); - if (type != SharedCodeTarget) + if (type != SharedCodeTarget && type != LV2TurtleProgram) if (auto* shared = getOwner().getSharedCodeTarget()) - result.add (msBuildEscape (shared->getBinaryNameWithSuffix (config, false))); + result.add (msBuildEscape (shared->getBinaryNameWithSuffix (config))); return result; } - String getDelayLoadedDLLs() const - { - auto delayLoadedDLLs = getOwner().msvcDelayLoadedDLLs; - - if (type == RTASPlugIn) - delayLoadedDLLs += "DAE.dll; DigiExt.dll; DSI.dll; PluginLib.dll; " - "DSPManager.dll; DSPManager.dll; DSPManagerClientLib.dll; RTASClientLib.dll"; - - return delayLoadedDLLs; - } - String getModuleDefinitions (const MSVCBuildConfiguration& config) const { auto moduleDefinitions = config.config [Ids::msvcModuleDefinitionFile].toString(); @@ -1380,19 +1360,6 @@ public: if (moduleDefinitions.isNotEmpty()) return moduleDefinitions; - if (type == RTASPlugIn) - { - auto& exp = getOwner(); - - auto moduleDefPath - = build_tools::RelativePath (exp.getPathForModuleString ("juce_audio_plugin_client"), build_tools::RelativePath::projectFolder) - .getChildFile ("juce_audio_plugin_client").getChildFile ("RTAS").getChildFile ("juce_RTAS_WinExports.def"); - - return prependDot (moduleDefPath.rebased (exp.getProject().getProjectFolder(), - exp.getTargetFolder(), - build_tools::RelativePath::buildTargetFolder).toWindowsStyle()); - } - return {}; } @@ -1433,7 +1400,6 @@ public: bool isCodeBlocks() const override { return false; } bool isMakefile() const override { return false; } bool isAndroidStudio() const override { return false; } - bool isCLion() const override { return false; } bool isAndroid() const override { return false; } bool isWindows() const override { return true; } @@ -1447,24 +1413,27 @@ public: bool supportsTargetType (build_tools::ProjectType::Target::Type type) const override { + using Target = build_tools::ProjectType::Target; + switch (type) { - case build_tools::ProjectType::Target::StandalonePlugIn: - case build_tools::ProjectType::Target::GUIApp: - case build_tools::ProjectType::Target::ConsoleApp: - case build_tools::ProjectType::Target::StaticLibrary: - case build_tools::ProjectType::Target::SharedCodeTarget: - case build_tools::ProjectType::Target::AggregateTarget: - case build_tools::ProjectType::Target::VSTPlugIn: - case build_tools::ProjectType::Target::VST3PlugIn: - case build_tools::ProjectType::Target::AAXPlugIn: - case build_tools::ProjectType::Target::RTASPlugIn: - case build_tools::ProjectType::Target::UnityPlugIn: - case build_tools::ProjectType::Target::DynamicLibrary: + case Target::StandalonePlugIn: + case Target::GUIApp: + case Target::ConsoleApp: + case Target::StaticLibrary: + case Target::SharedCodeTarget: + case Target::AggregateTarget: + case Target::VSTPlugIn: + case Target::VST3PlugIn: + case Target::AAXPlugIn: + case Target::UnityPlugIn: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: + case Target::DynamicLibrary: return true; - case build_tools::ProjectType::Target::AudioUnitPlugIn: - case build_tools::ProjectType::Target::AudioUnitv3PlugIn: - case build_tools::ProjectType::Target::unspecified: + case Target::AudioUnitPlugIn: + case Target::AudioUnitv3PlugIn: + case Target::unspecified: default: break; } @@ -1646,14 +1615,11 @@ protected: return getCleanedStringArray (searchPaths); } - String getSharedCodeGuid() const + String getTargetGuid (MSVCTargetBase::Type type) const { - String sharedCodeGuid; - - for (int i = 0; i < targets.size(); ++i) - if (auto* target = targets[i]) - if (target->type == build_tools::ProjectType::Target::SharedCodeTarget) - return target->getProjectGuid(); + for (auto* target : targets) + if (target != nullptr && target->type == type) + return target->getProjectGuid(); return {}; } @@ -1661,7 +1627,8 @@ protected: //============================================================================== void writeProjectDependencies (OutputStream& out) const { - auto sharedCodeGuid = getSharedCodeGuid(); + const auto sharedCodeGuid = getTargetGuid (MSVCTargetBase::SharedCodeTarget); + const auto turtleGuid = getTargetGuid (MSVCTargetBase::LV2TurtleProgram); for (int addingOtherTargets = 0; addingOtherTargets < (sharedCodeGuid.isNotEmpty() ? 2 : 1); ++addingOtherTargets) { @@ -1669,16 +1636,24 @@ protected: { if (auto* target = targets[i]) { - if (sharedCodeGuid.isEmpty() || (addingOtherTargets != 0) == (target->type != build_tools::ProjectType::Target::StandalonePlugIn)) + if (sharedCodeGuid.isEmpty() || (addingOtherTargets != 0) == (target->type != MSVCTargetBase::StandalonePlugIn)) { out << "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"" << projectName << " - " << target->getName() << "\", \"" << target->getVCProjFile().getFileName() << "\", \"" << target->getProjectGuid() << '"' << newLine; - if (sharedCodeGuid.isNotEmpty() && target->type != build_tools::ProjectType::Target::SharedCodeTarget) + if (sharedCodeGuid.isNotEmpty() + && target->type != MSVCTargetBase::SharedCodeTarget + && target->type != MSVCTargetBase::LV2TurtleProgram) + { out << "\tProjectSection(ProjectDependencies) = postProject" << newLine - << "\t\t" << sharedCodeGuid << " = " << sharedCodeGuid << newLine - << "\tEndProjectSection" << newLine; + << "\t\t" << sharedCodeGuid << " = " << sharedCodeGuid << newLine; + + if (target->type == MSVCTargetBase::LV2PlugIn && turtleGuid.isNotEmpty()) + out << "\t\t" << turtleGuid << " = " << turtleGuid << newLine; + + out << "\tEndProjectSection" << newLine; + } out << "EndProject" << newLine; } @@ -1788,14 +1763,12 @@ protected: : (".\\" + filename); } - static bool shouldUseStdCall (const build_tools::RelativePath& path) - { - return path.getFileNameWithoutExtension().startsWithIgnoreCase ("include_juce_audio_plugin_client_RTAS_"); - } - static bool shouldAddBigobjFlag (const build_tools::RelativePath& path) { - return path.getFileNameWithoutExtension().equalsIgnoreCase ("include_juce_gui_basics"); + const auto name = path.getFileNameWithoutExtension(); + + return name.equalsIgnoreCase ("include_juce_gui_basics") + || name.equalsIgnoreCase ("include_juce_audio_processors"); } StringArray getModuleLibs() const @@ -1811,51 +1784,6 @@ protected: JUCE_DECLARE_NON_COPYABLE (MSVCProjectExporterBase) }; -//============================================================================== -class MSVCProjectExporterVC2015 : public MSVCProjectExporterBase -{ -public: - MSVCProjectExporterVC2015 (Project& p, const ValueTree& t) - : MSVCProjectExporterBase (p, t, getTargetFolderName()) - { - name = getDisplayName(); - - targetPlatformVersion.setDefault (getDefaultWindowsTargetPlatformVersion()); - platformToolsetValue.setDefault (getDefaultToolset()); - } - - static String getDisplayName() { return "Visual Studio 2015"; } - static String getValueTreeTypeName() { return "VS2015"; } - static String getTargetFolderName() { return "VisualStudio2015"; } - - Identifier getExporterIdentifier() const override { return getValueTreeTypeName(); } - - int getVisualStudioVersion() const override { return 14; } - String getSolutionComment() const override { return "# Visual Studio 14"; } - String getToolsVersion() const override { return "14.0"; } - String getDefaultToolset() const override { return "v140"; } - String getDefaultWindowsTargetPlatformVersion() const override { return "8.1"; } - - static MSVCProjectExporterVC2015* createForSettings (Project& projectToUse, const ValueTree& settingsToUse) - { - if (settingsToUse.hasType (getValueTreeTypeName())) - return new MSVCProjectExporterVC2015 (projectToUse, settingsToUse); - - return nullptr; - } - - void createExporterProperties (PropertyListBuilder& props) override - { - static const char* toolsetNames[] = { "v140", "v140_xp", "CTP_Nov2013" }; - const var toolsets[] = { "v140", "v140_xp", "CTP_Nov2013" }; - addToolsetProperty (props, toolsetNames, toolsets, numElementsInArray (toolsets)); - - MSVCProjectExporterBase::createExporterProperties (props); - } - - JUCE_DECLARE_NON_COPYABLE (MSVCProjectExporterVC2015) -}; - //============================================================================== class MSVCProjectExporterVC2017 : public MSVCProjectExporterBase { diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h index 49f22ea5..2efff415 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -40,6 +40,7 @@ protected: pluginBinaryCopyStepValue (config, Ids::enablePluginBinaryCopyStep, getUndoManager(), true), vstBinaryLocation (config, Ids::vstBinaryLocation, getUndoManager(), "$(HOME)/.vst"), vst3BinaryLocation (config, Ids::vst3BinaryLocation, getUndoManager(), "$(HOME)/.vst3"), + lv2BinaryLocation (config, Ids::lv2BinaryLocation, getUndoManager(), "$(HOME)/.lv2"), unityPluginBinaryLocation (config, Ids::unityPluginBinaryLocation, getUndoManager(), "$(HOME)/UnityPlugins") { linkTimeOptimisationValue.setDefault (false); @@ -57,7 +58,7 @@ protected: "Specifies the 32/64-bit architecture to use. If you don't see the required architecture in this list, you can also specify the desired " "flag on the command-line when invoking make by passing \"TARGET_ARCH=-march=\""); - auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildUnityPlugin()); + auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildUnityPlugin() || project.shouldBuildLV2()); if (isBuildingAnyPlugins) { @@ -69,6 +70,11 @@ protected: 1024, false), "The folder in which the compiled VST3 binary should be placed."); + if (project.shouldBuildLV2()) + props.add (new TextPropertyComponentWithEnablement (lv2BinaryLocation, pluginBinaryCopyStepValue, "LV2 Binary Location", + 1024, false), + "The folder in which the compiled LV2 binary should be placed."); + if (project.shouldBuildUnityPlugin()) props.add (new TextPropertyComponentWithEnablement (unityPluginBinaryLocation, pluginBinaryCopyStepValue, "Unity Binary Location", 1024, false), @@ -103,12 +109,13 @@ protected: bool isPluginBinaryCopyStepEnabled() const { return pluginBinaryCopyStepValue.get(); } String getVSTBinaryLocationString() const { return vstBinaryLocation.get(); } String getVST3BinaryLocationString() const { return vst3BinaryLocation.get(); } + String getLV2BinaryLocationString() const { return lv2BinaryLocation.get(); } String getUnityPluginBinaryLocationString() const { return unityPluginBinaryLocation.get(); } private: //============================================================================== ValueTreePropertyWithDefault architectureTypeValue, pluginBinaryCopyStepValue, - vstBinaryLocation, vst3BinaryLocation, unityPluginBinaryLocation; + vstBinaryLocation, vst3BinaryLocation, lv2BinaryLocation, unityPluginBinaryLocation; }; BuildConfiguration::Ptr createBuildConfig (const ValueTree& tree) const override @@ -209,10 +216,20 @@ public: s.add ("JUCE_UNITYDIR := Unity"); targetName = "$(JUCE_UNITYDIR)/" + targetName; } + else if (type == LV2PlugIn) + { + s.add ("JUCE_LV2DIR := " + targetName + ".lv2"); + targetName = "$(JUCE_LV2DIR)/" + targetName + ".so"; + } + else if (type == LV2TurtleProgram) + { + targetName = Project::getLV2FileWriterName(); + } s.add ("JUCE_TARGET_" + getTargetVarName() + String (" := ") + escapeQuotesAndSpaces (targetName)); - if (config.isPluginBinaryCopyStepEnabled() && (type == VST3PlugIn || type == VSTPlugIn || type == UnityPlugIn)) + if (config.isPluginBinaryCopyStepEnabled() + && (type == VST3PlugIn || type == VSTPlugIn || type == UnityPlugIn || type == LV2PlugIn)) { String copyCmd ("JUCE_COPYCMD_" + getTargetVarName() + String (" := $(JUCE_OUTDIR)/")); @@ -231,6 +248,12 @@ public: s.add ("JUCE_UNITYDESTDIR := " + config.getUnityPluginBinaryLocationString()); s.add (copyCmd + "$(JUCE_UNITYDIR)/. $(JUCE_UNITYDESTDIR)"); } + else if (type == LV2PlugIn) + { + s.add ("JUCE_LV2DESTDIR := " + config.getLV2BinaryLocationString()); + s.add ("JUCE_LV2_FULL_PATH := $(JUCE_OUTDIR)/$(JUCE_TARGET_LV2_PLUGIN)"); + s.add (copyCmd + "$(JUCE_LV2DIR) $(JUCE_LV2DESTDIR)"); + } } return s; @@ -289,6 +312,9 @@ public: String getPhonyName() const { + if (type == LV2TurtleProgram) + return "LV2_MANIFEST_HELPER"; + return String (getName()).upToFirstOccurrenceOf (" ", false, false); } @@ -302,12 +328,15 @@ public: if (type != SharedCodeTarget && owner.shouldBuildTargetType (SharedCodeTarget)) out << " $(JUCE_OUTDIR)/$(JUCE_TARGET_SHARED_CODE)"; + if (type == LV2PlugIn) + out << " $(JUCE_OUTDIR)/$(JUCE_TARGET_LV2_MANIFEST_HELPER)"; + out << newLine; if (! packages.isEmpty()) { - out << "\t@command -v pkg-config >/dev/null 2>&1 || { echo >&2 \"pkg-config not installed. Please, install it.\"; exit 1; }" << newLine - << "\t@pkg-config --print-errors"; + out << "\t@command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 \"pkg-config not installed. Please, install it.\"; exit 1; }" << newLine + << "\t@$(PKG_CONFIG) --print-errors"; for (auto& pkg : packages) out << " " << pkg; @@ -324,6 +353,8 @@ public: out << "\t-$(V_AT)mkdir -p $(JUCE_OUTDIR)/$(JUCE_VST3DIR)/$(JUCE_VST3SUBDIR)" << newLine; else if (type == UnityPlugIn) out << "\t-$(V_AT)mkdir -p $(JUCE_OUTDIR)/$(JUCE_UNITYDIR)" << newLine; + else if (type == LV2PlugIn) + out << "\t-$(V_AT)mkdir -p $(JUCE_OUTDIR)/$(JUCE_LV2DIR)" << newLine; if (owner.projectType.isStaticLibrary() || type == SharedCodeTarget) { @@ -369,6 +400,13 @@ public: << "\t-$(V_AT)mkdir -p $(JUCE_UNITYDESTDIR)" << newLine << "\t-$(V_AT)cp -R $(JUCE_COPYCMD_UNITY_PLUGIN)" << newLine; } + else if (type == LV2PlugIn) + { + out << "\t$(V_AT) $(JUCE_OUTDIR)/$(JUCE_TARGET_LV2_MANIFEST_HELPER) " + "$(abspath $(JUCE_LV2_FULL_PATH))" << newLine + << "\t-$(V_AT)mkdir -p $(JUCE_LV2DESTDIR)" << newLine + << "\t-$(V_AT)cp -R $(JUCE_COPYCMD_LV2_PLUGIN)" << newLine; + } out << newLine; } @@ -412,7 +450,6 @@ public: bool isCodeBlocks() const override { return false; } bool isMakefile() const override { return true; } bool isAndroidStudio() const override { return false; } - bool isCLion() const override { return false; } bool isAndroid() const override { return false; } bool isWindows() const override { return false; } @@ -424,24 +461,27 @@ public: bool supportsTargetType (build_tools::ProjectType::Target::Type type) const override { + using Target = build_tools::ProjectType::Target; + switch (type) { - case build_tools::ProjectType::Target::GUIApp: - case build_tools::ProjectType::Target::ConsoleApp: - case build_tools::ProjectType::Target::StaticLibrary: - case build_tools::ProjectType::Target::SharedCodeTarget: - case build_tools::ProjectType::Target::AggregateTarget: - case build_tools::ProjectType::Target::VSTPlugIn: - case build_tools::ProjectType::Target::VST3PlugIn: - case build_tools::ProjectType::Target::StandalonePlugIn: - case build_tools::ProjectType::Target::DynamicLibrary: - case build_tools::ProjectType::Target::UnityPlugIn: + case Target::GUIApp: + case Target::ConsoleApp: + case Target::StaticLibrary: + case Target::SharedCodeTarget: + case Target::AggregateTarget: + case Target::VSTPlugIn: + case Target::VST3PlugIn: + case Target::StandalonePlugIn: + case Target::DynamicLibrary: + case Target::UnityPlugIn: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: return true; - case build_tools::ProjectType::Target::AAXPlugIn: - case build_tools::ProjectType::Target::RTASPlugIn: - case build_tools::ProjectType::Target::AudioUnitPlugIn: - case build_tools::ProjectType::Target::AudioUnitv3PlugIn: - case build_tools::ProjectType::Target::unspecified: + case Target::AAXPlugIn: + case Target::AudioUnitPlugIn: + case Target::AudioUnitv3PlugIn: + case Target::unspecified: default: break; } @@ -562,7 +602,7 @@ private: auto compilePackages = getCompilePackages(); if (compilePackages.size() > 0) - return "$(shell pkg-config --cflags " + compilePackages.joinIntoString (" ") + ")"; + return "$(shell $(PKG_CONFIG) --cflags " + compilePackages.joinIntoString (" ") + ")"; return {}; } @@ -572,7 +612,7 @@ private: auto linkPackages = getLinkPackages(); if (linkPackages.size() > 0) - return "$(shell pkg-config --libs " + linkPackages.joinIntoString (" ") + ")"; + return "$(shell $(PKG_CONFIG) --libs " + linkPackages.joinIntoString (" ") + ")"; return {}; } @@ -935,6 +975,11 @@ private: << "DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD)" << newLine << newLine; + out << "ifndef PKG_CONFIG" << newLine + << " PKG_CONFIG=pkg-config" << newLine + << "endif" << newLine + << newLine; + out << "ifndef STRIP" << newLine << " STRIP=strip" << newLine << "endif" << newLine @@ -963,9 +1008,9 @@ private: writeCompilerFlagSchemes (out, filesToCompile); - auto getFilesForTarget = [] (const Array>& files, - MakefileTarget* target, - const Project& p) -> Array> + auto getFilesForTarget = [this] (const Array>& files, + MakefileTarget* target, + const Project& p) -> Array> { Array> targetFiles; @@ -975,6 +1020,9 @@ private: if (p.getTargetTypeFromFilePath (f.first, true) == targetType) targetFiles.add (f); + if (targetType == MakefileTarget::LV2TurtleProgram) + targetFiles.add ({ project.resolveFilename (getLV2TurtleDumpProgramSource().toUnixStyle()), {} }); + return targetFiles; }; @@ -1032,8 +1080,6 @@ private: return phonyTargetLine.toString(); } - friend class CLionProjectExporter; - OwnedArray targets; JUCE_DECLARE_NON_COPYABLE (MakefileProjectExporter) diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h index 7723b12c..a00aceb9 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -248,7 +248,6 @@ public: bool isCodeBlocks() const override { return false; } bool isMakefile() const override { return false; } bool isAndroidStudio() const override { return false; } - bool isCLion() const override { return false; } bool isAndroid() const override { return false; } bool isWindows() const override { return false; } @@ -267,25 +266,28 @@ public: bool supportsTargetType (build_tools::ProjectType::Target::Type type) const override { + using Target = build_tools::ProjectType::Target; + switch (type) { - case build_tools::ProjectType::Target::AudioUnitv3PlugIn: - case build_tools::ProjectType::Target::StandalonePlugIn: - case build_tools::ProjectType::Target::GUIApp: - case build_tools::ProjectType::Target::StaticLibrary: - case build_tools::ProjectType::Target::DynamicLibrary: - case build_tools::ProjectType::Target::SharedCodeTarget: - case build_tools::ProjectType::Target::AggregateTarget: + case Target::AudioUnitv3PlugIn: + case Target::StandalonePlugIn: + case Target::GUIApp: + case Target::StaticLibrary: + case Target::DynamicLibrary: + case Target::SharedCodeTarget: + case Target::AggregateTarget: return true; - case build_tools::ProjectType::Target::ConsoleApp: - case build_tools::ProjectType::Target::VSTPlugIn: - case build_tools::ProjectType::Target::VST3PlugIn: - case build_tools::ProjectType::Target::AAXPlugIn: - case build_tools::ProjectType::Target::RTASPlugIn: - case build_tools::ProjectType::Target::AudioUnitPlugIn: - case build_tools::ProjectType::Target::UnityPlugIn: + case Target::ConsoleApp: + case Target::VSTPlugIn: + case Target::VST3PlugIn: + case Target::AAXPlugIn: + case Target::AudioUnitPlugIn: + case Target::UnityPlugIn: + case Target::LV2PlugIn: + case Target::LV2TurtleProgram: return ! iOS; - case build_tools::ProjectType::Target::unspecified: + case Target::unspecified: default: break; } @@ -671,7 +673,7 @@ public: if (iOS) props.add (new TextPropertyComponentWithEnablement (iosAppGroupsIDValue, iosAppGroupsValue, "App Group ID", 256, false), "The App Group ID to be used for allowing multiple apps to access a shared resource folder. Multiple IDs can be " - "added separated by a semicolon."); + "added separated by a semicolon. The App Groups Capability setting must be enabled for this setting to have any effect."); props.add (new ChoicePropertyComponent (keepCustomXcodeSchemesValue, "Keep Custom Xcode Schemes"), "Enable this to keep any Xcode schemes you have created for debugging or running, e.g. to launch a plug-in in" @@ -753,7 +755,7 @@ public: { String alertWindowText = iOS ? "Your Xcode (iOS) Exporter settings use an invalid post-build script. Click 'Update' to remove it." : "Your Xcode (macOS) Exporter settings use a pre-JUCE 4.2 post-build script to move the plug-in binaries to their plug-in install folders.\n\n" - "Since JUCE 4.2, this is instead done using \"AU/VST/VST2/AAX/RTAS Binary Location\" in the Xcode (OS X) configuration settings.\n\n" + "Since JUCE 4.2, this is instead done using \"AU/VST/VST2/AAX Binary Location\" in the Xcode (OS X) configuration settings.\n\n" "Click 'Update' to remove the script (otherwise your plug-in may not compile correctly)."; if (AlertWindow::showOkCancelBox (MessageBoxIconType::WarningIcon, @@ -778,8 +780,8 @@ public: aaxPathValueWrapper.init ({ settings, Ids::aaxFolder, nullptr }, getAppSettings().getStoredPath (Ids::aaxPath, TargetOS::osx), TargetOS::osx); - rtasPathValueWrapper.init ({ settings, Ids::rtasFolder, nullptr }, - getAppSettings().getStoredPath (Ids::rtasPath, TargetOS::osx), TargetOS::osx); + araPathValueWrapper.init ({ settings, Ids::araFolder, nullptr }, + getAppSettings().getStoredPath (Ids::araPath, TargetOS::osx), TargetOS::osx); } protected: @@ -805,9 +807,9 @@ protected: vstBinaryLocation (config, Ids::vstBinaryLocation, getUndoManager(), "$(HOME)/Library/Audio/Plug-Ins/VST/"), vst3BinaryLocation (config, Ids::vst3BinaryLocation, getUndoManager(), "$(HOME)/Library/Audio/Plug-Ins/VST3/"), auBinaryLocation (config, Ids::auBinaryLocation, getUndoManager(), "$(HOME)/Library/Audio/Plug-Ins/Components/"), - rtasBinaryLocation (config, Ids::rtasBinaryLocation, getUndoManager(), "/Library/Application Support/Digidesign/Plug-Ins/"), aaxBinaryLocation (config, Ids::aaxBinaryLocation, getUndoManager(), "/Library/Application Support/Avid/Audio/Plug-Ins/"), - unityPluginBinaryLocation (config, Ids::unityPluginBinaryLocation, getUndoManager()) + unityPluginBinaryLocation (config, Ids::unityPluginBinaryLocation, getUndoManager()), + lv2BinaryLocation (config, Ids::lv2BinaryLocation, getUndoManager(), "$(HOME)/Library/Audio/Plug-Ins/LV2/") { updateOldPluginBinaryLocations(); updateOldSDKDefaults(); @@ -900,9 +902,9 @@ protected: String getVSTBinaryLocationString() const { return vstBinaryLocation.get(); } String getVST3BinaryLocationString() const { return vst3BinaryLocation.get(); } String getAUBinaryLocationString() const { return auBinaryLocation.get(); } - String getRTASBinaryLocationString() const { return rtasBinaryLocation.get();} String getAAXBinaryLocationString() const { return aaxBinaryLocation.get();} String getUnityPluginBinaryLocationString() const { return unityPluginBinaryLocation.get(); } + String getLV2PluginBinaryLocationString() const { return lv2BinaryLocation.get(); } private: //============================================================================== @@ -911,8 +913,8 @@ protected: ValueTreePropertyWithDefault macOSBaseSDK, macOSDeploymentTarget, macOSArchitecture, iosBaseSDK, iosDeploymentTarget, customXcodeFlags, plistPreprocessorDefinitions, codeSignIdentity, fastMathEnabled, stripLocalSymbolsEnabled, pluginBinaryCopyStepEnabled, - vstBinaryLocation, vst3BinaryLocation, auBinaryLocation, rtasBinaryLocation, - aaxBinaryLocation, unityPluginBinaryLocation; + vstBinaryLocation, vst3BinaryLocation, auBinaryLocation, + aaxBinaryLocation, unityPluginBinaryLocation, lv2BinaryLocation; //============================================================================== void valueTreePropertyChanged (ValueTree&, const Identifier& property) override @@ -938,7 +940,7 @@ protected: void addXcodePluginInstallPathProperties (PropertyListBuilder& props) { auto isBuildingAnyPlugins = (project.shouldBuildVST() || project.shouldBuildVST3() || project.shouldBuildAU() - || project.shouldBuildRTAS() || project.shouldBuildAAX() || project.shouldBuildUnityPlugin()); + || project.shouldBuildAAX() || project.shouldBuildUnityPlugin()); if (isBuildingAnyPlugins) props.add (new ChoicePropertyComponent (pluginBinaryCopyStepEnabled, "Enable Plugin Copy Step"), @@ -954,16 +956,16 @@ protected: 1024, false), "The folder in which the compiled AU binary should be placed."); - if (project.shouldBuildRTAS()) - props.add (new TextPropertyComponentWithEnablement (rtasBinaryLocation, pluginBinaryCopyStepEnabled, "RTAS Binary Location", - 1024, false), - "The folder in which the compiled RTAS binary should be placed."); - if (project.shouldBuildAAX()) props.add (new TextPropertyComponentWithEnablement (aaxBinaryLocation, pluginBinaryCopyStepEnabled, "AAX Binary Location", 1024, false), "The folder in which the compiled AAX binary should be placed."); + if (project.shouldBuildLV2()) + props.add (new TextPropertyComponentWithEnablement (lv2BinaryLocation, pluginBinaryCopyStepEnabled, "LV2 Binary Location", + 1024, false), + "The folder in which the compiled LV2 binary should be placed."); + if (project.shouldBuildUnityPlugin()) props.add (new TextPropertyComponentWithEnablement (unityPluginBinaryLocation, pluginBinaryCopyStepEnabled, "Unity Binary Location", 1024, false), @@ -980,7 +982,6 @@ protected: if (! config ["xcodeVstBinaryLocation"].isVoid()) vstBinaryLocation = config ["xcodeVstBinaryLocation"]; if (! config ["xcodeVst3BinaryLocation"].isVoid()) vst3BinaryLocation = config ["xcodeVst3BinaryLocation"]; if (! config ["xcodeAudioUnitBinaryLocation"].isVoid()) auBinaryLocation = config ["xcodeAudioUnitBinaryLocation"]; - if (! config ["xcodeRtasBinaryLocation"].isVoid()) rtasBinaryLocation = config ["xcodeRtasBinaryLocation"]; if (! config ["xcodeAaxBinaryLocation"].isVoid()) aaxBinaryLocation = config ["xcodeAaxBinaryLocation"]; } @@ -1048,6 +1049,7 @@ public: break; case ConsoleApp: + case LV2TurtleProgram: xcodeFileType = "compiled.mach-o.executable"; xcodeBundleExtension = String(); xcodeProductType = "com.apple.product-type.tool"; @@ -1115,17 +1117,17 @@ public: xcodeCopyToProductInstallPathAfterBuild = true; break; - case RTASPlugIn: + case UnityPlugIn: xcodeFileType = "wrapper.cfbundle"; - xcodeBundleExtension = ".dpm"; + xcodeBundleExtension = ".bundle"; xcodeProductType = "com.apple.product-type.bundle"; xcodeCopyToProductInstallPathAfterBuild = true; break; - case UnityPlugIn: - xcodeFileType = "wrapper.cfbundle"; - xcodeBundleExtension = ".bundle"; - xcodeProductType = "com.apple.product-type.bundle"; + case LV2PlugIn: + xcodeFileType = "compiled.mach-o.executable"; + xcodeProductType = "com.apple.product-type.tool"; + xcodeBundleExtension = ".so"; xcodeCopyToProductInstallPathAfterBuild = true; break; @@ -1180,43 +1182,6 @@ public: String mainBuildProductID; File infoPlistFile; - struct SourceFileInfo - { - build_tools::RelativePath path; - bool shouldBeCompiled = false; - }; - - Array getSourceFilesInfo (const Project::Item& projectItem) const - { - Array result; - - auto targetType = (owner.getProject().isAudioPluginProject() ? type : SharedCodeTarget); - - if (projectItem.isGroup()) - { - for (int i = 0; i < projectItem.getNumChildren(); ++i) - result.addArray (getSourceFilesInfo (projectItem.getChild (i))); - } - else if (projectItem.shouldBeAddedToTargetProject() && projectItem.shouldBeAddedToTargetExporter (owner) - && owner.getProject().getTargetTypeFromFilePath (projectItem.getFile(), true) == targetType) - { - SourceFileInfo info; - - info.path = build_tools::RelativePath (projectItem.getFile(), - owner.getTargetFolder(), - build_tools::RelativePath::buildTargetFolder); - - jassert (info.path.getRoot() == build_tools::RelativePath::buildTargetFolder); - - if (targetType == SharedCodeTarget || projectItem.shouldBeCompiled()) - info.shouldBeCompiled = projectItem.shouldBeCompiled(); - - result.add (info); - } - - return result; - } - //============================================================================== void addMainBuildProduct() const { @@ -1225,12 +1190,18 @@ public: if (ProjectExporter::BuildConfiguration::Ptr config = owner.getConfiguration (0)) { - auto productName = owner.replacePreprocessorTokens (*config, config->getTargetBinaryNameString (type == UnityPlugIn)); + const auto productName = [&]() -> String + { + const auto binaryName = owner.replacePreprocessorTokens (*config, config->getTargetBinaryNameString (type == UnityPlugIn)); - if (xcodeFileType == "archive.ar") - productName = getStaticLibbedFilename (productName); - else - productName += xcodeBundleExtension; + if (xcodeFileType == "archive.ar") + return getStaticLibbedFilename (binaryName); + + if (type == LV2TurtleProgram) + return Project::getLV2FileWriterName(); + + return binaryName + xcodeBundleExtension; + }(); addBuildProduct (xcodeFileType, productName); } @@ -1281,6 +1252,18 @@ public: if (target->type != XcodeTarget::AggregateTarget) dependencyIDs.add (target->addDependencyFor (*this)); } + else if (type == XcodeTarget::LV2PlugIn) + { + if (auto* helperTarget = owner.getTargetOfType (XcodeTarget::LV2TurtleProgram)) + dependencyIDs.add (helperTarget->addDependencyFor (*this)); + + if (auto* sharedCodeTarget = owner.getTargetOfType (XcodeTarget::SharedCodeTarget)) + dependencyIDs.add (sharedCodeTarget->addDependencyFor (*this)); + } + else if (type == XcodeTarget::LV2TurtleProgram) + { + // No thanks + } else if (type != XcodeTarget::SharedCodeTarget) // shared code doesn't depend on anything; all other targets depend only on the shared code { if (auto* sharedCodeTarget = owner.getTargetOfType (XcodeTarget::SharedCodeTarget)) @@ -1436,6 +1419,27 @@ public: return mergePreprocessorDefs (defines, owner.getAllPreprocessorDefs (config, type)); } + String getConfigurationBuildDir (const XcodeBuildConfiguration& config) const + { + const String configurationBuildDir ("$(PROJECT_DIR)/build/$(CONFIGURATION)"); + + if (config.getTargetBinaryRelativePathString().isEmpty()) + return configurationBuildDir; + + // a target's position can either be defined via installPath + xcodeCopyToProductInstallPathAfterBuild + // (= for audio plug-ins) or using a custom binary path (for everything else), but not both (= conflict!) + jassert (! xcodeCopyToProductInstallPathAfterBuild); + + build_tools::RelativePath binaryPath (config.getTargetBinaryRelativePathString(), + build_tools::RelativePath::projectFolder); + + return expandPath (binaryPath.rebased (owner.projectFolder, + owner.getTargetFolder(), + build_tools::RelativePath::buildTargetFolder).toUnixStyle()); + } + + String getLV2BundleName() const { return owner.project.getPluginNameString() + ".lv2"; } + //============================================================================== StringPairArray getTargetSettings (const XcodeBuildConfiguration& config) const { @@ -1451,7 +1455,15 @@ public: return s; } - s.set ("PRODUCT_NAME", owner.replacePreprocessorTokens (config, config.getTargetBinaryNameString (type == UnityPlugIn)).quoted()); + const auto productName = [&] + { + if (type == LV2TurtleProgram) + return Project::getLV2FileWriterName().quoted(); + + return owner.replacePreprocessorTokens (config, config.getTargetBinaryNameString (type == UnityPlugIn)).quoted(); + }(); + + s.set ("PRODUCT_NAME", productName); s.set ("PRODUCT_BUNDLE_IDENTIFIER", getBundleIdentifier()); auto arch = (! owner.isiOS() && type == Target::AudioUnitv3PlugIn) ? macOSArch_64Bit @@ -1577,6 +1589,7 @@ public: s.set ("GCC_FAST_MATH", "YES"); auto recommendedWarnings = config.getRecommendedCompilerWarningFlags(); + recommendedWarnings.common.addArray (recommendedWarnings.objc); recommendedWarnings.cpp.addArray (recommendedWarnings.common); struct XcodeWarningFlags @@ -1605,7 +1618,7 @@ public: { s.set ("INSTALL_PATH", installPath.quoted()); - if (type == Target::SharedCodeTarget) + if (type == Target::SharedCodeTarget || type == Target::LV2PlugIn) s.set ("SKIP_INSTALL", "YES"); if (! owner.embeddedFrameworkIDs.isEmpty()) @@ -1628,24 +1641,11 @@ public: if (xcodeOtherRezFlags.isNotEmpty()) s.set ("OTHER_REZFLAGS", "\"" + xcodeOtherRezFlags + "\""); - String configurationBuildDir ("$(PROJECT_DIR)/build/$(CONFIGURATION)"); - - if (config.getTargetBinaryRelativePathString().isNotEmpty()) - { - // a target's position can either be defined via installPath + xcodeCopyToProductInstallPathAfterBuild - // (= for audio plug-ins) or using a custom binary path (for everything else), but not both (= conflict!) - jassert (! xcodeCopyToProductInstallPathAfterBuild); - - build_tools::RelativePath binaryPath (config.getTargetBinaryRelativePathString(), - build_tools::RelativePath::projectFolder); + const auto configurationBuildDir = getConfigurationBuildDir (config); + const auto adjustedConfigBuildDir = type == LV2PlugIn ? configurationBuildDir + "/" + getLV2BundleName() + : configurationBuildDir; - configurationBuildDir = expandPath (binaryPath.rebased (owner.projectFolder, - owner.getTargetFolder(), - build_tools::RelativePath::buildTargetFolder) - .toUnixStyle()); - } - - s.set ("CONFIGURATION_BUILD_DIR", addQuotesIfRequired (configurationBuildDir)); + s.set ("CONFIGURATION_BUILD_DIR", addQuotesIfRequired (adjustedConfigBuildDir)); if (owner.isHardenedRuntimeEnabled()) s.set ("ENABLE_HARDENED_RUNTIME", "YES"); @@ -1703,10 +1703,17 @@ public: StringArray linkerFlags, librarySearchPaths; getLinkerSettings (config, linkerFlags, librarySearchPaths); + for (const auto& weakFramework : owner.xcodeWeakFrameworks) + linkerFlags.add ("-weak_framework " + weakFramework); + if (linkerFlags.size() > 0) s.set ("OTHER_LDFLAGS", linkerFlags.joinIntoString (" ").quoted()); librarySearchPaths.addArray (config.getLibrarySearchPaths()); + + if (type == LV2PlugIn) + librarySearchPaths.add (configurationBuildDir); + librarySearchPaths = getCleanedStringArray (librarySearchPaths); if (librarySearchPaths.size() > 0) @@ -1778,11 +1785,12 @@ public: case VSTPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getVSTBinaryLocationString() : String(); case VST3PlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getVST3BinaryLocationString() : String(); case AudioUnitPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getAUBinaryLocationString() : String(); - case RTASPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getRTASBinaryLocationString() : String(); case AAXPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getAAXBinaryLocationString() : String(); case UnityPlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getUnityPluginBinaryLocationString() : String(); + case LV2PlugIn: return config.isPluginBinaryCopyStepEnabled() ? config.getLV2PluginBinaryLocationString() : String(); case SharedCodeTarget: return owner.isiOS() ? "@executable_path/Frameworks" : "@executable_path/../Frameworks"; case StaticLibrary: + case LV2TurtleProgram: case DynamicLibrary: case AudioUnitv3PlugIn: case StandalonePlugIn: @@ -1798,7 +1806,7 @@ public: if (getTargetFileType() == pluginBundle) flags.add (owner.isiOS() ? "-bitcode_bundle" : "-bundle"); - if (type != Target::SharedCodeTarget) + if (type != Target::SharedCodeTarget && type != Target::LV2TurtleProgram) { Array extraLibs; @@ -1898,6 +1906,7 @@ public: options.isAuSandboxSafe = owner.project.isAUSandBoxSafe(); options.isPluginSynth = owner.project.isPluginSynth(); options.suppressResourceUsage = owner.getSuppressPlistResourceUsage(); + options.isPluginARAEffect = owner.project.shouldEnableARA(); options.write (infoPlistFile); } @@ -1945,7 +1954,6 @@ public: { StringArray paths (owner.extraSearchPaths); paths.addArray (config.getHeaderSearchPaths()); - paths.addArray (getTargetExtraHeaderSearchPaths()); if (owner.project.getEnabledModules().isModuleEnabled ("juce_audio_plugin_client")) { @@ -1997,61 +2005,6 @@ public: extraLibs.add (aaxLibsFolder.getChildFile (libraryPath)); } - else if (type == RTASPlugIn) - { - build_tools::RelativePath rtasFolder (owner.getRTASPathString(), build_tools::RelativePath::projectFolder); - - extraLibs.add (rtasFolder.getChildFile ("MacBag/Libs/Debug/libPluginLibrary.a")); - extraLibs.add (rtasFolder.getChildFile ("MacBag/Libs/Release/libPluginLibrary.a")); - } - } - - StringArray getTargetExtraHeaderSearchPaths() const - { - StringArray targetExtraSearchPaths; - - if (type == RTASPlugIn) - { - build_tools::RelativePath rtasFolder (owner.getRTASPathString(), build_tools::RelativePath::projectFolder); - - targetExtraSearchPaths.add ("$(DEVELOPER_DIR)/Headers/FlatCarbon"); - targetExtraSearchPaths.add ("$(SDKROOT)/Developer/Headers/FlatCarbon"); - - static const char* p[] = { "AlturaPorts/TDMPlugIns/PlugInLibrary/Controls", - "AlturaPorts/TDMPlugIns/PlugInLibrary/CoreClasses", - "AlturaPorts/TDMPlugIns/PlugInLibrary/DSPClasses", - "AlturaPorts/TDMPlugIns/PlugInLibrary/EffectClasses", - "AlturaPorts/TDMPlugIns/PlugInLibrary/MacBuild", - "AlturaPorts/TDMPlugIns/PlugInLibrary/Meters", - "AlturaPorts/TDMPlugIns/PlugInLibrary/ProcessClasses", - "AlturaPorts/TDMPlugIns/PlugInLibrary/ProcessClasses/Interfaces", - "AlturaPorts/TDMPlugIns/PlugInLibrary/RTASP_Adapt", - "AlturaPorts/TDMPlugIns/PlugInLibrary/Utilities", - "AlturaPorts/TDMPlugIns/PlugInLibrary/ViewClasses", - "AlturaPorts/TDMPlugIns/DSPManager/**", - "AlturaPorts/TDMPlugIns/SupplementalPlugInLib/Encryption", - "AlturaPorts/TDMPlugIns/SupplementalPlugInLib/GraphicsExtensions", - "AlturaPorts/TDMPlugIns/common/**", - "AlturaPorts/TDMPlugIns/common/PI_LibInterface", - "AlturaPorts/TDMPlugIns/PACEProtection/**", - "AlturaPorts/TDMPlugIns/SignalProcessing/**", - "AlturaPorts/OMS/Headers", - "AlturaPorts/Fic/Interfaces/**", - "AlturaPorts/Fic/Source/SignalNets", - "AlturaPorts/DSIPublicInterface/PublicHeaders", - "DAEWin/Include", - "AlturaPorts/DigiPublic/Interfaces", - "AlturaPorts/DigiPublic", - "AlturaPorts/NewFileLibs/DOA", - "AlturaPorts/NewFileLibs/Cmn", - "xplat/AVX/avx2/avx2sdk/inc", - "xplat/AVX/avx2/avx2sdk/utils" }; - - for (auto* path : p) - owner.addProjectPathToBuildPathList (targetExtraSearchPaths, rtasFolder.getChildFile (path)); - } - - return targetExtraSearchPaths; } //============================================================================== @@ -2061,6 +2014,7 @@ public: }; mutable StringArray xcodeFrameworks; + mutable StringArray xcodeWeakFrameworks; StringArray xcodeLibs; private: @@ -2144,6 +2098,18 @@ private: target->addMainBuildProduct(); + if (target->type == XcodeTarget::LV2TurtleProgram + && project.getEnabledModules().isModuleEnabled ("juce_audio_plugin_client")) + { + const auto path = getLV2TurtleDumpProgramSource(); + addFile (FileOptions().withRelativePath ({ expandPath (path.toUnixStyle()), path.getRoot() }) + .withSkipPCHEnabled (true) + .withCompilationEnabled (true) + .withInhibitWarningsEnabled (true) + .withCompilerFlags ("-std=c++11") + .withXcodeTarget (target)); + } + auto targetName = String (target->getName()); auto fileID = createID (targetName + "__targetbuildref"); auto fileRefID = createID ("__productFileID" + targetName); @@ -2292,7 +2258,10 @@ private: { auto skipAUv3 = (target->type == XcodeTarget::AudioUnitv3PlugIn && ! shouldDuplicateAppExResourcesFolder()); - if (! projectType.isStaticLibrary() && target->type != XcodeTarget::SharedCodeTarget && ! skipAUv3) + if (! projectType.isStaticLibrary() + && target->type != XcodeTarget::SharedCodeTarget + && target->type != XcodeTarget::LV2TurtleProgram + && ! skipAUv3) target->addBuildPhase ("PBXResourcesBuildPhase", resourceIDs); auto rezFiles = rezFileIDs; @@ -2309,10 +2278,35 @@ private: target->addBuildPhase ("PBXSourcesBuildPhase", sourceFiles); - if (! projectType.isStaticLibrary() && target->type != XcodeTarget::SharedCodeTarget) + if (! projectType.isStaticLibrary() + && target->type != XcodeTarget::SharedCodeTarget + && target->type != XcodeTarget::LV2TurtleProgram) target->addBuildPhase ("PBXFrameworksBuildPhase", target->frameworkIDs); } + if (target->type == XcodeTarget::LV2PlugIn) + { + auto script = "set -e\n\"$CONFIGURATION_BUILD_DIR/../" + + Project::getLV2FileWriterName() + + "\" \"$CONFIGURATION_BUILD_DIR/$PRODUCT_NAME\"\n"; + + for (ConstConfigIterator config (*this); config.next();) + { + auto& xcodeConfig = dynamic_cast (*config); + const auto installPath = target->getInstallPathForConfiguration (xcodeConfig); + + if (installPath.isNotEmpty()) + { + script << "if [ \"$CONFIGURATION\" = \"" << config->getName() + << "\" ]; then\n /bin/ln -sfh \"$CONFIGURATION_BUILD_DIR\" \"" + << installPath.replace ("$(HOME)", "$HOME") << '/' << target->getLV2BundleName() + << "\"\nfi\n"; + } + } + + target->addShellScriptBuildPhase ("Generate manifest", script); + } + target->addShellScriptBuildPhase ("Post-build script", getPostBuildScript()); if (project.isAudioPluginProject() && project.shouldBuildAUv3() @@ -3398,7 +3392,7 @@ private: { std::map attributes; - attributes["LastUpgradeCheck"] = "1320"; + attributes["LastUpgradeCheck"] = "1340"; attributes["ORGANIZATIONNAME"] = getProject().getCompanyNameString().quoted(); if (projectType.isGUIApplication() || projectType.isAudioPlugin()) @@ -3563,8 +3557,6 @@ private: } //============================================================================== - friend class CLionProjectExporter; - bool xcodeCanUseDwarf; OwnedArray targets; diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp index 5f00efbe..a1e08a5e 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -33,8 +33,6 @@ #include "jucer_ProjectExport_Android.h" #include "jucer_ProjectExport_CodeBlocks.h" -#include "jucer_ProjectExport_CLion.h" - #include "../Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h" //============================================================================== @@ -76,7 +74,6 @@ std::vector ProjectExporter::getExporterTypeI createExporterTypeInfo (export_visualStudio_svg, export_visualStudio_svgSize), createExporterTypeInfo (export_visualStudio_svg, export_visualStudio_svgSize), createExporterTypeInfo (export_visualStudio_svg, export_visualStudio_svgSize), - createExporterTypeInfo (export_visualStudio_svg, export_visualStudio_svgSize), createExporterTypeInfo (export_linux_svg, export_linux_svgSize), @@ -89,9 +86,7 @@ std::vector ProjectExporter::getExporterTypeI { CodeBlocksProjectExporter::getValueTreeTypeNameLinux(), CodeBlocksProjectExporter::getDisplayNameLinux(), CodeBlocksProjectExporter::getTargetFolderNameLinux(), - createIcon (export_codeBlocks_svg, export_codeBlocks_svgSize) }, - - createExporterTypeInfo (export_clion_svg, export_clion_svgSize) + createIcon (export_codeBlocks_svg, export_codeBlocks_svgSize) } }; return infos; @@ -159,11 +154,9 @@ std::unique_ptr ProjectExporter::createExporterFromSettings (Pr Tag{}, Tag{}, Tag{}, - Tag{}, Tag{}, Tag{}, - Tag{}, - Tag{}); + Tag{}); } bool ProjectExporter::canProjectBeLaunched (Project* project) @@ -179,7 +172,6 @@ bool ProjectExporter::canProjectBeLaunched (Project* project) MSVCProjectExporterVC2022::getValueTreeTypeName(), MSVCProjectExporterVC2019::getValueTreeTypeName(), MSVCProjectExporterVC2017::getValueTreeTypeName(), - MSVCProjectExporterVC2015::getValueTreeTypeName(), #endif AndroidProjectExporter::getValueTreeTypeName() }; @@ -259,60 +251,57 @@ void ProjectExporter::updateCompilerFlagValues() //============================================================================== void ProjectExporter::createPropertyEditors (PropertyListBuilder& props) { - if (! isCLion()) - { - props.add (new TextPropertyComponent (targetLocationValue, "Target Project Folder", 2048, false), - "The location of the folder in which the " + name + " project will be created. " - "This path can be absolute, but it's much more sensible to make it relative to the jucer project directory."); + props.add (new TextPropertyComponent (targetLocationValue, "Target Project Folder", 2048, false), + "The location of the folder in which the " + name + " project will be created. " + "This path can be absolute, but it's much more sensible to make it relative to the jucer project directory."); - if ((shouldBuildTargetType (build_tools::ProjectType::Target::VSTPlugIn) && project.shouldBuildVST()) || (project.isVSTPluginHost() && supportsTargetType (build_tools::ProjectType::Target::VSTPlugIn))) - { - props.add (new FilePathPropertyComponent (vstLegacyPathValueWrapper.getWrappedValueTreePropertyWithDefault(), "VST (Legacy) SDK Folder", true, - getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()), - "If you're building a VST plug-in or host, you can use this field to override the global VST (Legacy) SDK path with a project-specific path. " - "This can be an absolute path, or a path relative to the Projucer project file."); - } + if ((shouldBuildTargetType (build_tools::ProjectType::Target::VSTPlugIn) && project.shouldBuildVST()) || (project.isVSTPluginHost() && supportsTargetType (build_tools::ProjectType::Target::VSTPlugIn))) + { + props.add (new FilePathPropertyComponent (vstLegacyPathValueWrapper.getWrappedValueTreePropertyWithDefault(), "VST (Legacy) SDK Folder", true, + getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()), + "If you're building a VST plug-in or host, you can use this field to override the global VST (Legacy) SDK path with a project-specific path. " + "This can be an absolute path, or a path relative to the Projucer project file."); + } - if (shouldBuildTargetType (build_tools::ProjectType::Target::AAXPlugIn) && project.shouldBuildAAX()) - { - props.add (new FilePathPropertyComponent (aaxPathValueWrapper.getWrappedValueTreePropertyWithDefault(), "AAX SDK Folder", true, - getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()), - "If you're building an AAX plug-in, this must be the folder containing the AAX SDK. This can be an absolute path, or a path relative to the Projucer project file."); - } + if (shouldBuildTargetType (build_tools::ProjectType::Target::AAXPlugIn) && project.shouldBuildAAX()) + { + props.add (new FilePathPropertyComponent (aaxPathValueWrapper.getWrappedValueTreePropertyWithDefault(), "AAX SDK Folder", true, + getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()), + "If you're building an AAX plug-in, this must be the folder containing the AAX SDK. This can be an absolute path, or a path relative to the Projucer project file."); + } - if (shouldBuildTargetType (build_tools::ProjectType::Target::RTASPlugIn) && project.shouldBuildRTAS()) - { - props.add (new FilePathPropertyComponent (rtasPathValueWrapper.getWrappedValueTreePropertyWithDefault(), "RTAS SDK Folder", true, - getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()), - "If you're building an RTAS plug-in, this must be the folder containing the RTAS SDK. This can be an absolute path, or a path relative to the Projucer project file."); - } + if (project.shouldEnableARA() || project.isARAPluginHost()) + { + props.add (new FilePathPropertyComponent (araPathValueWrapper.getWrappedValueTreePropertyWithDefault(), "ARA SDK Folder", true, + getTargetOSForExporter() == TargetOS::getThisOS(), "*", project.getProjectFolder()), + "If you're building an ARA enabled plug-in, this must be the folder containing the ARA SDK. This can be an absolute path, or a path relative to the Projucer project file."); + } - props.add (new TextPropertyComponent (extraPPDefsValue, "Extra Preprocessor Definitions", 32768, true), - "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, " - "or new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash."); + props.add (new TextPropertyComponent (extraPPDefsValue, "Extra Preprocessor Definitions", 32768, true), + "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, " + "or new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash."); - props.add (new TextPropertyComponent (extraCompilerFlagsValue, "Extra Compiler Flags", 8192, true), - "Extra command-line flags to be passed to the compiler. This string can contain references to preprocessor definitions in the " - "form ${NAME_OF_DEFINITION}, which will be replaced with their values."); + props.add (new TextPropertyComponent (extraCompilerFlagsValue, "Extra Compiler Flags", 8192, true), + "Extra command-line flags to be passed to the compiler. This string can contain references to preprocessor definitions in the " + "form ${NAME_OF_DEFINITION}, which will be replaced with their values."); - for (HashMap::Iterator i (compilerFlagSchemesMap); i.next();) - props.add (new TextPropertyComponent (compilerFlagSchemesMap.getReference (i.getKey()), "Compiler Flags for " + i.getKey().quoted(), 8192, false), - "The exporter-specific compiler flags that will be added to files using this scheme."); + for (HashMap::Iterator i (compilerFlagSchemesMap); i.next();) + props.add (new TextPropertyComponent (compilerFlagSchemesMap.getReference (i.getKey()), "Compiler Flags for " + i.getKey().quoted(), 8192, false), + "The exporter-specific compiler flags that will be added to files using this scheme."); - props.add (new TextPropertyComponent (extraLinkerFlagsValue, "Extra Linker Flags", 8192, true), - "Extra command-line flags to be passed to the linker. You might want to use this for adding additional libraries. " - "This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); + props.add (new TextPropertyComponent (extraLinkerFlagsValue, "Extra Linker Flags", 8192, true), + "Extra command-line flags to be passed to the linker. You might want to use this for adding additional libraries. " + "This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); - props.add (new TextPropertyComponent (externalLibrariesValue, "External Libraries to Link", 8192, true), - "Additional libraries to link (one per line). You should not add any platform specific decoration to these names. " - "This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); + props.add (new TextPropertyComponent (externalLibrariesValue, "External Libraries to Link", 8192, true), + "Additional libraries to link (one per line). You should not add any platform specific decoration to these names. " + "This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); - if (! isVisualStudio()) - props.add (new ChoicePropertyComponent (gnuExtensionsValue, "GNU Compiler Extensions"), - "Enabling this will use the GNU C++ language standard variant for compilation."); + if (! isVisualStudio()) + props.add (new ChoicePropertyComponent (gnuExtensionsValue, "GNU Compiler Extensions"), + "Enabling this will use the GNU C++ language standard variant for compilation."); - createIconProperties (props); - } + createIconProperties (props); createExporterProperties (props); @@ -347,7 +336,9 @@ void ProjectExporter::createIconProperties (PropertyListBuilder& props) //============================================================================== void ProjectExporter::addSettingsForProjectType (const build_tools::ProjectType& type) { - addVSTPathsIfPluginOrHost(); + addExtraIncludePathsIfPluginOrHost(); + + addARAPathsIfPluginOrHost(); if (type.isAudioPlugin()) addCommonAudioPluginSettings(); @@ -355,25 +346,61 @@ void ProjectExporter::addSettingsForProjectType (const build_tools::ProjectType& addPlatformSpecificSettingsForProjectType (type); } -void ProjectExporter::addVSTPathsIfPluginOrHost() +void ProjectExporter::addExtraIncludePathsIfPluginOrHost() { - if (((shouldBuildTargetType (build_tools::ProjectType::Target::VSTPlugIn) && project.shouldBuildVST()) || project.isVSTPluginHost()) - || ((shouldBuildTargetType (build_tools::ProjectType::Target::VST3PlugIn) && project.shouldBuildVST3()) || project.isVST3PluginHost())) + using Target = build_tools::ProjectType::Target; + + if (((shouldBuildTargetType (Target::VSTPlugIn) && project.shouldBuildVST()) || project.isVSTPluginHost()) + || ((shouldBuildTargetType (Target::VST3PlugIn) && project.shouldBuildVST3()) || project.isVST3PluginHost())) { addLegacyVSTFolderToPathIfSpecified(); if (! project.isConfigFlagEnabled ("JUCE_CUSTOM_VST3_SDK")) addToExtraSearchPaths (getInternalVST3SDKPath(), 0); } + + const auto lv2BasePath = getModuleFolderRelativeToProject ("juce_audio_processors").getChildFile ("format_types") + .getChildFile ("LV2_SDK"); + + if ((shouldBuildTargetType (Target::LV2PlugIn) && project.shouldBuildLV2()) || project.isLV2PluginHost()) + { + const std::vector paths[] { { "" }, + { "lv2" }, + { "serd" }, + { "sord" }, + { "sord", "src" }, + { "sratom" }, + { "lilv" }, + { "lilv", "src" } }; + + for (const auto& components : paths) + { + const auto appendComponent = [] (const build_tools::RelativePath& f, const char* component) + { + return f.getChildFile (component); + }; + + const auto includePath = std::accumulate (components.begin(), + components.end(), + lv2BasePath, + appendComponent); + + addToExtraSearchPaths (includePath, 0); + } + } +} + +void ProjectExporter::addARAPathsIfPluginOrHost() +{ + if (project.shouldEnableARA() || project.isARAPluginHost()) + addARAFoldersToPath(); } void ProjectExporter::addCommonAudioPluginSettings() { if (shouldBuildTargetType (build_tools::ProjectType::Target::AAXPlugIn)) addAAXFoldersToPath(); - - // Note: RTAS paths are platform-dependent, impl -> addPlatformSpecificSettingsForProjectType - } +} void ProjectExporter::addLegacyVSTFolderToPathIfSpecified() { @@ -404,6 +431,14 @@ void ProjectExporter::addAAXFoldersToPath() } } +void ProjectExporter::addARAFoldersToPath() +{ + const auto araFolder = getARAPathString(); + + if (araFolder.isNotEmpty()) + addToExtraSearchPaths (build_tools::RelativePath (araFolder, build_tools::RelativePath::projectFolder)); +} + //============================================================================== StringPairArray ProjectExporter::getAllPreprocessorDefs (const BuildConfiguration& config, const build_tools::ProjectType::Target::Type targetType) const { @@ -430,16 +465,15 @@ StringPairArray ProjectExporter::getAllPreprocessorDefs() const void ProjectExporter::addTargetSpecificPreprocessorDefs (StringPairArray& defs, const build_tools::ProjectType::Target::Type targetType) const { - std::pair targetFlags[] = { - {"JucePlugin_Build_VST", build_tools::ProjectType::Target::VSTPlugIn}, - {"JucePlugin_Build_VST3", build_tools::ProjectType::Target::VST3PlugIn}, - {"JucePlugin_Build_AU", build_tools::ProjectType::Target::AudioUnitPlugIn}, - {"JucePlugin_Build_AUv3", build_tools::ProjectType::Target::AudioUnitv3PlugIn}, - {"JucePlugin_Build_RTAS", build_tools::ProjectType::Target::RTASPlugIn}, - {"JucePlugin_Build_AAX", build_tools::ProjectType::Target::AAXPlugIn}, - {"JucePlugin_Build_Standalone", build_tools::ProjectType::Target::StandalonePlugIn}, - {"JucePlugin_Build_Unity", build_tools::ProjectType::Target::UnityPlugIn} - }; + using Target = build_tools::ProjectType::Target::Type; + const std::pair targetFlags[] { { "JucePlugin_Build_VST", Target::VSTPlugIn }, + { "JucePlugin_Build_VST3", Target::VST3PlugIn }, + { "JucePlugin_Build_AU", Target::AudioUnitPlugIn }, + { "JucePlugin_Build_AUv3", Target::AudioUnitv3PlugIn }, + { "JucePlugin_Build_AAX", Target::AAXPlugIn }, + { "JucePlugin_Build_Standalone", Target::StandalonePlugIn }, + { "JucePlugin_Build_Unity", Target::UnityPlugIn }, + { "JucePlugin_Build_LV2", Target::LV2PlugIn } }; if (targetType == build_tools::ProjectType::Target::SharedCodeTarget) { @@ -453,6 +487,10 @@ void ProjectExporter::addTargetSpecificPreprocessorDefs (StringPairArray& defs, for (auto& flag : targetFlags) defs.set (flag.first, (targetType == flag.second ? "1" : "0")); } + if (project.shouldEnableARA()) + { + defs.set ("JucePlugin_Enable_ARA", "1"); + } } void ProjectExporter::addDefaultPreprocessorDefs (StringPairArray& defs) const @@ -603,7 +641,7 @@ TargetOS::OS ProjectExporter::getTargetOSForExporter() const if (isWindows()) targetOS = TargetOS::windows; else if (isOSX() || isiOS()) targetOS = TargetOS::osx; else if (isLinux()) targetOS = TargetOS::linux; - else if (isAndroid() || isCLion()) targetOS = TargetOS::getThisOS(); + else if (isAndroid()) targetOS = TargetOS::getThisOS(); return targetOS; } @@ -862,17 +900,21 @@ ProjectExporter::BuildConfiguration::BuildConfiguration (Project& p, const Value llvmFlags.common.addArray ({ "-Wshorten-64-to-32", "-Wconversion", "-Wint-conversion", "-Wconditional-uninitialized", "-Wconstant-conversion", "-Wbool-conversion", - "-Wextra-semi", "-Wshift-sign-overflow", "-Wno-missing-field-initializers", - "-Wshadow-all", "-Wnullable-to-nonnull-conversion" + "-Wextra-semi", "-Wshift-sign-overflow", + "-Wshadow-all", "-Wnullable-to-nonnull-conversion", + "-Wmissing-prototypes" }); llvmFlags.cpp.addArray ({ "-Wunused-private-field", "-Winconsistent-missing-destructor-override" }); + llvmFlags.objc.addArray ({ + "-Wunguarded-availability", "-Wunguarded-availability-new" + }); auto& gccFlags = recommendedCompilerWarningFlags[CompilerNames::gcc] = BuildConfiguration::CompilerWarningFlags::getRecommendedForGCCAndLLVM(); gccFlags.common.addArray ({ "-Wextra", "-Wsign-compare", "-Wno-implicit-fallthrough", "-Wno-maybe-uninitialized", - "-Wno-missing-field-initializers", "-Wredundant-decls", "-Wno-strict-overflow", + "-Wredundant-decls", "-Wno-strict-overflow", "-Wshadow" }); } diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h index 04a2930f..a29ef6d4 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -80,7 +80,6 @@ public: virtual bool isCodeBlocks() const = 0; virtual bool isMakefile() const = 0; virtual bool isAndroidStudio() const = 0; - virtual bool isCLion() const = 0; // operating system targeted by exporter virtual bool isAndroid() const = 0; @@ -151,7 +150,7 @@ public: String getVSTLegacyPathString() const { return vstLegacyPathValueWrapper.getCurrentValue(); } String getAAXPathString() const { return aaxPathValueWrapper.getCurrentValue(); } - String getRTASPathString() const { return rtasPathValueWrapper.getCurrentValue(); } + String getARAPathString() const { return araPathValueWrapper.getCurrentValue(); } // NB: this is the path to the parent "modules" folder that contains the named module, not the // module folder itself. @@ -188,6 +187,13 @@ public: void createPropertyEditors (PropertyListBuilder&); void addSettingsForProjectType (const build_tools::ProjectType&); + build_tools::RelativePath getLV2TurtleDumpProgramSource() const + { + return getModuleFolderRelativeToProject ("juce_audio_plugin_client") + .getChildFile ("LV2") + .getChildFile ("juce_LV2TurtleDumpProgram.cpp"); + } + //============================================================================== void copyMainGroupFromProject(); Array& getAllGroups() noexcept { jassert (itemGroups.size() > 0); return itemGroups; } @@ -289,8 +295,7 @@ public: return result; } - StringArray common; - StringArray cpp; + StringArray common, cpp, objc; }; CompilerWarningFlags getRecommendedCompilerWarningFlags() const; @@ -407,7 +412,7 @@ protected: const File projectFolder; //============================================================================== - ValueTreePropertyWithDefaultWrapper vstLegacyPathValueWrapper, rtasPathValueWrapper, aaxPathValueWrapper; + ValueTreePropertyWithDefaultWrapper vstLegacyPathValueWrapper, aaxPathValueWrapper, araPathValueWrapper; ValueTreePropertyWithDefault targetLocationValue, extraCompilerFlagsValue, extraLinkerFlagsValue, externalLibrariesValue, userNotesValue, gnuExtensionsValue, bigIconValue, smallIconValue, extraPPDefsValue; @@ -467,13 +472,14 @@ private: : name + suffix; } - void createDependencyPathProperties (PropertyListBuilder&); void createIconProperties (PropertyListBuilder&); - void addVSTPathsIfPluginOrHost(); + void addExtraIncludePathsIfPluginOrHost(); + void addARAPathsIfPluginOrHost(); void addCommonAudioPluginSettings(); void addLegacyVSTFolderToPathIfSpecified(); build_tools::RelativePath getInternalVST3SDKPath(); void addAAXFoldersToPath(); + void addARAFoldersToPath(); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjectExporter) }; diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp b/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp index f61cf2e4..a4e09cb5 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -24,7 +24,6 @@ */ #include "jucer_ProjectSaver.h" -#include "jucer_ProjectExport_CLion.h" #include "../Application/jucer_Application.h" static constexpr const char* generatedGroupID = "__jucelibfiles"; @@ -81,6 +80,7 @@ Result ProjectSaver::saveResourcesOnly() void ProjectSaver::saveBasicProjectItems (const OwnedArray& modules, const String& appConfigUserContent) { + writeLV2DefinesFile(); writePluginDefines(); writeAppConfigFile (modules, appConfigUserContent); writeBinaryDataFiles(); @@ -383,12 +383,12 @@ void ProjectSaver::writeAppConfig (MemoryOutputStream& out, const OwnedArray& modules, }); } +void ProjectSaver::writeLV2DefinesFile() +{ + if (! project.shouldBuildLV2()) + return; + + writeOrRemoveGeneratedFile (Project::getJuceLV2DefinesFilename(), [&] (MemoryOutputStream& mem) + { + writeLV2Defines (mem); + }); +} + void ProjectSaver::writeAppHeader (MemoryOutputStream& out, const OwnedArray& modules) { writeAutoGenWarningComment (out); @@ -645,6 +656,21 @@ void ProjectSaver::writeBinaryDataFiles() } } +void ProjectSaver::writeLV2Defines (MemoryOutputStream& mem) +{ + String templateFile { BinaryData::JuceLV2Defines_h_in }; + + const auto isValidUri = [&] (const String& text) { return URL (text).isWellFormed(); }; + + if (! isValidUri (project.getLV2URI())) + { + addError ("LV2 URI is malformed."); + return; + } + + mem << templateFile.replace ("${JUCE_LV2URI}", project.getLV2URI()); +} + void ProjectSaver::writeReadmeFile() { MemoryOutputStream out; @@ -718,7 +744,6 @@ void ProjectSaver::writeProjects (const OwnedArray& modules, Proj // keep a copy of the basic generated files group, as each exporter may modify it. auto originalGeneratedGroup = generatedFilesGroup.state.createCopy(); - CLionProjectExporter* clionExporter = nullptr; std::vector> exporters; try @@ -737,26 +762,19 @@ void ProjectSaver::writeProjects (const OwnedArray& modules, Proj if (exporter->getTargetFolder().createDirectory()) { - if (exporter->isCLion()) - { - clionExporter = dynamic_cast (exporter.get()); - } - else - { - exporter->copyMainGroupFromProject(); - exporter->settings = exporter->settings.createCopy(); + exporter->copyMainGroupFromProject(); + exporter->settings = exporter->settings.createCopy(); - exporter->addToExtraSearchPaths (build_tools::RelativePath ("JuceLibraryCode", build_tools::RelativePath::projectFolder)); + exporter->addToExtraSearchPaths (build_tools::RelativePath ("JuceLibraryCode", build_tools::RelativePath::projectFolder)); - generatedFilesGroup.state = originalGeneratedGroup.createCopy(); - exporter->addSettingsForProjectType (project.getProjectType()); + generatedFilesGroup.state = originalGeneratedGroup.createCopy(); + exporter->addSettingsForProjectType (project.getProjectType()); - for (auto* module : modules) - module->addSettingsForModuleToExporter (*exporter, *this); + for (auto* module : modules) + module->addSettingsForModuleToExporter (*exporter, *this); - generatedFilesGroup.sortAlphabetically (true, true); - exporter->getAllGroups().add (generatedFilesGroup); - } + generatedFilesGroup.sortAlphabetically (true, true); + exporter->getAllGroups().add (generatedFilesGroup); if (ProjucerApplication::getApp().isRunningCommandLine) saveExporter (*exporter, modules); @@ -776,14 +794,6 @@ void ProjectSaver::writeProjects (const OwnedArray& modules, Proj while (threadPool.getNumJobs() > 0) Thread::sleep (10); - - if (clionExporter != nullptr) - { - for (auto& exporter : exporters) - clionExporter->writeCMakeListsExporterSection (exporter.get()); - - std::cout << "Finished saving: " << clionExporter->getUniqueName() << std::endl; - } } void ProjectSaver::runPostExportScript() @@ -832,15 +842,12 @@ void ProjectSaver::saveExporter (ProjectExporter& exporter, const OwnedArrayisThisTheMessageThread()) - std::cout << outputString << std::endl; - else - MessageManager::callAsync ([outputString] { std::cout << outputString << std::endl; }); - } + if (MessageManager::getInstance()->isThisTheMessageThread()) + std::cout << outputString << std::endl; + else + MessageManager::callAsync ([outputString] { std::cout << outputString << std::endl; }); } catch (build_tools::SaveError& error) { diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h index 22033a92..78bc3bc4 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -103,6 +103,7 @@ private: void writePluginDefines (MemoryOutputStream& outStream) const; void writePluginDefines(); void writeAppConfigFile (const OwnedArray& modules, const String& userContent); + void writeLV2Defines (MemoryOutputStream&); void writeProjectFile(); void writeAppConfig (MemoryOutputStream& outStream, const OwnedArray& modules, const String& userContent); @@ -114,6 +115,7 @@ private: void writePluginCharacteristicsFile(); void writeUnityScriptFile(); void writeProjects (const OwnedArray&, ProjectExporter*); + void writeLV2DefinesFile(); void runPostExportScript(); void saveExporter (ProjectExporter& exporter, const OwnedArray& modules); diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.cpp b/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.cpp index f5a14dca..534296a7 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.cpp +++ b/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.h b/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.h index 7caaa057..875b1743 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/ProjectSaving/jucer_XcodeProjectParser.h b/extras/Projucer/Source/ProjectSaving/jucer_XcodeProjectParser.h index 2d18ff2b..46187240 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_XcodeProjectParser.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_XcodeProjectParser.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Settings/jucer_AppearanceSettings.cpp b/extras/Projucer/Source/Settings/jucer_AppearanceSettings.cpp index 57882271..d0383bcb 100644 --- a/extras/Projucer/Source/Settings/jucer_AppearanceSettings.cpp +++ b/extras/Projucer/Source/Settings/jucer_AppearanceSettings.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Settings/jucer_AppearanceSettings.h b/extras/Projucer/Source/Settings/jucer_AppearanceSettings.h index 7a315f2b..0fc66b64 100644 --- a/extras/Projucer/Source/Settings/jucer_AppearanceSettings.h +++ b/extras/Projucer/Source/Settings/jucer_AppearanceSettings.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp b/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp index 0230bec6..afc2bf77 100644 --- a/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp +++ b/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -279,14 +279,14 @@ static bool isGlobalPathValid (const File& relativeTo, const Identifier& key, co { fileToCheckFor = "pluginterfaces/vst2.x/aeffect.h"; } - else if (key == Ids::rtasPath) - { - fileToCheckFor = "AlturaPorts/TDMPlugIns/PlugInLibrary/EffectClasses/CEffectProcessMIDI.cpp"; - } else if (key == Ids::aaxPath) { fileToCheckFor = "Interfaces/AAX_Exports.cpp"; } + else if (key == Ids::araPath) + { + fileToCheckFor = "ARA_API/ARAInterface.h"; + } else if (key == Ids::androidSDKPath) { #if JUCE_WINDOWS @@ -303,16 +303,6 @@ static bool isGlobalPathValid (const File& relativeTo, const Identifier& key, co { fileToCheckFor = {}; } - else if (key == Ids::clionExePath) - { - #if JUCE_MAC - fileToCheckFor = path.trim().endsWith (".app") ? "Contents/MacOS/clion" : "../clion"; - #elif JUCE_WINDOWS - fileToCheckFor = "../clion64.exe"; - #else - fileToCheckFor = "../clion.sh"; - #endif - } else if (key == Ids::androidStudioExePath) { #if JUCE_MAC @@ -372,18 +362,18 @@ static String getFallbackPathForOS (const Identifier& key, DependencyPathOS os) { return {}; } - else if (key == Ids::rtasPath) - { - if (os == TargetOS::windows) return "C:\\SDKs\\PT_90_SDK"; - else if (os == TargetOS::osx) return "~/SDKs/PT_90_SDK"; - else return {}; // no RTAS on this OS! - } else if (key == Ids::aaxPath) { if (os == TargetOS::windows) return "C:\\SDKs\\AAX"; else if (os == TargetOS::osx) return "~/SDKs/AAX"; else return {}; // no AAX on this OS! } + else if (key == Ids::araPath) + { + if (os == TargetOS::windows) return "C:\\SDKs\\ARA_SDK"; + else if (os == TargetOS::osx) return "~/SDKs/ARA_SDK"; + else return {}; + } else if (key == Ids::androidSDKPath) { if (os == TargetOS::windows) return "${user.home}\\AppData\\Local\\Android\\Sdk"; @@ -393,29 +383,6 @@ static String getFallbackPathForOS (const Identifier& key, DependencyPathOS os) jassertfalse; return {}; } - else if (key == Ids::clionExePath) - { - if (os == TargetOS::windows) - { - #if JUCE_WINDOWS - auto regValue = WindowsRegistry::getValue ("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\Applications\\clion64.exe\\shell\\open\\command\\", {}, {}); - auto openCmd = StringArray::fromTokens (regValue, true); - - if (! openCmd.isEmpty()) - return openCmd[0].unquoted(); - #endif - - return "C:\\Program Files\\JetBrains\\CLion YYYY.MM.DD\\bin\\clion64.exe"; - } - else if (os == TargetOS::osx) - { - return "/Applications/CLion.app"; - } - else - { - return "${user.home}/clion/bin/clion.sh"; - } - } else if (key == Ids::androidStudioExePath) { if (os == TargetOS::windows) diff --git a/extras/Projucer/Source/Settings/jucer_StoredSettings.h b/extras/Projucer/Source/Settings/jucer_StoredSettings.h index b6413bbf..81967067 100644 --- a/extras/Projucer/Source/Settings/jucer_StoredSettings.h +++ b/extras/Projucer/Source/Settings/jucer_StoredSettings.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.cpp b/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.cpp index 92d7caa7..28119106 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.cpp +++ b/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.h b/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.h index 652dde6e..f35673cd 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_Colours.h b/extras/Projucer/Source/Utility/Helpers/jucer_Colours.h index d7f58164..2ec40200 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_Colours.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_Colours.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp b/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp index 3efca27e..fa5fa4d6 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp +++ b/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.h b/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.h index 6c69bf5a..e3fb5a3d 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.cpp b/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.cpp index f2051c62..e07bc65d 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.cpp +++ b/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.h b/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.h index e6e7a6c6..b57ce69a 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.cpp b/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.cpp index 88ddd38b..a8647956 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.cpp +++ b/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.h b/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.h index 5fb11d71..8b84ba2b 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_NewFileWizard.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h index a502beb9..350d7c41 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -72,11 +72,10 @@ namespace Ids DECLARE_ID (defaultUserModulePath); DECLARE_ID (vstLegacyFolder); DECLARE_ID (vst3Folder); - DECLARE_ID (rtasFolder); DECLARE_ID (auFolder); DECLARE_ID (vstLegacyPath); - DECLARE_ID (rtasPath); DECLARE_ID (aaxPath); + DECLARE_ID (araPath); DECLARE_ID (flags); DECLARE_ID (line); DECLARE_ID (index); @@ -123,7 +122,6 @@ namespace Ids DECLARE_ID (vstBinaryLocation); DECLARE_ID (vst3BinaryLocation); DECLARE_ID (auBinaryLocation); - DECLARE_ID (rtasBinaryLocation); DECLARE_ID (aaxBinaryLocation); DECLARE_ID (unityPluginBinaryLocation); DECLARE_ID (enablePluginBinaryCopyStep); @@ -164,7 +162,11 @@ namespace Ids DECLARE_ID (enableIncrementalLinking); DECLARE_ID (bundleIdentifier); DECLARE_ID (aaxIdentifier); + DECLARE_ID (araFactoryID); + DECLARE_ID (araDocumentArchiveID); + DECLARE_ID (araCompatibleArchiveIDs); DECLARE_ID (aaxFolder); + DECLARE_ID (araFolder); DECLARE_ID (compile); DECLARE_ID (noWarnings); DECLARE_ID (skipPCH); @@ -276,10 +278,6 @@ namespace Ids DECLARE_ID (gradleToolchain); DECLARE_ID (gradleToolchainVersion); DECLARE_ID (linuxExtraPkgConfig); - DECLARE_ID (clionMakefileEnabled); - DECLARE_ID (clionXcodeEnabled); - DECLARE_ID (clionCodeBlocksEnabled); - DECLARE_ID (clionExePath); DECLARE_ID (font); DECLARE_ID (colour); DECLARE_ID (userNotes); @@ -335,11 +333,12 @@ namespace Ids DECLARE_ID (buildVST3); DECLARE_ID (buildAU); DECLARE_ID (buildAUv3); - DECLARE_ID (buildRTAS); DECLARE_ID (buildAAX); DECLARE_ID (buildStandalone); DECLARE_ID (buildUnity); + DECLARE_ID (buildLV2); DECLARE_ID (enableIAA); + DECLARE_ID (enableARA); DECLARE_ID (pluginName); DECLARE_ID (pluginDesc); DECLARE_ID (pluginManufacturer); @@ -359,12 +358,11 @@ namespace Ids DECLARE_ID (pluginAUExportPrefix); DECLARE_ID (pluginAUMainType); DECLARE_ID (pluginAUIsSandboxSafe); - DECLARE_ID (pluginRTASCategory); - DECLARE_ID (pluginRTASDisableBypass); - DECLARE_ID (pluginRTASDisableMultiMono); DECLARE_ID (pluginAAXCategory); DECLARE_ID (pluginAAXDisableBypass); DECLARE_ID (pluginAAXDisableMultiMono); + DECLARE_ID (pluginARAAnalyzableContent); + DECLARE_ID (pluginARATransformFlags); DECLARE_ID (pluginVSTNumMidiInputs); DECLARE_ID (pluginVSTNumMidiOutputs); DECLARE_ID (suppressPlistResourceUsage); @@ -372,6 +370,7 @@ namespace Ids DECLARE_ID (exporters); DECLARE_ID (website); DECLARE_ID (mainClass); + DECLARE_ID (documentControllerClass); DECLARE_ID (moduleFlags); DECLARE_ID (projectLineFeed); DECLARE_ID (compilerFlagSchemes); @@ -383,6 +382,9 @@ namespace Ids DECLARE_ID (guiEditorEnabled); DECLARE_ID (jucerFormatVersion); DECLARE_ID (buildNumber); + DECLARE_ID (lv2Uri); + DECLARE_ID (lv2UriUi); + DECLARE_ID (lv2BinaryLocation); DECLARE_ID (osxSDK); DECLARE_ID (osxCompatibility); diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h b/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h index 8325ca96..37e4e895 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_ValueSourceHelpers.h b/extras/Projucer/Source/Utility/Helpers/jucer_ValueSourceHelpers.h index 2e4cdfed..09a8c09f 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_ValueSourceHelpers.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_ValueSourceHelpers.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_ValueTreePropertyWithDefaultWrapper.h b/extras/Projucer/Source/Utility/Helpers/jucer_ValueTreePropertyWithDefaultWrapper.h index fef47d89..650d0e1e 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_ValueTreePropertyWithDefaultWrapper.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_ValueTreePropertyWithDefaultWrapper.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.cpp b/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.cpp index 2b8eb5e3..578e29de 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.cpp +++ b/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.h b/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.h index 65f67a4d..73555a66 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_VersionInfo.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp b/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp index bc800c5d..88aa018f 100644 --- a/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp +++ b/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -213,6 +213,11 @@ void PIPGenerator::createFiles (ValueTree& jucerTree) jucerTree.addChild (mainGroup, 0, nullptr); } +String PIPGenerator::getDocumentControllerClass() const +{ + return metadata.getProperty (Ids::documentControllerClass, "").toString(); +} + ValueTree PIPGenerator::createModulePathChild (const String& moduleID) { ValueTree modulePath (Ids::MODULEPATH); @@ -383,6 +388,9 @@ Result PIPGenerator::setProjectSettings (ValueTree& jucerTree) StringArray pluginFormatsToBuild (Ids::buildVST3.toString(), Ids::buildAU.toString(), Ids::buildStandalone.toString()); pluginFormatsToBuild.addArray (getExtraPluginFormatsToBuild()); + if (getDocumentControllerClass().isNotEmpty()) + pluginFormatsToBuild.add (Ids::enableARA.toString()); + jucerTree.setProperty (Ids::pluginFormats, pluginFormatsToBuild.joinIntoString (","), nullptr); const auto characteristics = metadata[Ids::pluginCharacteristics].toString(); @@ -421,6 +429,7 @@ void PIPGenerator::setModuleFlags (ValueTree& jucerTree) String PIPGenerator::getMainFileTextForType() { const auto type = metadata[Ids::type].toString(); + const auto documentControllerClass = getDocumentControllerClass(); const auto mainTemplate = [&] { @@ -434,8 +443,17 @@ String PIPGenerator::getMainFileTextForType() .replace ("${JUCE_PIP_MAIN_CLASS}", metadata[Ids::mainClass].toString()); if (type == "AudioProcessor") + { + if (documentControllerClass.isNotEmpty()) + { + return String (BinaryData::PIPAudioProcessorWithARA_cpp_in) + .replace ("${JUCE_PIP_MAIN_CLASS}", metadata[Ids::mainClass].toString()) + .replace ("${JUCE_PIP_DOCUMENTCONTROLLER_CLASS}", documentControllerClass); + } + return String (BinaryData::PIPAudioProcessor_cpp_in) .replace ("${JUCE_PIP_MAIN_CLASS}", metadata[Ids::mainClass].toString()); + } return String{}; }(); diff --git a/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.h b/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.h index a85c7392..dccfb8ec 100644 --- a/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.h +++ b/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -52,6 +52,7 @@ private: //============================================================================== void addFileToTree (ValueTree& groupTree, const String& name, bool compile, const String& path); void createFiles (ValueTree& jucerTree); + String getDocumentControllerClass() const; ValueTree createModulePathChild (const String& moduleID); ValueTree createBuildConfigChild (bool isDebug); diff --git a/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h b/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h index c853747d..31e5fe12 100644 --- a/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h +++ b/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h b/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h index d1711631..37e6a350 100644 --- a/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h +++ b/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h b/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h index ae710ab7..0ec7f458 100644 --- a/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h +++ b/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h b/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h index f66375b4..e03d1bac 100644 --- a/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h +++ b/extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/UI/jucer_IconButton.h b/extras/Projucer/Source/Utility/UI/jucer_IconButton.h index e3a475d1..60c6be4f 100644 --- a/extras/Projucer/Source/Utility/UI/jucer_IconButton.h +++ b/extras/Projucer/Source/Utility/UI/jucer_IconButton.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/UI/jucer_Icons.cpp b/extras/Projucer/Source/Utility/UI/jucer_Icons.cpp index e2753387..e552042c 100644 --- a/extras/Projucer/Source/Utility/UI/jucer_Icons.cpp +++ b/extras/Projucer/Source/Utility/UI/jucer_Icons.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -624,15 +624,6 @@ const uint8 xcode[] = { 110,109,72,225,2,66,41,92,31,64,108,72,225,2,66,40,92,31 const uint8 visualStudio[] = { 110,109,0,0,112,65,0,0,0,0,108,0,0,227,64,0,0,253,64,108,0,0,0,64,0,0,128,64,108,0,0,0,0,0,0,160,64,108,0,0,0,0,0,0,112,65,108,0,0,0,64,0,0,128,65,108,0,0,224,64,0,0,64,65,108,0,0,112,65,0,0,160,65,108,0,0,160,65,0,0,144,65,108,0,0,160,65,0,0,0,64,108, 0,0,112,65,0,0,0,0,99,109,0,0,112,65,0,0,192,64,108,0,0,112,65,0,0,96,65,108,0,176,26,65,0,0,32,65,108,0,0,112,65,0,0,192,64,99,109,0,0,0,64,0,0,224,64,108,0,0,162,64,0,0,31,65,108,0,0,0,64,0,0,80,65,108,0,0,0,64,0,0,224,64,99,101,0,0 }; - -const uint8 clion[] = { 110,109,0,0,0,0,0,0,0,0,98,0,0,0,0,170,170,38,67,0,0,0,0,171,170,166,67,0,0,0,0,0,0,250,67,98,170,170,38,67,0,0,250,67,171,170,166,67,0,0,250,67,0,0,250,67,0,0,250,67,98,0,0,250,67,171,170,166,67,0,0,250,67,170,170,38,67,0,0,250,67,0,0,0,0,98,171,170, - 166,67,0,0,0,0,170,170,38,67,0,0,0,0,0,0,0,0,0,0,0,0,99,109,246,164,21,67,176,231,121,66,98,120,35,52,67,168,63,118,66,22,248,83,67,248,250,142,66,0,128,104,67,0,0,190,66,98,172,234,94,67,0,128,212,66,86,85,85,67,0,0,235,66,2,192,75,67,0,192,0,67,98, - 180,250,52,67,80,226,207,66,62,108,10,67,92,105,190,66,32,159,224,66,108,117,239,66,98,40,200,154,66,148,71,22,67,110,149,174,66,254,37,89,67,80,183,4,67,52,0,104,67,98,100,211,30,67,88,243,112,67,134,23,59,67,212,126,101,67,252,63,78,67,0,64,83,67,98, - 84,213,87,67,86,213,92,67,170,106,97,67,174,106,102,67,0,0,107,67,2,0,112,67,98,28,218,67,67,144,199,143,67,12,199,231,66,24,70,145,67,174,142,147,66,200,71,117,67,98,16,130,199,65,74,191,69,67,80,114,21,66,130,44,211,66,170,64,198,66,178,0,150,66,98, - 176,33,229,66,124,94,133,66,160,27,4,67,84,87,121,66,246,164,21,67,176,231,121,66,99,109,0,32,133,67,2,0,130,66,98,85,213,140,67,2,0,130,66,171,138,148,67,2,0,130,66,0,64,156,67,2,0,130,66,98,0,64,156,67,0,128,242,66,0,64,156,67,0,128,49,67,0,64,156, - 67,4,192,105,67,98,1,64,171,67,4,192,105,67,0,64,186,67,4,192,105,67,0,64,201,67,4,192,105,67,98,0,64,201,67,174,170,118,67,0,64,201,67,171,202,129,67,0,64,201,67,1,64,136,67,98,170,138,178,67,1,64,136,67,86,213,155,67,1,64,136,67,0,32,133,67,1,64,136, - 67,98,0,32,133,67,88,85,75,67,0,32,133,67,174,42,6,67,0,32,133,67,4,0,130,66,99,109,0,0,62,66,254,31,203,67,98,0,0,220,66,254,31,203,67,0,128,44,67,254,31,203,67,0,0,107,67,254,31,203,67,98,0,0,107,67,84,85,208,67,0,0,107,67,170,138,213,67,0,0,107,67, - 0,192,218,67,98,0,128,44,67,0,192,218,67,0,0,220,66,0,192,218,67,252,255,61,66,0,192,218,67,98,252,255,61,66,170,138,213,67,252,255,61,66,84,85,208,67,252,255,61,66,254,31,203,67,99,101,0,0 }; } Icons::Icons() @@ -664,5 +655,4 @@ Icons::Icons() JUCE_LOAD_PATH_DATA (linux); JUCE_LOAD_PATH_DATA (xcode); JUCE_LOAD_PATH_DATA (visualStudio); - JUCE_LOAD_PATH_DATA (clion); } diff --git a/extras/Projucer/Source/Utility/UI/jucer_Icons.h b/extras/Projucer/Source/Utility/UI/jucer_Icons.h index 6f97def6..de594a94 100644 --- a/extras/Projucer/Source/Utility/UI/jucer_Icons.h +++ b/extras/Projucer/Source/Utility/UI/jucer_Icons.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -77,7 +77,7 @@ public: Path imageDoc, config, graph, info, warning, user, closedFolder, exporter, fileExplorer, file, modules, openFolder, settings, singleModule, plus, android, codeBlocks, - linux, xcode, visualStudio, clion; + linux, xcode, visualStudio; private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Icons) diff --git a/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.cpp b/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.cpp index deafa218..9953a472 100644 --- a/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.cpp +++ b/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.h b/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.h index 3d72d5f8..eb8d904c 100644 --- a/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.h +++ b/extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp b/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp index 943521b8..0ee08357 100644 --- a/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp +++ b/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.h b/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.h index c9a77453..c3a75da5 100644 --- a/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.h +++ b/extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.cpp b/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.cpp index 3b8536c3..b6ac43db 100644 --- a/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.cpp +++ b/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.h b/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.h index 23438a24..15cbc65e 100644 --- a/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.h +++ b/extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile b/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile index 5632ca38..ef2672cd 100644 --- a/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile +++ b/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile @@ -11,6 +11,10 @@ endif # (this disables dependency generation if multiple architectures are set) DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) +ifndef PKG_CONFIG + PKG_CONFIG=pkg-config +endif + ifndef STRIP STRIP=strip endif @@ -35,13 +39,13 @@ ifeq ($(CONFIG),Debug) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_CONSOLEAPP := UnitTestRunner JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -56,13 +60,13 @@ ifeq ($(CONFIG),Release) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60106" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) - JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70000" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_CONSOLEAPP := UnitTestRunner JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS) JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++14 $(CXXFLAGS) - JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell pkg-config --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) + JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS) CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR) endif @@ -74,6 +78,8 @@ OBJECTS_CONSOLEAPP := \ $(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o \ $(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o \ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o \ + $(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o \ $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o \ $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \ $(JUCE_OBJDIR)/include_juce_cryptography_8cb807a8.o \ @@ -93,8 +99,8 @@ OBJECTS_CONSOLEAPP := \ all : $(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) $(JUCE_OUTDIR)/$(JUCE_TARGET_CONSOLEAPP) : $(OBJECTS_CONSOLEAPP) $(RESOURCES) - @command -v pkg-config >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } - @pkg-config --print-errors alsa freetype2 libcurl + @command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; } + @$(PKG_CONFIG) --print-errors alsa freetype2 libcurl @echo Linking "UnitTestRunner - ConsoleApp" -$(V_AT)mkdir -p $(JUCE_BINDIR) -$(V_AT)mkdir -p $(JUCE_LIBDIR) @@ -131,6 +137,16 @@ $(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o: ../../JuceLibraryCode/i @echo "Compiling include_juce_audio_processors.cpp" $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_CONSOLEAPP) $(JUCE_CFLAGS_CONSOLEAPP) -o "$@" -c "$<" +$(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o: ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_ara.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_CONSOLEAPP) $(JUCE_CFLAGS_CONSOLEAPP) -o "$@" -c "$<" + +$(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o: ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_audio_processors_lv2_libs.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_CONSOLEAPP) $(JUCE_CFLAGS_CONSOLEAPP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o: ../../JuceLibraryCode/include_juce_audio_utils.cpp -$(V_AT)mkdir -p $(JUCE_OBJDIR) @echo "Compiling include_juce_audio_utils.cpp" diff --git a/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj b/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj index 003f63a3..540859a8 100644 --- a/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj +++ b/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj @@ -18,14 +18,15 @@ 33D24B475EA928745A87EDDB /* include_juce_audio_devices.mm */ = {isa = PBXBuildFile; fileRef = 00CDB93410EA5AECBA5ADA95; }; 3822F598DA7044E5DB7633A9 /* include_juce_audio_utils.mm */ = {isa = PBXBuildFile; fileRef = 846E187EC2E797B982861CA4; }; 3866839F4051D104244870B1 /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = 336A244E3C6460495F0A424C; }; + 44628795CE784DEE1B98F986 /* include_juce_audio_processors_ara.cpp */ = {isa = PBXBuildFile; fileRef = C7F2704A6676859CCE14A4D1; }; 4BC57B0D2215621D90C8881C /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = D2EBC6292AE5AFC46EB10DAC; }; - 59004CE43AE081B4A6CE9E17 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = 1932D54A7FAE13BADBA3E9B5; }; 5CB3596030B0DD3763CAF85C /* include_juce_data_structures.mm */ = {isa = PBXBuildFile; fileRef = 302A999B2803C0D5C15D237C; }; 5FE50792EDC7638DE9A824B5 /* RecentFilesMenuTemplate.nib */ = {isa = PBXBuildFile; fileRef = 5C7BDD8DF72F2FC2D44D757A; }; 66FC7F44EEC9044E5C4A21C3 /* CoreAudio.framework */ = {isa = PBXBuildFile; fileRef = C0531453A002C480280C5F05; }; 6EB1A3B818863EF1787A9CCE /* AVFoundation.framework */ = {isa = PBXBuildFile; fileRef = 4B427AF10E722F9A362CEB73; }; 7164274FE42C7EC423455E05 /* include_juce_osc.cpp */ = {isa = PBXBuildFile; fileRef = A59D9064C3A2D7EC3DC45420; }; 74EC8AEC296DB2721EB438BF /* include_juce_audio_processors.mm */ = {isa = PBXBuildFile; fileRef = 3A26A3568F2C301EEED25288; }; + 79FE3F2D2EFAC333283E5D90 /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXBuildFile; fileRef = 45FB94C047D1ECAACA9462B7; }; 8D51903C59161885903F60CC /* CoreMIDI.framework */ = {isa = PBXBuildFile; fileRef = 04C1B8BF62AA09E62B362913; }; 96EFF7BA261F57DD829324D8 /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = 7898C73DCA6FA9D9CF669D32; }; 9B48039CDFD679AD944BAC70 /* include_juce_core.mm */ = {isa = PBXBuildFile; fileRef = AB19DDC8458D2A420E6D8AC3; }; @@ -53,7 +54,6 @@ 080EAB9CF5AB2BD6B2BBB173 /* ConsoleApp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = UnitTestRunner; sourceTree = BUILT_PRODUCTS_DIR; }; 08ED235CBE02E0FB4BE4653E /* include_juce_cryptography.mm */ /* include_juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_cryptography.mm; path = ../../JuceLibraryCode/include_juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; 1088318C19CEB1861C58B3BA /* include_juce_video.mm */ /* include_juce_video.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_video.mm; path = ../../JuceLibraryCode/include_juce_video.mm; sourceTree = SOURCE_ROOT; }; - 1932D54A7FAE13BADBA3E9B5 /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; 1CA82C74AEC08421812BDCAC /* include_juce_opengl.mm */ /* include_juce_opengl.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_opengl.mm; path = ../../JuceLibraryCode/include_juce_opengl.mm; sourceTree = SOURCE_ROOT; }; 1DC921E6494548F5E73E1056 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; }; 2030A589A9355FE6A0F72428 /* Cocoa.framework */ /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; @@ -68,6 +68,7 @@ 3A26A3568F2C301EEED25288 /* include_juce_audio_processors.mm */ /* include_juce_audio_processors.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_processors.mm; path = ../../JuceLibraryCode/include_juce_audio_processors.mm; sourceTree = SOURCE_ROOT; }; 3D169C5EFBF6304F5CE4C35E /* include_juce_events.mm */ /* include_juce_events.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_events.mm; path = ../../JuceLibraryCode/include_juce_events.mm; sourceTree = SOURCE_ROOT; }; 4195CB317C364D778AE2ADB1 /* include_juce_gui_extra.mm */ /* include_juce_gui_extra.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_gui_extra.mm; path = ../../JuceLibraryCode/include_juce_gui_extra.mm; sourceTree = SOURCE_ROOT; }; + 45FB94C047D1ECAACA9462B7 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; }; 4B427AF10E722F9A362CEB73 /* AVFoundation.framework */ /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 4BD792956FE7C22CB8FB691D /* include_juce_audio_basics.mm */ /* include_juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_basics.mm; path = ../../JuceLibraryCode/include_juce_audio_basics.mm; sourceTree = SOURCE_ROOT; }; 4CA19EC18C2BC536B3636842 /* include_juce_dsp.mm */ /* include_juce_dsp.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_dsp.mm; path = ../../JuceLibraryCode/include_juce_dsp.mm; sourceTree = SOURCE_ROOT; }; @@ -92,6 +93,7 @@ B72A2BF24B6FFD414CD3B1CA /* juce_video */ /* juce_video */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_video; path = ../../../../modules/juce_video; sourceTree = SOURCE_ROOT; }; B96EC82EC3D2813B50386198 /* include_juce_product_unlocking.mm */ /* include_juce_product_unlocking.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_product_unlocking.mm; path = ../../JuceLibraryCode/include_juce_product_unlocking.mm; sourceTree = SOURCE_ROOT; }; C0531453A002C480280C5F05 /* CoreAudio.framework */ /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + C7F2704A6676859CCE14A4D1 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; }; CC27F53A76BFB2675D2683A1 /* juce_opengl */ /* juce_opengl */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_opengl; path = ../../../../modules/juce_opengl; sourceTree = SOURCE_ROOT; }; D2EBC6292AE5AFC46EB10DAC /* WebKit.framework */ /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; D3BE73543708D756BDB8AEF7 /* juce_dsp */ /* juce_dsp */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_dsp; path = ../../../../modules/juce_dsp; sourceTree = SOURCE_ROOT; }; @@ -114,7 +116,6 @@ 96EFF7BA261F57DD829324D8, 6EB1A3B818863EF1787A9CCE, D82BA4D40F5686DAFF5E11FB, - 59004CE43AE081B4A6CE9E17, AA207299991F85938465BF65, 66FC7F44EEC9044E5C4A21C3, 3866839F4051D104244870B1, @@ -139,7 +140,6 @@ 7898C73DCA6FA9D9CF669D32, 4B427AF10E722F9A362CEB73, 99527F36B4484133087435CD, - 1932D54A7FAE13BADBA3E9B5, 2030A589A9355FE6A0F72428, C0531453A002C480280C5F05, 336A244E3C6460495F0A424C, @@ -163,6 +163,8 @@ 00CDB93410EA5AECBA5ADA95, A76DD7182C290A9020C96CA7, 3A26A3568F2C301EEED25288, + C7F2704A6676859CCE14A4D1, + 45FB94C047D1ECAACA9462B7, 846E187EC2E797B982861CA4, AB19DDC8458D2A420E6D8AC3, 08ED235CBE02E0FB4BE4653E, @@ -277,7 +279,7 @@ E1E93F2B4B2D17E011395520 = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Raw Material Software Limited"; }; buildConfigurationList = 18FC121B1014F7999CD135D3; @@ -318,6 +320,8 @@ 33D24B475EA928745A87EDDB, FDDF955477BE7FEBC364E19B, 74EC8AEC296DB2721EB438BF, + 44628795CE784DEE1B98F986, + 79FE3F2D2EFAC333283E5D90, 3822F598DA7044E5DB7633A9, 9B48039CDFD679AD944BAC70, FC139F56BD13A2C78D21076E, @@ -404,7 +408,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -424,6 +428,8 @@ "JUCE_MODULE_AVAILABLE_juce_product_unlocking=1", "JUCE_MODULE_AVAILABLE_juce_video=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", + "JUCE_PLUGINHOST_VST3=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_STRICT_REFCOUNTEDPOINTER=1", "JUCE_STANDALONE_APPLICATION=1", "JUCE_UNIT_TESTS=1", @@ -434,13 +440,22 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", "$(inherited)", @@ -448,9 +463,10 @@ INSTALL_PATH = "/usr/bin"; LLVM_LTO = YES; MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.UnitTestRunner; PRODUCT_NAME = "UnitTestRunner"; USE_HEADERMAP = NO; @@ -525,7 +541,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x60106", + "JUCE_PROJUCER_VERSION=0x70000", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -545,6 +561,8 @@ "JUCE_MODULE_AVAILABLE_juce_product_unlocking=1", "JUCE_MODULE_AVAILABLE_juce_video=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", + "JUCE_PLUGINHOST_VST3=1", + "JUCE_PLUGINHOST_LV2=1", "JUCE_STRICT_REFCOUNTEDPOINTER=1", "JUCE_STANDALONE_APPLICATION=1", "JUCE_UNIT_TESTS=1", @@ -555,22 +573,32 @@ "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", "JucePlugin_Build_AUv3=0", - "JucePlugin_Build_RTAS=0", "JucePlugin_Build_AAX=0", "JucePlugin_Build_Standalone=0", "JucePlugin_Build_Unity=0", + "JucePlugin_Build_LV2=0", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK", + "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK", "$(SRCROOT)/../../JuceLibraryCode", "$(SRCROOT)/../../../../modules", "$(inherited)", ); INSTALL_PATH = "/usr/bin"; MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; - OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; - OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wno-missing-field-initializers -Wshadow-all -Wnullable-to-nonnull-conversion"; + MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules"; + OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new"; + OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit"; PRODUCT_BUNDLE_IDENTIFIER = com.juce.UnitTestRunner; PRODUCT_NAME = "UnitTestRunner"; USE_HEADERMAP = NO; diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj index e8fe99e2..4f263c53 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -106,8 +107,8 @@ Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -122,7 +123,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -168,13 +170,13 @@ true - + true - + true - + true @@ -285,7 +287,7 @@ true - + true @@ -654,6 +656,9 @@ true + + true + true @@ -687,6 +692,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -756,15 +878,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -798,6 +938,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -816,6 +974,9 @@ true + + true + true @@ -828,6 +989,12 @@ true + + true + + + true + true @@ -894,9 +1061,15 @@ true + + true + true + + true + true @@ -912,6 +1085,9 @@ true + + true + true @@ -978,6 +1154,9 @@ true + + true + true @@ -1974,6 +2153,9 @@ true + + true + true @@ -2001,9 +2183,6 @@ true - - true - true @@ -2323,7 +2502,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2384,6 +2567,7 @@ + @@ -2572,6 +2756,7 @@ + @@ -2584,6 +2769,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2649,9 +2904,14 @@ + + + + + @@ -2672,6 +2932,11 @@ + + + + + @@ -2679,6 +2944,8 @@ + + @@ -2710,6 +2977,7 @@ + @@ -2718,6 +2986,8 @@ + + @@ -2926,6 +3196,7 @@ + @@ -3124,6 +3395,7 @@ + @@ -3194,7 +3466,6 @@ - @@ -3256,6 +3527,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters index ad8f6e7e..e8f79131 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -149,6 +149,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -203,6 +329,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -553,13 +682,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -673,8 +802,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1048,6 +1177,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1084,6 +1216,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1153,6 +1402,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1162,9 +1417,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1198,6 +1465,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1216,6 +1501,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1231,6 +1519,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1312,9 +1606,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1330,6 +1630,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1396,6 +1699,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2437,6 +2743,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2473,9 +2782,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2857,6 +3163,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -3027,6 +3339,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3591,6 +3906,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3627,6 +3945,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3822,6 +4350,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3831,6 +4365,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3891,6 +4434,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3912,6 +4470,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -4005,6 +4569,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -4029,6 +4596,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4653,6 +5226,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5247,6 +5823,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5457,9 +6036,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -5639,6 +6215,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj index f4773208..efe9bbfc 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -106,8 +107,8 @@ Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -122,7 +123,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -168,13 +170,13 @@ true - + true - + true - + true @@ -285,7 +287,7 @@ true - + true @@ -654,6 +656,9 @@ true + + true + true @@ -687,6 +692,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -756,15 +878,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -798,6 +938,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -816,6 +974,9 @@ true + + true + true @@ -828,6 +989,12 @@ true + + true + + + true + true @@ -894,9 +1061,15 @@ true + + true + true + + true + true @@ -912,6 +1085,9 @@ true + + true + true @@ -978,6 +1154,9 @@ true + + true + true @@ -1974,6 +2153,9 @@ true + + true + true @@ -2001,9 +2183,6 @@ true - - true - true @@ -2323,7 +2502,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2384,6 +2567,7 @@ + @@ -2572,6 +2756,7 @@ + @@ -2584,6 +2769,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2649,9 +2904,14 @@ + + + + + @@ -2672,6 +2932,11 @@ + + + + + @@ -2679,6 +2944,8 @@ + + @@ -2710,6 +2977,7 @@ + @@ -2718,6 +2986,8 @@ + + @@ -2926,6 +3196,7 @@ + @@ -3124,6 +3395,7 @@ + @@ -3194,7 +3466,6 @@ - @@ -3256,6 +3527,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters index eccd02ee..5f251458 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -149,6 +149,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -203,6 +329,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -553,13 +682,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -673,8 +802,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1048,6 +1177,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1084,6 +1216,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1153,6 +1402,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1162,9 +1417,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1198,6 +1465,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1216,6 +1501,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1231,6 +1519,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1312,9 +1606,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1330,6 +1630,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1396,6 +1699,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2437,6 +2743,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2473,9 +2782,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2857,6 +3163,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -3027,6 +3339,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3591,6 +3906,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3627,6 +3945,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3822,6 +4350,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3831,6 +4365,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3891,6 +4434,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3912,6 +4470,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -4005,6 +4569,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -4029,6 +4596,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4653,6 +5226,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5247,6 +5823,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5457,9 +6036,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -5639,6 +6215,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj index 5b5714ea..5de9f99b 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj @@ -63,8 +63,8 @@ Disabled ProgramDatabase - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -106,8 +107,8 @@ Full - ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -122,7 +123,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -168,13 +170,13 @@ true - + true - + true - + true @@ -285,7 +287,7 @@ true - + true @@ -654,6 +656,9 @@ true + + true + true @@ -687,6 +692,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -756,15 +878,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -798,6 +938,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -816,6 +974,9 @@ true + + true + true @@ -828,6 +989,12 @@ true + + true + + + true + true @@ -894,9 +1061,15 @@ true + + true + true + + true + true @@ -912,6 +1085,9 @@ true + + true + true @@ -978,6 +1154,9 @@ true + + true + true @@ -1974,6 +2153,9 @@ true + + true + true @@ -2001,9 +2183,6 @@ true - - true - true @@ -2323,7 +2502,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2384,6 +2567,7 @@ + @@ -2572,6 +2756,7 @@ + @@ -2584,6 +2769,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2649,9 +2904,14 @@ + + + + + @@ -2672,6 +2932,11 @@ + + + + + @@ -2679,6 +2944,8 @@ + + @@ -2710,6 +2977,7 @@ + @@ -2718,6 +2986,8 @@ + + @@ -2926,6 +3196,7 @@ + @@ -3124,6 +3395,7 @@ + @@ -3194,7 +3466,6 @@ - @@ -3256,6 +3527,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters index 816c592a..f34e2d5d 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -149,6 +149,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -203,6 +329,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -553,13 +682,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -673,8 +802,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -1048,6 +1177,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1084,6 +1216,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1153,6 +1402,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1162,9 +1417,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1198,6 +1465,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1216,6 +1501,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1231,6 +1519,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1312,9 +1606,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1330,6 +1630,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1396,6 +1699,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2437,6 +2743,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2473,9 +2782,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2857,6 +3163,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -3027,6 +3339,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3591,6 +3906,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3627,6 +3945,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3822,6 +4350,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3831,6 +4365,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3891,6 +4434,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3912,6 +4470,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -4005,6 +4569,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -4029,6 +4596,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4653,6 +5226,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -5247,6 +5823,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5457,9 +6036,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -5639,6 +6215,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff --git a/extras/UnitTestRunner/CMakeLists.txt b/extras/UnitTestRunner/CMakeLists.txt index 41aebec5..ee7f65b3 100644 --- a/extras/UnitTestRunner/CMakeLists.txt +++ b/extras/UnitTestRunner/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -28,6 +28,8 @@ juce_generate_juce_header(UnitTestRunner) target_sources(UnitTestRunner PRIVATE Source/Main.cpp) target_compile_definitions(UnitTestRunner PRIVATE + JUCE_PLUGINHOST_LV2=1 + JUCE_PLUGINHOST_VST3=1 JUCE_UNIT_TESTS=1 JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0) diff --git a/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp b/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp new file mode 100644 index 00000000..e0c34d43 --- /dev/null +++ b/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_ara.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp b/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp new file mode 100644 index 00000000..64b4d5f4 --- /dev/null +++ b/extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/extras/UnitTestRunner/Source/Main.cpp b/extras/UnitTestRunner/Source/Main.cpp index 35e0feff..b78d5c1f 100644 --- a/extras/UnitTestRunner/Source/Main.cpp +++ b/extras/UnitTestRunner/Source/Main.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/extras/UnitTestRunner/UnitTestRunner.jucer b/extras/UnitTestRunner/UnitTestRunner.jucer index 4db588a0..b340c140 100644 --- a/extras/UnitTestRunner/UnitTestRunner.jucer +++ b/extras/UnitTestRunner/UnitTestRunner.jucer @@ -167,7 +167,7 @@ useGlobalPath="0"/> - + diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj index b16fe4dc..aadf0645 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj +++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -77,7 +77,8 @@ stdcpp14 - _DEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) $(OutDir)\juce_dll.lib @@ -105,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60106;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -118,7 +119,8 @@ stdcpp14 - NDEBUG;%(PreprocessorDefinitions) + ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) $(OutDir)\juce_dll.lib @@ -151,13 +153,13 @@ true - + true - + true - + true @@ -268,7 +270,7 @@ true - + true @@ -637,6 +639,9 @@ true + + true + true @@ -670,6 +675,123 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -739,15 +861,33 @@ true + + true + + + true + true true + + true + + + true + + + true + true + + true + true @@ -781,6 +921,24 @@ true + + true + + + true + + + true + + + true + + + true + + + true + true @@ -799,6 +957,9 @@ true + + true + true @@ -811,6 +972,12 @@ true + + true + + + true + true @@ -877,9 +1044,15 @@ true + + true + true + + true + true @@ -895,6 +1068,9 @@ true + + true + true @@ -961,6 +1137,9 @@ true + + true + true @@ -1849,6 +2028,9 @@ true + + true + true @@ -1876,9 +2058,6 @@ true - - true - true @@ -2149,7 +2328,11 @@ - + + /bigobj %(AdditionalOptions) + + + @@ -2202,6 +2385,7 @@ + @@ -2390,6 +2574,7 @@ + @@ -2402,6 +2587,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2467,9 +2722,14 @@ + + + + + @@ -2490,6 +2750,11 @@ + + + + + @@ -2497,6 +2762,8 @@ + + @@ -2528,6 +2795,7 @@ + @@ -2536,6 +2804,8 @@ + + @@ -2697,6 +2967,7 @@ + @@ -2895,6 +3166,7 @@ + @@ -2965,7 +3237,6 @@ - @@ -3012,6 +3283,7 @@ + diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters index 6b1f6585..b7d5cfa7 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters +++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters @@ -134,6 +134,132 @@ {86737735-F6BA-F64A-5EC7-5C9F36755F79} + + {CDCCDBC1-E1A7-558D-D4AA-B48003178AE3} + + + {6656EC0E-A4C5-985B-242F-01890BDEFB1B} + + + {107F6637-689A-6DAC-1F5D-FD9734F3A0D9} + + + {C60CB2F9-12ED-74A2-C81C-366287805252} + + + {0BE3157E-54F5-3F72-7023-A62A81D83443} + + + {AD43AFB9-8A3D-C470-E098-4ADA2D6B1C07} + + + {77E6DFCD-32E7-A7E2-75E9-50C49384FEDA} + + + {8449F5A3-222A-3C21-88BD-2ACA69CD290A} + + + {50066622-9190-C54D-FE24-563064A80DB4} + + + {E8F398A4-2CFC-D98B-343B-FB06B6B54063} + + + {18BD9026-D673-60FB-C5C0-E4234E9FE71C} + + + {E469C933-C0FE-3A95-168B-234F8B4B620B} + + + {375C3EDB-D1F5-AA38-D498-B462B7BDEDE9} + + + {2E0391E6-2B82-F704-4B16-9EF63C4E25C1} + + + {D1C825D2-2980-075A-3EC0-43930977748F} + + + {B350BD14-1FB6-A9A0-4725-75CFEFC2D067} + + + {96D16B7E-5FC5-182E-8734-37C9D27C2299} + + + {56518C02-F710-7D5E-09E6-4B152D5900C7} + + + {8D78CFF1-6E9E-3E78-317D-7954EE6482BB} + + + {6B811726-62F3-6E7C-BE8E-493A61CAA9E4} + + + {C84EE2C8-14A3-D098-62A4-E1C75B7FA13A} + + + {42DD7AA9-DF7D-D9F9-E50C-69C44211A42B} + + + {009A44FF-D1C5-47C0-64CC-9122107C73D1} + + + {AAEE24C0-066F-8593-70EA-B7AC7553E885} + + + {CEC45021-32A4-16BA-8E12-023B029608CD} + + + {E5DFE07F-5901-AF5C-7759-84EBF9717E5E} + + + {3A189BF7-28D6-C0C4-B831-97AD9E46FE5A} + + + {829FC6C3-87E7-0491-B8C3-DC3905FB6039} + + + {49174595-84D0-A512-B98C-0CFD2D772B8A} + + + {E27C67CB-E138-DCCB-110D-623E2C01F9BC} + + + {392635C4-010A-C8A2-F46D-1A3628445E1C} + + + {1FF26A52-F9B9-625F-DEE9-8FEE0C02F0F4} + + + {3A5A13A1-B57C-EF05-AC38-53B08A4C8D4A} + + + {97983FD5-3F19-2B58-4941-D8FBB6B92BA4} + + + {ADC9725E-0948-5908-13BD-0275DB25325A} + + + {37AD6CD9-9FE5-A457-B1FE-36A85F973502} + + + {0F3B119C-FE8B-3978-2D80-53248BBBCDEA} + + + {5E836BFC-319A-1CE7-13C9-BD9E87F0A228} + + + {5D8E291B-1BB8-3A55-0939-D13A8589C395} + + + {BE3B7D89-2DE8-3CA1-B00E-55821EF3AAAC} + + + {E0DE9D5D-2792-148A-2CE1-182A90DD5F0E} + + + {DC27B453-334E-6965-BAD5-7F88C3E5BA46} + {4DC60E78-BBC0-B540-63A2-37E14ABBEF09} @@ -188,6 +314,9 @@ {D0584AC3-6837-14F6-90BF-5EA604D1F074} + + {3CB9AC9F-1F99-25B3-8DC1-7DBB67D2E20C} + {794B64EC-B809-32E3-AD00-4EE6A74802CA} @@ -481,13 +610,13 @@ JUCE Modules\juce_audio_basics\buffers - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump - + JUCE Modules\juce_audio_basics\midi\ump @@ -601,8 +730,8 @@ JUCE Modules\juce_audio_devices\audio_io - - JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\audio_io JUCE Modules\juce_audio_devices\midi_io @@ -976,6 +1105,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -1012,6 +1144,123 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\src + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -1081,6 +1330,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1090,9 +1345,21 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -1126,6 +1393,24 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -1144,6 +1429,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -1159,6 +1447,12 @@ JUCE Modules\juce_audio_processors + + JUCE Modules\juce_audio_processors + + + JUCE Modules\juce_audio_processors + JUCE Modules\juce_audio_utils\audio_cd @@ -1240,9 +1534,15 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -1258,6 +1558,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -1324,6 +1627,9 @@ JUCE Modules\juce_core\misc + + JUCE Modules\juce_core\native + JUCE Modules\juce_core\native @@ -2254,6 +2560,9 @@ JUCE Modules\juce_gui_basics\mouse + + JUCE Modules\juce_gui_basics\native\accessibility + JUCE Modules\juce_gui_basics\native\accessibility @@ -2290,9 +2599,6 @@ JUCE Modules\juce_gui_basics\native - - JUCE Modules\juce_gui_basics\native - JUCE Modules\juce_gui_basics\native @@ -2620,6 +2926,12 @@ JUCE Library Code + + JUCE Library Code + + + JUCE Library Code + JUCE Library Code @@ -2766,6 +3078,9 @@ JUCE Modules\juce_audio_basics\native + + JUCE Modules\juce_audio_basics\native + JUCE Modules\juce_audio_basics\sources @@ -3330,6 +3645,9 @@ JUCE Modules\juce_audio_formats\codecs + + JUCE Modules\juce_audio_formats\format + JUCE Modules\juce_audio_formats\format @@ -3366,6 +3684,216 @@ JUCE Modules\juce_audio_processors\format + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\lilv + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lilv\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\atom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\buf-size + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\core + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\data-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\dynmanifest + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\event + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\instance-access + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\log + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\midi + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\morph + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\options + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\parameters + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\patch + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-groups + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\port-props + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\presets + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\resize-port + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\state + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\time + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\ui + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\units + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\uri-map + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\urid + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\lv2\lv2\worker + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\serd + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\serd\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\sord + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src\zix + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sord\src + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK\sratom\sratom + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + + + JUCE Modules\juce_audio_processors\format_types\pslextensions + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base\source @@ -3561,6 +4089,12 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3570,6 +4104,15 @@ JUCE Modules\juce_audio_processors\format_types + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + + + JUCE Modules\juce_audio_processors\format_types + JUCE Modules\juce_audio_processors\format_types @@ -3630,6 +4173,21 @@ JUCE Modules\juce_audio_processors\scanning + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + + + JUCE Modules\juce_audio_processors\utilities\ARA + JUCE Modules\juce_audio_processors\utilities @@ -3651,6 +4209,12 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors\utilities @@ -3744,6 +4308,9 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\containers + JUCE Modules\juce_core\containers @@ -3768,6 +4335,12 @@ JUCE Modules\juce_core\containers + + JUCE Modules\juce_core\files + + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -4251,6 +4824,9 @@ JUCE Modules\juce_events\native + + JUCE Modules\juce_events\native + JUCE Modules\juce_events\native @@ -4845,6 +5421,9 @@ JUCE Modules\juce_gui_basics\native\x11 + + JUCE Modules\juce_gui_basics\native + JUCE Modules\juce_gui_basics\native @@ -5055,9 +5634,6 @@ JUCE Modules\juce_gui_extra\misc - - JUCE Modules\juce_gui_extra\native - JUCE Modules\juce_gui_extra\native @@ -5192,6 +5768,9 @@ JUCE Modules\juce_audio_formats\codecs\oggvorbis + + JUCE Modules\juce_audio_processors\format_types\LV2_SDK + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\base diff --git a/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_ara.cpp b/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_ara.cpp new file mode 100644 index 00000000..e0c34d43 --- /dev/null +++ b/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_ara.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp b/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp new file mode 100644 index 00000000..64b4d5f4 --- /dev/null +++ b/extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 0a1c4864..a51590cc 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -1,15 +1,15 @@ # ============================================================================== # # This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited +# Copyright (c) 2022 - Raw Material Software Limited # # JUCE is an open source library subject to commercial or open-source # licensing. # -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. # -# End User License Agreement: www.juce.com/juce-6-licence +# End User License Agreement: www.juce.com/juce-7-licence # Privacy Policy: www.juce.com/juce-privacy-policy # # Or: You may also use this code under the terms of the GPL v3 (see @@ -44,3 +44,5 @@ juce_add_modules( juce_osc juce_product_unlocking juce_video) + +add_subdirectory(juce_audio_plugin_client) diff --git a/modules/juce_analytics/analytics/juce_Analytics.cpp b/modules/juce_analytics/analytics/juce_Analytics.cpp index 61b43cd5..07acbc58 100644 --- a/modules/juce_analytics/analytics/juce_Analytics.cpp +++ b/modules/juce_analytics/analytics/juce_Analytics.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_analytics/analytics/juce_Analytics.h b/modules/juce_analytics/analytics/juce_Analytics.h index d83b25be..2c61d5b6 100644 --- a/modules/juce_analytics/analytics/juce_Analytics.h +++ b/modules/juce_analytics/analytics/juce_Analytics.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_analytics/analytics/juce_ButtonTracker.cpp b/modules/juce_analytics/analytics/juce_ButtonTracker.cpp index 6e586c08..8a221cf5 100644 --- a/modules/juce_analytics/analytics/juce_ButtonTracker.cpp +++ b/modules/juce_analytics/analytics/juce_ButtonTracker.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_analytics/analytics/juce_ButtonTracker.h b/modules/juce_analytics/analytics/juce_ButtonTracker.h index f2da6d41..91d947d0 100644 --- a/modules/juce_analytics/analytics/juce_ButtonTracker.h +++ b/modules/juce_analytics/analytics/juce_ButtonTracker.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_analytics/destinations/juce_AnalyticsDestination.h b/modules/juce_analytics/destinations/juce_AnalyticsDestination.h index 46fd0882..b3bf37ed 100644 --- a/modules/juce_analytics/destinations/juce_AnalyticsDestination.h +++ b/modules/juce_analytics/destinations/juce_AnalyticsDestination.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp b/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp index fd492d7a..4369c3dc 100644 --- a/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp +++ b/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h b/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h index c868a37f..7db79be2 100644 --- a/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h +++ b/modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_analytics/juce_analytics.cpp b/modules/juce_analytics/juce_analytics.cpp index a7c733b1..dd1eb266 100644 --- a/modules/juce_analytics/juce_analytics.cpp +++ b/modules/juce_analytics/juce_analytics.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_analytics/juce_analytics.h b/modules/juce_analytics/juce_analytics.h index ff53d868..22e19fdf 100644 --- a/modules/juce_analytics/juce_analytics.h +++ b/modules/juce_analytics/juce_analytics.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_analytics vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE analytics classes description: Classes to collect analytics and send to destinations website: http://www.juce.com/juce diff --git a/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h b/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h index 17bc7d83..031a76df 100644 --- a/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h +++ b/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -152,8 +152,60 @@ public: bool drop = false, pulldown = false; }; + /** Describes a musical time signature. + + @see PositionInfo::getTimeSignature() PositionInfo::setTimeSignature() + */ + struct JUCE_API TimeSignature + { + /** Time signature numerator, e.g. the 3 of a 3/4 time sig */ + int numerator = 4; + + /** Time signature denominator, e.g. the 4 of a 3/4 time sig */ + int denominator = 4; + + bool operator== (const TimeSignature& other) const + { + const auto tie = [] (auto& x) { return std::tie (x.numerator, x.denominator); }; + return tie (*this) == tie (other); + } + + bool operator!= (const TimeSignature& other) const + { + return ! operator== (other); + } + }; + + /** Holds the begin and end points of a looped region. + + @see PositionInfo::getIsLooping() PositionInfo::setIsLooping() PositionInfo::getLoopPoints() PositionInfo::setLoopPoints() + */ + struct JUCE_API LoopPoints + { + /** The current cycle start position in units of quarter-notes. */ + double ppqStart = 0; + + /** The current cycle end position in units of quarter-notes. */ + double ppqEnd = 0; + + bool operator== (const LoopPoints& other) const + { + const auto tie = [] (auto& x) { return std::tie (x.ppqStart, x.ppqEnd); }; + return tie (*this) == tie (other); + } + + bool operator!= (const LoopPoints& other) const + { + return ! operator== (other); + } + }; + //============================================================================== - /** This structure is filled-in by the AudioPlayHead::getCurrentPosition() method. + /** This type is deprecated; prefer PositionInfo instead. + + Some position info may be unavailable, depending on the host or plugin format. + Unfortunately, CurrentPositionInfo doesn't have any way of differentiating between + default values and values that have been set explicitly. */ struct JUCE_API CurrentPositionInfo { @@ -162,6 +214,7 @@ public: /** Time signature numerator, e.g. the 3 of a 3/4 time sig */ int timeSigNumerator = 4; + /** Time signature denominator, e.g. the 4 of a 3/4 time sig */ int timeSigDenominator = 4; @@ -248,7 +301,208 @@ public: }; //============================================================================== - /** Fills-in the given structure with details about the transport's + /** + Describes the time at the start of the current audio callback. + + Not all hosts and plugin formats can provide all of the possible time + information, so most of the getter functions in this class return + an Optional that will only be engaged if the host provides the corresponding + information. As a plugin developer, you should code defensively so that + the plugin behaves sensibly even when the host fails to provide timing + information. + + A default-constructed instance of this class will return nullopt from + all functions that return an Optional. + */ + class PositionInfo + { + public: + /** Returns the number of samples that have elapsed. */ + Optional getTimeInSamples() const { return getOptional (flagTimeSamples, timeInSamples); } + + /** @see getTimeInSamples() */ + void setTimeInSamples (Optional timeInSamplesIn) { setOptional (flagTimeSamples, timeInSamples, timeInSamplesIn); } + + /** Returns the number of samples that have elapsed. */ + Optional getTimeInSeconds() const { return getOptional (flagTimeSeconds, timeInSeconds); } + + /** @see getTimeInSamples() */ + void setTimeInSeconds (Optional timeInSecondsIn) { setOptional (flagTimeSeconds, timeInSeconds, timeInSecondsIn); } + + /** Returns the bpm, if available. */ + Optional getBpm() const { return getOptional (flagTempo, tempoBpm); } + + /** @see getBpm() */ + void setBpm (Optional bpmIn) { setOptional (flagTempo, tempoBpm, bpmIn); } + + /** Returns the time signature, if available. */ + Optional getTimeSignature() const { return getOptional (flagTimeSignature, timeSignature); } + + /** @see getTimeSignature() */ + void setTimeSignature (Optional timeSignatureIn) { setOptional (flagTimeSignature, timeSignature, timeSignatureIn); } + + /** Returns host loop points, if available. */ + Optional getLoopPoints() const { return getOptional (flagLoopPoints, loopPoints); } + + /** @see getLoopPoints() */ + void setLoopPoints (Optional loopPointsIn) { setOptional (flagLoopPoints, loopPoints, loopPointsIn); } + + /** The number of bars since the beginning of the timeline. + + This value isn't available in all hosts or in all plugin formats. + */ + Optional getBarCount() const { return getOptional (flagBarCount, barCount); } + + /** @see getBarCount() */ + void setBarCount (Optional barCountIn) { setOptional (flagBarCount, barCount, barCountIn); } + + /** The position of the start of the last bar, in units of quarter-notes. + + This is the time from the start of the timeline to the start of the current + bar, in ppq units. + + Note - this value may be unavailable on some hosts, e.g. Pro-Tools. + */ + Optional getPpqPositionOfLastBarStart() const { return getOptional (flagLastBarStartPpq, lastBarStartPpq); } + + /** @see getPpqPositionOfLastBarStart() */ + void setPpqPositionOfLastBarStart (Optional positionIn) { setOptional (flagLastBarStartPpq, lastBarStartPpq, positionIn); } + + /** The video frame rate, if available. */ + Optional getFrameRate() const { return getOptional (flagFrameRate, frame); } + + /** @see getFrameRate() */ + void setFrameRate (Optional frameRateIn) { setOptional (flagFrameRate, frame, frameRateIn); } + + /** The current play position, in units of quarter-notes. */ + Optional getPpqPosition() const { return getOptional (flagPpqPosition, positionPpq); } + + /** @see getPpqPosition() */ + void setPpqPosition (Optional ppqPositionIn) { setOptional (flagPpqPosition, positionPpq, ppqPositionIn); } + + /** For timecode, the position of the start of the timeline, in seconds from 00:00:00:00. */ + Optional getEditOriginTime() const { return getOptional (flagOriginTime, originTime); } + + /** @see getEditOriginTime() */ + void setEditOriginTime (Optional editOriginTimeIn) { setOptional (flagOriginTime, originTime, editOriginTimeIn); } + + /** Get the host's callback time in nanoseconds, if available. */ + Optional getHostTimeNs() const { return getOptional (flagHostTimeNs, hostTimeNs); } + + /** @see getHostTimeNs() */ + void setHostTimeNs (Optional hostTimeNsIn) { setOptional (flagHostTimeNs, hostTimeNs, hostTimeNsIn); } + + /** True if the transport is currently playing. */ + bool getIsPlaying() const { return getFlag (flagIsPlaying); } + + /** @see getIsPlaying() */ + void setIsPlaying (bool isPlayingIn) { setFlag (flagIsPlaying, isPlayingIn); } + + /** True if the transport is currently recording. + + (When isRecording is true, then isPlaying will also be true). + */ + bool getIsRecording() const { return getFlag (flagIsRecording); } + + /** @see getIsRecording() */ + void setIsRecording (bool isRecordingIn) { setFlag (flagIsRecording, isRecordingIn); } + + /** True if the transport is currently looping. */ + bool getIsLooping() const { return getFlag (flagIsLooping); } + + /** @see getIsLooping() */ + void setIsLooping (bool isLoopingIn) { setFlag (flagIsLooping, isLoopingIn); } + + bool operator== (const PositionInfo& other) const noexcept + { + const auto tie = [] (const PositionInfo& i) + { + return std::make_tuple (i.getTimeInSamples(), + i.getTimeInSeconds(), + i.getPpqPosition(), + i.getEditOriginTime(), + i.getPpqPositionOfLastBarStart(), + i.getFrameRate(), + i.getBarCount(), + i.getTimeSignature(), + i.getBpm(), + i.getLoopPoints(), + i.getHostTimeNs(), + i.getIsPlaying(), + i.getIsRecording(), + i.getIsLooping()); + }; + + return tie (*this) == tie (other); + } + + bool operator!= (const PositionInfo& other) const noexcept + { + return ! operator== (other); + } + + private: + bool getFlag (int64_t flagToCheck) const + { + return (flagToCheck & flags) != 0; + } + + void setFlag (int64_t flagToCheck, bool value) + { + flags = (value ? flags | flagToCheck : flags & ~flagToCheck); + } + + template + Optional getOptional (int64_t flagToCheck, Value value) const + { + return getFlag (flagToCheck) ? makeOptional (std::move (value)) : nullopt; + } + + template + void setOptional (int64_t flagToCheck, Value& value, Optional opt) + { + if (opt.hasValue()) + value = *opt; + + setFlag (flagToCheck, opt.hasValue()); + } + + enum + { + flagTimeSignature = 1 << 0, + flagLoopPoints = 1 << 1, + flagFrameRate = 1 << 2, + flagTimeSeconds = 1 << 3, + flagLastBarStartPpq = 1 << 4, + flagPpqPosition = 1 << 5, + flagOriginTime = 1 << 6, + flagTempo = 1 << 7, + flagTimeSamples = 1 << 8, + flagBarCount = 1 << 9, + flagHostTimeNs = 1 << 10, + flagIsPlaying = 1 << 11, + flagIsRecording = 1 << 12, + flagIsLooping = 1 << 13 + }; + + TimeSignature timeSignature; + LoopPoints loopPoints; + FrameRate frame = FrameRateType::fps23976; + double timeInSeconds = 0.0; + double lastBarStartPpq = 0.0; + double positionPpq = 0.0; + double originTime = 0.0; + double tempoBpm = 0.0; + int64_t timeInSamples = 0; + int64_t barCount = 0; + uint64_t hostTimeNs = 0; + int64_t flags = 0; + }; + + //============================================================================== + /** Deprecated, use getPosition() instead. + + Fills-in the given structure with details about the transport's position at the start of the current processing block. If this method returns false then the current play head position is not available and the given structure will be undefined. @@ -258,7 +512,66 @@ public: in which a time would make sense, and some hosts will almost certainly have multithreading issues if it's not called on the audio thread. */ - virtual bool getCurrentPosition (CurrentPositionInfo& result) = 0; + [[deprecated ("Use getPosition instead. Not all hosts are able to provide all time position information; getPosition differentiates clearly between set and unset fields.")]] + bool getCurrentPosition (CurrentPositionInfo& result) + { + if (const auto pos = getPosition()) + { + result.resetToDefault(); + + if (const auto sig = pos->getTimeSignature()) + { + result.timeSigNumerator = sig->numerator; + result.timeSigDenominator = sig->denominator; + } + + if (const auto loop = pos->getLoopPoints()) + { + result.ppqLoopStart = loop->ppqStart; + result.ppqLoopEnd = loop->ppqEnd; + } + + if (const auto frame = pos->getFrameRate()) + result.frameRate = *frame; + + if (const auto timeInSeconds = pos->getTimeInSeconds()) + result.timeInSeconds = *timeInSeconds; + + if (const auto lastBarStartPpq = pos->getPpqPositionOfLastBarStart()) + result.ppqPositionOfLastBarStart = *lastBarStartPpq; + + if (const auto ppqPosition = pos->getPpqPosition()) + result.ppqPosition = *ppqPosition; + + if (const auto originTime = pos->getEditOriginTime()) + result.editOriginTime = *originTime; + + if (const auto bpm = pos->getBpm()) + result.bpm = *bpm; + + if (const auto timeInSamples = pos->getTimeInSamples()) + result.timeInSamples = *timeInSamples; + + return true; + } + + return false; + } + + /** Fetches details about the transport's position at the start of the current + processing block. If this method returns nullopt then the current play head + position is not available. + + A non-null return value just indicates that the host was able to provide + *some* relevant timing information. Individual PositionInfo getters may + still return nullopt. + + You can ONLY call this from your processBlock() method! Calling it at other + times will produce undefined behaviour, as the host may not have any context + in which a time would make sense, and some hosts will almost certainly have + multithreading issues if it's not called on the audio thread. + */ + virtual Optional getPosition() const = 0; /** Returns true if this object can control the transport. */ virtual bool canControlTransport() { return false; } diff --git a/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp b/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp index f7d74fd8..2a359f3b 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp +++ b/modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h b/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h index 423175f2..3c96befa 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h +++ b/modules/juce_audio_basics/buffers/juce_AudioChannelSet.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -240,7 +240,13 @@ public: /** Creates a set for a 9.1.6 surround setup (left, right, centre, LFE, leftSurroundSide, rightSurroundSide, leftSurroundRear, rightSurroundRear, wideLeft, wideRight, topFrontLeft, topFrontRight, topSideLeft, topSideRight, topRearLeft, topRearRight). - Is equivalent to: kAudioChannelLayoutTag_Atmos_9_1_6 (CoreAudio). + Note that the VST3 layout arranges the front speakers "L Lc C Rc R", but the JUCE layout + uses the arrangement "wideLeft left centre right wideRight". To maintain the relative + positions of the speakers, the channels will be remapped accordingly. This means that the + VST3 host's "L" channel will be received on a JUCE plugin's "wideLeft" channel, the + "Lc" channel will be received on a JUCE plugin's "left" channel, and so on. + + Is equivalent to: k91_6 (VST3), kAudioChannelLayoutTag_Atmos_9_1_6 (CoreAudio). */ static AudioChannelSet JUCE_CALLTYPE create9point1point6(); diff --git a/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp b/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp index 7f7d59b5..c72e3e3c 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp +++ b/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h b/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h index fa694081..aca7d7ce 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h +++ b/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp b/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp index 52697cfa..2144fa66 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp +++ b/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -23,8 +23,8 @@ namespace juce { -AudioProcessLoadMeasurer::AudioProcessLoadMeasurer() = default; -AudioProcessLoadMeasurer::~AudioProcessLoadMeasurer() = default; +AudioProcessLoadMeasurer::AudioProcessLoadMeasurer() = default; +AudioProcessLoadMeasurer::~AudioProcessLoadMeasurer() = default; void AudioProcessLoadMeasurer::reset() { @@ -33,40 +33,47 @@ void AudioProcessLoadMeasurer::reset() void AudioProcessLoadMeasurer::reset (double sampleRate, int blockSize) { + const SpinLock::ScopedLockType lock (mutex); + cpuUsageProportion = 0; xruns = 0; samplesPerBlock = blockSize; - - if (sampleRate > 0.0 && blockSize > 0) - { - msPerSample = 1000.0 / sampleRate; - timeToCpuScale = (msPerSample > 0.0) ? (1.0 / msPerSample) : 0.0; - } - else - { - msPerSample = 0; - timeToCpuScale = 0; - } + msPerSample = (sampleRate > 0.0 && blockSize > 0) ? 1000.0 / sampleRate : 0; } void AudioProcessLoadMeasurer::registerBlockRenderTime (double milliseconds) { - registerRenderTime (milliseconds, samplesPerBlock); + const SpinLock::ScopedTryLockType lock (mutex); + + if (lock.isLocked()) + registerRenderTimeLocked (milliseconds, samplesPerBlock); } void AudioProcessLoadMeasurer::registerRenderTime (double milliseconds, int numSamples) { + const SpinLock::ScopedTryLockType lock (mutex); + + if (lock.isLocked()) + registerRenderTimeLocked (milliseconds, numSamples); +} + +void AudioProcessLoadMeasurer::registerRenderTimeLocked (double milliseconds, int numSamples) +{ + if (msPerSample == 0) + return; + const auto maxMilliseconds = numSamples * msPerSample; const auto usedProportion = milliseconds / maxMilliseconds; const auto filterAmount = 0.2; - cpuUsageProportion += filterAmount * (usedProportion - cpuUsageProportion); + const auto proportion = cpuUsageProportion.load(); + cpuUsageProportion = proportion + filterAmount * (usedProportion - proportion); if (milliseconds > maxMilliseconds) ++xruns; } -double AudioProcessLoadMeasurer::getLoadAsProportion() const { return jlimit (0.0, 1.0, cpuUsageProportion); } +double AudioProcessLoadMeasurer::getLoadAsProportion() const { return jlimit (0.0, 1.0, cpuUsageProportion.load()); } double AudioProcessLoadMeasurer::getLoadAsPercentage() const { return 100.0 * getLoadAsProportion(); } int AudioProcessLoadMeasurer::getXRunCount() const { return xruns; } diff --git a/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h b/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h index ea0c1f76..54fbe8de 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h +++ b/modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -96,8 +96,13 @@ public: void registerRenderTime (double millisecondsTaken, int numSamples); private: - double cpuUsageProportion = 0, timeToCpuScale = 0, msPerSample = 0; - int xruns = 0, samplesPerBlock = 0; + void registerRenderTimeLocked (double, int); + + SpinLock mutex; + int samplesPerBlock = 0; + double msPerSample = 0; + std::atomic cpuUsageProportion { 0 }; + std::atomic xruns { 0 }; }; diff --git a/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h b/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h index 8d4b9229..9ea81f51 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h +++ b/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -23,53 +23,6 @@ namespace juce { -#ifndef DOXYGEN -/** The contents of this namespace are used to implement AudioBuffer and should - not be used elsewhere. Their interfaces (and existence) are liable to change! -*/ -namespace detail -{ - /** On iOS/arm7 the alignment of `double` is greater than the alignment of - `std::max_align_t`, so we can't trust max_align_t. Instead, we query - lots of primitive types and use the maximum alignment of all of them. - - We're putting this stuff outside AudioBuffer itself to avoid creating - unnecessary copies for each distinct template instantiation of - AudioBuffer. - - MSVC 2015 doesn't like when we write getMaxAlignment as a loop which - accumulates the max alignment (declarations not allowed in constexpr - function body) so instead we use this recursive version which - instantiates a zillion templates. - */ - - template struct Type {}; - - constexpr size_t getMaxAlignment() noexcept { return 0; } - - template - constexpr size_t getMaxAlignment (Type, Type... tail) noexcept - { - return jmax (alignof (Head), getMaxAlignment (tail...)); - } - - constexpr size_t maxAlignment = getMaxAlignment (Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}, - Type{}); -} // namespace detail -#endif - //============================================================================== /** A multi-channel buffer containing floating point audio samples. @@ -1215,17 +1168,10 @@ public: private: //============================================================================== - int numChannels = 0, size = 0; - size_t allocatedBytes = 0; - Type** channels; - HeapBlock allocatedData; - Type* preallocatedChannelSpace[32]; - bool isClear = false; - void allocateData() { #if (! JUCE_GCC || (__GNUC__ * 100 + __GNUC_MINOR__) >= 409) - static_assert (alignof (Type) <= detail::maxAlignment, + static_assert (alignof (Type) <= maxAlignment, "AudioBuffer cannot hold types with alignment requirements larger than that guaranteed by malloc"); #endif jassert (size >= 0); @@ -1278,6 +1224,43 @@ private: isClear = false; } + /* On iOS/arm7 the alignment of `double` is greater than the alignment of + `std::max_align_t`, so we can't trust max_align_t. Instead, we query + lots of primitive types and use the maximum alignment of all of them. + */ + static constexpr size_t getMaxAlignment() noexcept + { + constexpr size_t alignments[] { alignof (std::max_align_t), + alignof (void*), + alignof (float), + alignof (double), + alignof (long double), + alignof (short int), + alignof (int), + alignof (long int), + alignof (long long int), + alignof (bool), + alignof (char), + alignof (char16_t), + alignof (char32_t), + alignof (wchar_t) }; + + size_t max = 0; + + for (const auto elem : alignments) + max = jmax (max, elem); + + return max; + } + + int numChannels = 0, size = 0; + size_t allocatedBytes = 0; + Type** channels; + HeapBlock allocatedData; + Type* preallocatedChannelSpace[32]; + bool isClear = false; + static constexpr size_t maxAlignment = getMaxAlignment(); + JUCE_LEAK_DETECTOR (AudioBuffer) }; diff --git a/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp b/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp index 47eb058f..1e5af0e6 100644 --- a/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp +++ b/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -1177,245 +1177,245 @@ namespace //============================================================================== template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::clear (FloatType* dest, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::clear (FloatType* dest, + CountType numValues) noexcept { FloatVectorHelpers::clear (dest, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::fill (FloatType* dest, - FloatType valueToFill, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::fill (FloatType* dest, + FloatType valueToFill, + CountType numValues) noexcept { FloatVectorHelpers::fill (dest, valueToFill, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::copy (FloatType* dest, - const FloatType* src, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::copy (FloatType* dest, + const FloatType* src, + CountType numValues) noexcept { memcpy (dest, src, (size_t) numValues * sizeof (FloatType)); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::copyWithMultiply (FloatType* dest, - const FloatType* src, - FloatType multiplier, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::copyWithMultiply (FloatType* dest, + const FloatType* src, + FloatType multiplier, + CountType numValues) noexcept { FloatVectorHelpers::copyWithMultiply (dest, src, multiplier, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::add (FloatType* dest, - FloatType amountToAdd, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::add (FloatType* dest, + FloatType amountToAdd, + CountType numValues) noexcept { FloatVectorHelpers::add (dest, amountToAdd, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::add (FloatType* dest, - const FloatType* src, - FloatType amount, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::add (FloatType* dest, + const FloatType* src, + FloatType amount, + CountType numValues) noexcept { FloatVectorHelpers::add (dest, src, amount, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::add (FloatType* dest, - const FloatType* src, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::add (FloatType* dest, + const FloatType* src, + CountType numValues) noexcept { FloatVectorHelpers::add (dest, src, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::add (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::add (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType num) noexcept { FloatVectorHelpers::add (dest, src1, src2, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::subtract (FloatType* dest, - const FloatType* src, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::subtract (FloatType* dest, + const FloatType* src, + CountType numValues) noexcept { FloatVectorHelpers::subtract (dest, src, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::subtract (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::subtract (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType num) noexcept { FloatVectorHelpers::subtract (dest, src1, src2, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::addWithMultiply (FloatType* dest, - const FloatType* src, - FloatType multiplier, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::addWithMultiply (FloatType* dest, + const FloatType* src, + FloatType multiplier, + CountType numValues) noexcept { FloatVectorHelpers::addWithMultiply (dest, src, multiplier, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::addWithMultiply (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::addWithMultiply (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType num) noexcept { FloatVectorHelpers::addWithMultiply (dest, src1, src2, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::subtractWithMultiply (FloatType* dest, - const FloatType* src, - FloatType multiplier, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::subtractWithMultiply (FloatType* dest, + const FloatType* src, + FloatType multiplier, + CountType numValues) noexcept { FloatVectorHelpers::subtractWithMultiply (dest, src, multiplier, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::subtractWithMultiply (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::subtractWithMultiply (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType num) noexcept { FloatVectorHelpers::subtractWithMultiply (dest, src1, src2, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::multiply (FloatType* dest, - const FloatType* src, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::multiply (FloatType* dest, + const FloatType* src, + CountType numValues) noexcept { FloatVectorHelpers::multiply (dest, src, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::multiply (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::multiply (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType numValues) noexcept { FloatVectorHelpers::multiply (dest, src1, src2, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::multiply (FloatType* dest, - FloatType multiplier, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::multiply (FloatType* dest, + FloatType multiplier, + CountType numValues) noexcept { FloatVectorHelpers::multiply (dest, multiplier, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::multiply (FloatType* dest, - const FloatType* src, - FloatType multiplier, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::multiply (FloatType* dest, + const FloatType* src, + FloatType multiplier, + CountType num) noexcept { FloatVectorHelpers::multiply (dest, src, multiplier, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::negate (FloatType* dest, - const FloatType* src, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::negate (FloatType* dest, + const FloatType* src, + CountType numValues) noexcept { FloatVectorHelpers::negate (dest, src, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::abs (FloatType* dest, - const FloatType* src, - CountType numValues) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::abs (FloatType* dest, + const FloatType* src, + CountType numValues) noexcept { FloatVectorHelpers::abs (dest, src, numValues); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::min (FloatType* dest, - const FloatType* src, - FloatType comp, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::min (FloatType* dest, + const FloatType* src, + FloatType comp, + CountType num) noexcept { FloatVectorHelpers::min (dest, src, comp, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::min (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::min (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType num) noexcept { FloatVectorHelpers::min (dest, src1, src2, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::max (FloatType* dest, - const FloatType* src, - FloatType comp, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::max (FloatType* dest, + const FloatType* src, + FloatType comp, + CountType num) noexcept { FloatVectorHelpers::max (dest, src, comp, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::max (FloatType* dest, - const FloatType* src1, - const FloatType* src2, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::max (FloatType* dest, + const FloatType* src1, + const FloatType* src2, + CountType num) noexcept { FloatVectorHelpers::max (dest, src1, src2, num); } template -void JUCE_CALLTYPE detail::FloatVectorOperationsBase::clip (FloatType* dest, - const FloatType* src, - FloatType low, - FloatType high, - CountType num) noexcept +void JUCE_CALLTYPE FloatVectorOperationsBase::clip (FloatType* dest, + const FloatType* src, + FloatType low, + FloatType high, + CountType num) noexcept { FloatVectorHelpers::clip (dest, src, low, high, num); } template -Range JUCE_CALLTYPE detail::FloatVectorOperationsBase::findMinAndMax (const FloatType* src, - CountType numValues) noexcept +Range JUCE_CALLTYPE FloatVectorOperationsBase::findMinAndMax (const FloatType* src, + CountType numValues) noexcept { return FloatVectorHelpers::findMinAndMax (src, numValues); } template -FloatType JUCE_CALLTYPE detail::FloatVectorOperationsBase::findMinimum (const FloatType* src, - CountType numValues) noexcept +FloatType JUCE_CALLTYPE FloatVectorOperationsBase::findMinimum (const FloatType* src, + CountType numValues) noexcept { return FloatVectorHelpers::findMinimum (src, numValues); } template -FloatType JUCE_CALLTYPE detail::FloatVectorOperationsBase::findMaximum (const FloatType* src, - CountType numValues) noexcept +FloatType JUCE_CALLTYPE FloatVectorOperationsBase::findMaximum (const FloatType* src, + CountType numValues) noexcept { return FloatVectorHelpers::findMaximum (src, numValues); } -template struct detail::FloatVectorOperationsBase; -template struct detail::FloatVectorOperationsBase; -template struct detail::FloatVectorOperationsBase; -template struct detail::FloatVectorOperationsBase; +template struct FloatVectorOperationsBase; +template struct FloatVectorOperationsBase; +template struct FloatVectorOperationsBase; +template struct FloatVectorOperationsBase; void JUCE_CALLTYPE FloatVectorOperations::convertFixedToFloat (float* dest, const int* src, float multiplier, size_t num) noexcept { @@ -1567,7 +1567,7 @@ public: const int num = random.nextInt (range) + 1; HeapBlock buffer1 (num + 16), buffer2 (num + 16); - HeapBlock buffer3 (num + 16); + HeapBlock buffer3 (num + 16, true); #if JUCE_ARM ValueType* const data1 = buffer1; diff --git a/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h b/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h index 2bdcef7a..3f0f0366 100644 --- a/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h +++ b/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -32,43 +32,116 @@ namespace juce #endif class ScopedNoDenormals; -#if ! DOXYGEN -namespace detail -{ +//============================================================================== +/** + A collection of simple vector operations on arrays of floating point numbers, + accelerated with SIMD instructions where possible, usually accessed from + the FloatVectorOperations class. + + @code + float data[64]; + // The following two function calls are equivalent: + FloatVectorOperationsBase::clear (data, 64); + FloatVectorOperations::clear (data, 64); + @endcode + + @see FloatVectorOperations + + @tags{Audio} +*/ template struct FloatVectorOperationsBase { + /** Clears a vector of floating point numbers. */ static void JUCE_CALLTYPE clear (FloatType* dest, CountType numValues) noexcept; + + /** Copies a repeated value into a vector of floating point numbers. */ static void JUCE_CALLTYPE fill (FloatType* dest, FloatType valueToFill, CountType numValues) noexcept; + + /** Copies a vector of floating point numbers. */ static void JUCE_CALLTYPE copy (FloatType* dest, const FloatType* src, CountType numValues) noexcept; + + /** Copies a vector of floating point numbers, multiplying each value by a given multiplier */ static void JUCE_CALLTYPE copyWithMultiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType numValues) noexcept; + + /** Adds a fixed value to the destination values. */ static void JUCE_CALLTYPE add (FloatType* dest, FloatType amountToAdd, CountType numValues) noexcept; + + /** Adds a fixed value to each source value and stores it in the destination array. */ static void JUCE_CALLTYPE add (FloatType* dest, const FloatType* src, FloatType amount, CountType numValues) noexcept; + + /** Adds the source values to the destination values. */ static void JUCE_CALLTYPE add (FloatType* dest, const FloatType* src, CountType numValues) noexcept; + + /** Adds each source1 value to the corresponding source2 value and stores the result in the destination array. */ static void JUCE_CALLTYPE add (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept; + + /** Subtracts the source values from the destination values. */ static void JUCE_CALLTYPE subtract (FloatType* dest, const FloatType* src, CountType numValues) noexcept; + + /** Subtracts each source2 value from the corresponding source1 value and stores the result in the destination array. */ static void JUCE_CALLTYPE subtract (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept; + + /** Multiplies each source value by the given multiplier, then adds it to the destination value. */ static void JUCE_CALLTYPE addWithMultiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType numValues) noexcept; + + /** Multiplies each source1 value by the corresponding source2 value, then adds it to the destination value. */ static void JUCE_CALLTYPE addWithMultiply (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept; + + /** Multiplies each source value by the given multiplier, then subtracts it to the destination value. */ static void JUCE_CALLTYPE subtractWithMultiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType numValues) noexcept; + + /** Multiplies each source1 value by the corresponding source2 value, then subtracts it to the destination value. */ static void JUCE_CALLTYPE subtractWithMultiply (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept; + + /** Multiplies the destination values by the source values. */ static void JUCE_CALLTYPE multiply (FloatType* dest, const FloatType* src, CountType numValues) noexcept; + + /** Multiplies each source1 value by the correspinding source2 value, then stores it in the destination array. */ static void JUCE_CALLTYPE multiply (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType numValues) noexcept; + + /** Multiplies each of the destination values by a fixed multiplier. */ static void JUCE_CALLTYPE multiply (FloatType* dest, FloatType multiplier, CountType numValues) noexcept; + + /** Multiplies each of the source values by a fixed multiplier and stores the result in the destination array. */ static void JUCE_CALLTYPE multiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType num) noexcept; + + /** Copies a source vector to a destination, negating each value. */ static void JUCE_CALLTYPE negate (FloatType* dest, const FloatType* src, CountType numValues) noexcept; + + /** Copies a source vector to a destination, taking the absolute of each value. */ static void JUCE_CALLTYPE abs (FloatType* dest, const FloatType* src, CountType numValues) noexcept; + + /** Each element of dest will be the minimum of the corresponding element of the source array and the given comp value. */ static void JUCE_CALLTYPE min (FloatType* dest, const FloatType* src, FloatType comp, CountType num) noexcept; + + /** Each element of dest will be the minimum of the corresponding source1 and source2 values. */ static void JUCE_CALLTYPE min (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept; + + /** Each element of dest will be the maximum of the corresponding element of the source array and the given comp value. */ static void JUCE_CALLTYPE max (FloatType* dest, const FloatType* src, FloatType comp, CountType num) noexcept; + + /** Each element of dest will be the maximum of the corresponding source1 and source2 values. */ static void JUCE_CALLTYPE max (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept; + + /** Each element of dest is calculated by hard clipping the corresponding src element so that it is in the range specified by the arguments low and high. */ static void JUCE_CALLTYPE clip (FloatType* dest, const FloatType* src, FloatType low, FloatType high, CountType num) noexcept; + + /** Finds the minimum and maximum values in the given array. */ static Range JUCE_CALLTYPE findMinAndMax (const FloatType* src, CountType numValues) noexcept; + + /** Finds the minimum value in the given array. */ static FloatType JUCE_CALLTYPE findMinimum (const FloatType* src, CountType numValues) noexcept; + + /** Finds the maximum value in the given array. */ static FloatType JUCE_CALLTYPE findMaximum (const FloatType* src, CountType numValues) noexcept; }; +#if ! DOXYGEN +namespace detail +{ + template struct NameForwarder; @@ -135,15 +208,18 @@ struct NameForwarder : Head, NameForwarder //============================================================================== /** - A collection of simple vector operations on arrays of floats, accelerated with - SIMD instructions where possible. + A collection of simple vector operations on arrays of floating point numbers, + accelerated with SIMD instructions where possible and providing all methods + from FloatVectorOperationsBase. + + @see FloatVectorOperationsBase @tags{Audio} */ -class JUCE_API FloatVectorOperations : public detail::NameForwarder, - detail::FloatVectorOperationsBase, - detail::FloatVectorOperationsBase, - detail::FloatVectorOperationsBase> +class JUCE_API FloatVectorOperations : public detail::NameForwarder, + FloatVectorOperationsBase, + FloatVectorOperationsBase, + FloatVectorOperationsBase> { public: static void JUCE_CALLTYPE convertFixedToFloat (float* dest, const int* src, float multiplier, int num) noexcept; diff --git a/modules/juce_audio_basics/juce_audio_basics.cpp b/modules/juce_audio_basics/juce_audio_basics.cpp index 3d0ab44d..10f3a9bb 100644 --- a/modules/juce_audio_basics/juce_audio_basics.cpp +++ b/modules/juce_audio_basics/juce_audio_basics.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -95,5 +95,5 @@ #if JUCE_UNIT_TESTS #include "utilities/juce_ADSR_test.cpp" - #include "midi/ump/juce_UMPTests.cpp" + #include "midi/ump/juce_UMP_test.cpp" #endif diff --git a/modules/juce_audio_basics/juce_audio_basics.h b/modules/juce_audio_basics/juce_audio_basics.h index 97b559e8..3af0d0ee 100644 --- a/modules/juce_audio_basics/juce_audio_basics.h +++ b/modules/juce_audio_basics/juce_audio_basics.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -32,7 +32,7 @@ ID: juce_audio_basics vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE audio and MIDI data classes description: Classes for audio buffer manipulation, midi message handling, synthesis, etc. website: http://www.juce.com/juce @@ -120,4 +120,4 @@ #include "sources/juce_ReverbAudioSource.h" #include "sources/juce_ToneGeneratorAudioSource.h" #include "synthesisers/juce_Synthesiser.h" -#include "audio_play_head/juce_AudioPlayHead.h" +#include "audio_play_head/juce_AudioPlayHead.h" \ No newline at end of file diff --git a/modules/juce_audio_basics/juce_audio_basics.mm b/modules/juce_audio_basics/juce_audio_basics.mm index 27a6289c..0ffecad3 100644 --- a/modules/juce_audio_basics/juce_audio_basics.mm +++ b/modules/juce_audio_basics/juce_audio_basics.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp b/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp index dfdf41ee..f3bdd2cd 100644 --- a/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp +++ b/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/juce_MidiBuffer.h b/modules/juce_audio_basics/midi/juce_MidiBuffer.h index 583c93ef..6a2a5413 100644 --- a/modules/juce_audio_basics/midi/juce_MidiBuffer.h +++ b/modules/juce_audio_basics/midi/juce_MidiBuffer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h b/modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h index 342c33c5..f5863718 100644 --- a/modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h +++ b/modules/juce_audio_basics/midi/juce_MidiDataConcatenator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/juce_MidiFile.cpp b/modules/juce_audio_basics/midi/juce_MidiFile.cpp index dd1c4329..67795b45 100644 --- a/modules/juce_audio_basics/midi/juce_MidiFile.cpp +++ b/modules/juce_audio_basics/midi/juce_MidiFile.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -46,18 +46,6 @@ namespace MidiFileHelpers } } - template - struct Optional - { - Optional() = default; - - Optional (const Value& v) - : value (v), valid (true) {} - - Value value = Value(); - bool valid = false; - }; - template struct ReadTrait; @@ -100,23 +88,23 @@ namespace MidiFileHelpers auto ch = tryRead (data, remaining); - if (! ch.valid) + if (! ch.hasValue()) return {}; - if (ch.value != ByteOrder::bigEndianInt ("MThd")) + if (*ch != ByteOrder::bigEndianInt ("MThd")) { auto ok = false; - if (ch.value == ByteOrder::bigEndianInt ("RIFF")) + if (*ch == ByteOrder::bigEndianInt ("RIFF")) { for (int i = 0; i < 8; ++i) { ch = tryRead (data, remaining); - if (! ch.valid) + if (! ch.hasValue()) return {}; - if (ch.value == ByteOrder::bigEndianInt ("MThd")) + if (*ch == ByteOrder::bigEndianInt ("MThd")) { ok = true; break; @@ -130,29 +118,29 @@ namespace MidiFileHelpers const auto bytesRemaining = tryRead (data, remaining); - if (! bytesRemaining.valid || bytesRemaining.value > remaining) + if (! bytesRemaining.hasValue() || *bytesRemaining > remaining) return {}; const auto optFileType = tryRead (data, remaining); - if (! optFileType.valid || 2 < optFileType.value) + if (! optFileType.hasValue() || 2 < *optFileType) return {}; const auto optNumTracks = tryRead (data, remaining); - if (! optNumTracks.valid || (optFileType.value == 0 && optNumTracks.value != 1)) + if (! optNumTracks.hasValue() || (*optFileType == 0 && *optNumTracks != 1)) return {}; const auto optTimeFormat = tryRead (data, remaining); - if (! optTimeFormat.valid) + if (! optTimeFormat.hasValue()) return {}; HeaderDetails result; - result.fileType = (short) optFileType.value; - result.timeFormat = (short) optTimeFormat.value; - result.numberOfTracks = (short) optNumTracks.value; + result.fileType = (short) *optFileType; + result.timeFormat = (short) *optTimeFormat; + result.numberOfTracks = (short) *optNumTracks; result.bytesRead = maxSize - remaining; return { result }; @@ -373,10 +361,10 @@ bool MidiFile::readFrom (InputStream& sourceStream, const auto optHeader = MidiFileHelpers::parseMidiHeader (d, size); - if (! optHeader.valid) + if (! optHeader.hasValue()) return false; - const auto header = optHeader.value; + const auto header = *optHeader; timeFormat = header.timeFormat; d += header.bytesRead; @@ -386,20 +374,20 @@ bool MidiFile::readFrom (InputStream& sourceStream, { const auto optChunkType = MidiFileHelpers::tryRead (d, size); - if (! optChunkType.valid) + if (! optChunkType.hasValue()) return false; const auto optChunkSize = MidiFileHelpers::tryRead (d, size); - if (! optChunkSize.valid) + if (! optChunkSize.hasValue()) return false; - const auto chunkSize = optChunkSize.value; + const auto chunkSize = *optChunkSize; if (size < chunkSize) return false; - if (optChunkType.value == ByteOrder::bigEndianInt ("MTrk")) + if (*optChunkType == ByteOrder::bigEndianInt ("MTrk")) readNextTrack (d, (int) chunkSize, createMatchingNoteOffs); size -= chunkSize; @@ -610,7 +598,7 @@ struct MidiFileTest : public UnitTest { // No data const auto header = parseHeader ([] (OutputStream&) {}); - expect (! header.valid); + expect (! header.hasValue()); } { @@ -620,7 +608,7 @@ struct MidiFileTest : public UnitTest writeBytes (os, { 0xff }); }); - expect (! header.valid); + expect (! header.hasValue()); } { @@ -630,7 +618,7 @@ struct MidiFileTest : public UnitTest writeBytes (os, { 'M', 'T', 'h', 'd' }); }); - expect (! header.valid); + expect (! header.hasValue()); } { @@ -640,7 +628,7 @@ struct MidiFileTest : public UnitTest writeBytes (os, { 'M', 'T', 'h', 'd', 0, 0, 0, 6, 0, 0, 0, 16, 0, 1 }); }); - expect (! header.valid); + expect (! header.hasValue()); } { @@ -650,7 +638,7 @@ struct MidiFileTest : public UnitTest writeBytes (os, { 'M', 'T', 'h', 'd', 0, 0, 0, 6, 0, 5, 0, 16, 0, 1 }); }); - expect (! header.valid); + expect (! header.hasValue()); } { @@ -660,12 +648,12 @@ struct MidiFileTest : public UnitTest writeBytes (os, { 'M', 'T', 'h', 'd', 0, 0, 0, 6, 0, 1, 0, 16, 0, 1 }); }); - expect (header.valid); + expect (header.hasValue()); - expectEquals (header.value.fileType, (short) 1); - expectEquals (header.value.numberOfTracks, (short) 16); - expectEquals (header.value.timeFormat, (short) 1); - expectEquals ((int) header.value.bytesRead, 14); + expectEquals (header->fileType, (short) 1); + expectEquals (header->numberOfTracks, (short) 16); + expectEquals (header->timeFormat, (short) 1); + expectEquals ((int) header->bytesRead, 14); } } @@ -674,7 +662,7 @@ struct MidiFileTest : public UnitTest { // Empty input const auto file = parseFile ([] (OutputStream&) {}); - expect (! file.valid); + expect (! file.hasValue()); } { @@ -684,7 +672,7 @@ struct MidiFileTest : public UnitTest writeBytes (os, { 'M', 'T', 'h', 'd' }); }); - expect (! file.valid); + expect (! file.hasValue()); } { @@ -694,8 +682,8 @@ struct MidiFileTest : public UnitTest writeBytes (os, { 'M', 'T', 'h', 'd', 0, 0, 0, 6, 0, 1, 0, 0, 0, 1 }); }); - expect (file.valid); - expectEquals (file.value.getNumTracks(), 0); + expect (file.hasValue()); + expectEquals (file->getNumTracks(), 0); } { @@ -706,7 +694,7 @@ struct MidiFileTest : public UnitTest writeBytes (os, { 'M', 'T', 'r', '?' }); }); - expect (! file.valid); + expect (! file.hasValue()); } { @@ -717,9 +705,9 @@ struct MidiFileTest : public UnitTest writeBytes (os, { 'M', 'T', 'r', 'k', 0, 0, 0, 1, 0xff }); }); - expect (file.valid); - expectEquals (file.value.getNumTracks(), 1); - expectEquals (file.value.getTrack (0)->getNumEvents(), 0); + expect (file.hasValue()); + expectEquals (file->getNumTracks(), 1); + expectEquals (file->getTrack (0)->getNumEvents(), 0); } { @@ -730,7 +718,7 @@ struct MidiFileTest : public UnitTest writeBytes (os, { 'M', 'T', 'r', 'k', 0x0f, 0, 0, 0, 0xff }); }); - expect (! file.valid); + expect (! file.hasValue()); } { @@ -744,10 +732,10 @@ struct MidiFileTest : public UnitTest writeBytes (os, { 0x80, 0x00, 0x00 }); }); - expect (file.valid); - expectEquals (file.value.getNumTracks(), 1); + expect (file.hasValue()); + expectEquals (file->getNumTracks(), 1); - auto& track = *file.value.getTrack (0); + auto& track = *file->getTrack (0); expectEquals (track.getNumEvents(), 1); expect (track.getEventPointer (0)->message.isNoteOff()); expectEquals (track.getEventPointer (0)->message.getTimeStamp(), (double) 0x0f); @@ -766,7 +754,7 @@ struct MidiFileTest : public UnitTest } template - static MidiFileHelpers::Optional parseHeader (Fn&& fn) + static Optional parseHeader (Fn&& fn) { MemoryOutputStream os; fn (os); @@ -776,7 +764,7 @@ struct MidiFileTest : public UnitTest } template - static MidiFileHelpers::Optional parseFile (Fn&& fn) + static Optional parseFile (Fn&& fn) { MemoryOutputStream os; fn (os); diff --git a/modules/juce_audio_basics/midi/juce_MidiFile.h b/modules/juce_audio_basics/midi/juce_MidiFile.h index 40662c26..ac8aea5d 100644 --- a/modules/juce_audio_basics/midi/juce_MidiFile.h +++ b/modules/juce_audio_basics/midi/juce_MidiFile.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp b/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp index 2a34076d..1cf11feb 100644 --- a/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp +++ b/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h b/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h index 35c46fa4..4c9bfaf2 100644 --- a/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h +++ b/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/juce_MidiMessage.cpp b/modules/juce_audio_basics/midi/juce_MidiMessage.cpp index 1732ae91..062262b0 100644 --- a/modules/juce_audio_basics/midi/juce_MidiMessage.cpp +++ b/modules/juce_audio_basics/midi/juce_MidiMessage.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/juce_MidiMessage.h b/modules/juce_audio_basics/midi/juce_MidiMessage.h index 0384f553..5241d794 100644 --- a/modules/juce_audio_basics/midi/juce_MidiMessage.h +++ b/modules/juce_audio_basics/midi/juce_MidiMessage.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp b/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp index c9df3ee3..129ad9e0 100644 --- a/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp +++ b/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -306,63 +306,56 @@ void MidiMessageSequence::deleteSysExMessages() //============================================================================== class OptionalPitchWheel { - int value = 0; - bool valid = false; + Optional value; public: void emit (int channel, Array& out) const { - if (valid) - out.add (MidiMessage::pitchWheel (channel, value)); + if (value.hasValue()) + out.add (MidiMessage::pitchWheel (channel, *value)); } void set (int v) { value = v; - valid = true; } }; class OptionalControllerValues { - int values[128]; + Optional values[128]; public: - OptionalControllerValues() - { - std::fill (std::begin (values), std::end (values), -1); - } - void emit (int channel, Array& out) const { for (auto it = std::begin (values); it != std::end (values); ++it) - if (*it != -1) - out.add (MidiMessage::controllerEvent (channel, (int) std::distance (std::begin (values), it), *it)); + if (it->hasValue()) + out.add (MidiMessage::controllerEvent (channel, (int) std::distance (std::begin (values), it), **it)); } void set (int controller, int value) { - values[controller] = value; + values[controller] = (char) value; } }; class OptionalProgramChange { - int value = -1, bankLSB = -1, bankMSB = -1; + Optional value, bankLSB, bankMSB; public: void emit (int channel, double time, Array& out) const { - if (value == -1) + if (! value.hasValue()) return; - if (bankLSB != -1 && bankMSB != -1) + if (bankLSB.hasValue() && bankMSB.hasValue()) { - out.add (MidiMessage::controllerEvent (channel, 0x00, bankMSB).withTimeStamp (time)); - out.add (MidiMessage::controllerEvent (channel, 0x20, bankLSB).withTimeStamp (time)); + out.add (MidiMessage::controllerEvent (channel, 0x00, *bankMSB).withTimeStamp (time)); + out.add (MidiMessage::controllerEvent (channel, 0x20, *bankLSB).withTimeStamp (time)); } - out.add (MidiMessage::programChange (channel, value).withTimeStamp (time)); + out.add (MidiMessage::programChange (channel, *value).withTimeStamp (time)); } // Returns true if this is a bank number change, and false otherwise. @@ -370,22 +363,21 @@ public: { switch (controller) { - case 0x00: bankMSB = v; return true; - case 0x20: bankLSB = v; return true; + case 0x00: bankMSB = (char) v; return true; + case 0x20: bankLSB = (char) v; return true; } return false; } - void setProgram (int v) { value = v; } + void setProgram (int v) { value = (char) v; } }; class ParameterNumberState { enum class Kind { rpn, nrpn }; - int newestRpnLsb = -1, newestRpnMsb = -1, newestNrpnLsb = -1, newestNrpnMsb = -1; - int lastSentLsb = -1, lastSentMsb = -1; + Optional newestRpnLsb, newestRpnMsb, newestNrpnLsb, newestNrpnMsb, lastSentLsb, lastSentMsb; Kind lastSentKind = Kind::rpn, newestKind = Kind::rpn; public: @@ -401,11 +393,11 @@ public: auto lastSent = std::tie (lastSentKind, lastSentMsb, lastSentLsb); const auto newest = std::tie (newestKind, newestMsb, newestLsb); - if (lastSent == newest || newestMsb == -1 || newestLsb == -1) + if (lastSent == newest || ! newestMsb.hasValue() || ! newestLsb.hasValue()) return; - out.add (MidiMessage::controllerEvent (channel, newestKind == Kind::rpn ? 0x65 : 0x63, newestMsb).withTimeStamp (time)); - out.add (MidiMessage::controllerEvent (channel, newestKind == Kind::rpn ? 0x64 : 0x62, newestLsb).withTimeStamp (time)); + out.add (MidiMessage::controllerEvent (channel, newestKind == Kind::rpn ? 0x65 : 0x63, *newestMsb).withTimeStamp (time)); + out.add (MidiMessage::controllerEvent (channel, newestKind == Kind::rpn ? 0x64 : 0x62, *newestLsb).withTimeStamp (time)); lastSent = newest; } @@ -415,10 +407,10 @@ public: { switch (controller) { - case 0x65: newestRpnMsb = value; newestKind = Kind::rpn; return true; - case 0x64: newestRpnLsb = value; newestKind = Kind::rpn; return true; - case 0x63: newestNrpnMsb = value; newestKind = Kind::nrpn; return true; - case 0x62: newestNrpnLsb = value; newestKind = Kind::nrpn; return true; + case 0x65: newestRpnMsb = (char) value; newestKind = Kind::rpn; return true; + case 0x64: newestRpnLsb = (char) value; newestKind = Kind::rpn; return true; + case 0x63: newestNrpnMsb = (char) value; newestKind = Kind::nrpn; return true; + case 0x62: newestNrpnLsb = (char) value; newestKind = Kind::nrpn; return true; } return false; diff --git a/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h b/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h index 698da744..13ddddc8 100644 --- a/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h +++ b/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/juce_MidiRPN.cpp b/modules/juce_audio_basics/midi/juce_MidiRPN.cpp index 24a6c1f8..ae5fc500 100644 --- a/modules/juce_audio_basics/midi/juce_MidiRPN.cpp +++ b/modules/juce_audio_basics/midi/juce_MidiRPN.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -55,11 +55,6 @@ void MidiRPNDetector::reset() noexcept } //============================================================================== -MidiRPNDetector::ChannelState::ChannelState() noexcept - : parameterMSB (0xff), parameterLSB (0xff), valueMSB (0xff), valueLSB (0xff), isNRPN (false) -{ -} - bool MidiRPNDetector::ChannelState::handleController (int channel, int controllerNumber, int value, diff --git a/modules/juce_audio_basics/midi/juce_MidiRPN.h b/modules/juce_audio_basics/midi/juce_MidiRPN.h index dcf0ec47..f1fb9ff0 100644 --- a/modules/juce_audio_basics/midi/juce_MidiRPN.h +++ b/modules/juce_audio_basics/midi/juce_MidiRPN.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -95,14 +95,13 @@ private: //============================================================================== struct ChannelState { - ChannelState() noexcept; bool handleController (int channel, int controllerNumber, int value, MidiRPNMessage&) noexcept; void resetValue() noexcept; bool sendIfReady (int channel, MidiRPNMessage&) noexcept; - uint8 parameterMSB, parameterLSB, valueMSB, valueLSB; - bool isNRPN; + uint8 parameterMSB = 0xff, parameterLSB = 0xff, valueMSB = 0xff, valueLSB = 0xff; + bool isNRPN = false; }; //============================================================================== diff --git a/modules/juce_audio_basics/midi/ump/juce_UMP.h b/modules/juce_audio_basics/midi/ump/juce_UMP.h index e6ce3aff..0fd724ae 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMP.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMP.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPConversion.h b/modules/juce_audio_basics/midi/ump/juce_UMPConversion.h index 86ae3391..8980e1e7 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPConversion.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPConversion.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPConverters.h b/modules/juce_audio_basics/midi/ump/juce_UMPConverters.h index a0bbee91..3639cceb 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPConverters.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPConverters.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h b/modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h index ab1277cc..b2512d2f 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPFactory.h b/modules/juce_audio_basics/midi/ump/juce_UMPFactory.h index f1d937d7..788d34a4 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPFactory.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPFactory.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPIterator.h b/modules/juce_audio_basics/midi/ump/juce_UMPIterator.h index 1800388a..b4dcea9a 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPIterator.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPIterator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h b/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h index 514cd017..f3d4e01c 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp b/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp index 9da72c34..d4c5e275 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp +++ b/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h b/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h index 77e50766..b2a47836 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h b/modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h index 2e6df208..78792bbf 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPProtocols.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h b/modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h index 46785734..6f2cac67 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPReceiver.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp b/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp index a5fdf190..9f8e2ef8 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp +++ b/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h b/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h index be73c172..0d6e8001 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp b/modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp index 166c4bfa..353672f8 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp +++ b/modules/juce_audio_basics/midi/ump/juce_UMPUtils.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPUtils.h b/modules/juce_audio_basics/midi/ump/juce_UMPUtils.h index d55d9cb1..2b86a71f 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPUtils.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPUtils.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPView.cpp b/modules/juce_audio_basics/midi/ump/juce_UMPView.cpp index c5f3db85..37dc324d 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPView.cpp +++ b/modules/juce_audio_basics/midi/ump/juce_UMPView.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPView.h b/modules/juce_audio_basics/midi/ump/juce_UMPView.h index 3033fc18..0186bef6 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPView.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPView.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp b/modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp similarity index 97% rename from modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp rename to modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp index c732a75f..0706b13b 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPTests.cpp +++ b/modules/juce_audio_basics/midi/ump/juce_UMP_test.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPacket.h b/modules/juce_audio_basics/midi/ump/juce_UMPacket.h index 610e3072..c0e855d3 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPacket.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPacket.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPackets.h b/modules/juce_audio_basics/midi/ump/juce_UMPackets.h index b485b100..14dcb44a 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPackets.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPackets.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp b/modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp index 7e0a33f9..576b8b38 100644 --- a/modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp +++ b/modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPEInstrument.h b/modules/juce_audio_basics/mpe/juce_MPEInstrument.h index e4b3cabd..29195741 100644 --- a/modules/juce_audio_basics/mpe/juce_MPEInstrument.h +++ b/modules/juce_audio_basics/mpe/juce_MPEInstrument.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPEMessages.cpp b/modules/juce_audio_basics/mpe/juce_MPEMessages.cpp index 72b86d45..c9109bfa 100644 --- a/modules/juce_audio_basics/mpe/juce_MPEMessages.cpp +++ b/modules/juce_audio_basics/mpe/juce_MPEMessages.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPEMessages.h b/modules/juce_audio_basics/mpe/juce_MPEMessages.h index b27abcd3..70c0d08f 100644 --- a/modules/juce_audio_basics/mpe/juce_MPEMessages.h +++ b/modules/juce_audio_basics/mpe/juce_MPEMessages.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPENote.cpp b/modules/juce_audio_basics/mpe/juce_MPENote.cpp index 32cd2988..ed4414b7 100644 --- a/modules/juce_audio_basics/mpe/juce_MPENote.cpp +++ b/modules/juce_audio_basics/mpe/juce_MPENote.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPENote.h b/modules/juce_audio_basics/mpe/juce_MPENote.h index 05a96893..c0d0afec 100644 --- a/modules/juce_audio_basics/mpe/juce_MPENote.h +++ b/modules/juce_audio_basics/mpe/juce_MPENote.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp b/modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp index fdd19ba4..fde51b29 100644 --- a/modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp +++ b/modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPESynthesiser.h b/modules/juce_audio_basics/mpe/juce_MPESynthesiser.h index 57862c81..9a443c5f 100644 --- a/modules/juce_audio_basics/mpe/juce_MPESynthesiser.h +++ b/modules/juce_audio_basics/mpe/juce_MPESynthesiser.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp b/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp index b9631902..4f1c2afc 100644 --- a/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp +++ b/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h b/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h index fd030ef6..3727249b 100644 --- a/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h +++ b/modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp b/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp index 99179f05..d88804e1 100644 --- a/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp +++ b/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h b/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h index d6ac2454..c2174d72 100644 --- a/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h +++ b/modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPEUtils.cpp b/modules/juce_audio_basics/mpe/juce_MPEUtils.cpp index 4081ad00..bb3d48c3 100644 --- a/modules/juce_audio_basics/mpe/juce_MPEUtils.cpp +++ b/modules/juce_audio_basics/mpe/juce_MPEUtils.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPEUtils.h b/modules/juce_audio_basics/mpe/juce_MPEUtils.h index be503bfb..1cf58dbb 100644 --- a/modules/juce_audio_basics/mpe/juce_MPEUtils.h +++ b/modules/juce_audio_basics/mpe/juce_MPEUtils.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPEValue.cpp b/modules/juce_audio_basics/mpe/juce_MPEValue.cpp index 9f16fa3a..5efd7ac4 100644 --- a/modules/juce_audio_basics/mpe/juce_MPEValue.cpp +++ b/modules/juce_audio_basics/mpe/juce_MPEValue.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPEValue.h b/modules/juce_audio_basics/mpe/juce_MPEValue.h index 5c05ca00..ea8d760c 100644 --- a/modules/juce_audio_basics/mpe/juce_MPEValue.h +++ b/modules/juce_audio_basics/mpe/juce_MPEValue.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp b/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp index 07d41a4c..e51f314d 100644 --- a/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp +++ b/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h b/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h index 3da24ce7..a9703ac7 100644 --- a/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h +++ b/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -41,7 +41,6 @@ struct MPEZone enum class Type { lower, upper }; MPEZone() = default; - MPEZone (const MPEZone& other) = default; MPEZone (Type type, int memberChannels = 0, int perNotePitchbend = 48, int masterPitchbend = 2) : zoneType (type), diff --git a/modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h b/modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h index 9a986dbe..afd0e001 100644 --- a/modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h +++ b/modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h b/modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h new file mode 100644 index 00000000..2c8b64ee --- /dev/null +++ b/modules/juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h @@ -0,0 +1,80 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + + +// This file will be included directly by macOS/iOS-specific .cpps +#pragma once + +#if ! DOXYGEN + +#include + +namespace juce +{ + +struct CoreAudioTimeConversions +{ +public: + CoreAudioTimeConversions() + { + mach_timebase_info_data_t info{}; + mach_timebase_info (&info); + numerator = info.numer; + denominator = info.denom; + } + + uint64_t hostTimeToNanos (uint64_t hostTime) const + { + return multiplyByRatio (hostTime, numerator, denominator); + } + + uint64_t nanosToHostTime (uint64_t nanos) const + { + return multiplyByRatio (nanos, denominator, numerator); + } + +private: + // Adapted from CAHostTimeBase.h in the Core Audio Utility Classes + static uint64_t multiplyByRatio (uint64_t toMultiply, uint64_t numerator, uint64_t denominator) + { + #if defined (__SIZEOF_INT128__) + unsigned __int128 + #else + long double + #endif + result = toMultiply; + + if (numerator != denominator) + { + result *= numerator; + result /= denominator; + } + + return (uint64_t) result; + } + + uint64_t numerator = 0, denominator = 0; +}; + +} // namespace juce + +#endif diff --git a/modules/juce_audio_basics/sources/juce_AudioSource.h b/modules/juce_audio_basics/sources/juce_AudioSource.h index 0122623b..3bc29f77 100644 --- a/modules/juce_audio_basics/sources/juce_AudioSource.h +++ b/modules/juce_audio_basics/sources/juce_AudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp b/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp index 6b2a198e..b0593bb3 100644 --- a/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp +++ b/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -91,9 +91,9 @@ void BufferingAudioSource::releaseResources() buffer.setSize (numberOfChannels, 0); - // MSVC2015 seems to need this if statement to not generate a warning during linking. + // MSVC2017 seems to need this if statement to not generate a warning during linking. // As source is set in the constructor, there is no way that source could - // ever equal this, but it seems to make MSVC2015 happy. + // ever equal this, but it seems to make MSVC2017 happy. if (source != this) source->releaseResources(); } diff --git a/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h b/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h index 7bfa24b1..d751ad7a 100644 --- a/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h +++ b/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp b/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp index 85a4bed0..c7f48543 100644 --- a/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp +++ b/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h b/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h index b226e390..bb13daa8 100644 --- a/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h +++ b/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp b/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp index fdc99f1b..a784c048 100644 --- a/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp +++ b/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h b/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h index 5ff22870..22947fe8 100644 --- a/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h +++ b/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp b/modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp index eb72cc6d..2c8387f5 100644 --- a/modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp +++ b/modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_MemoryAudioSource.h b/modules/juce_audio_basics/sources/juce_MemoryAudioSource.h index 414cc65c..c3b23f28 100644 --- a/modules/juce_audio_basics/sources/juce_MemoryAudioSource.h +++ b/modules/juce_audio_basics/sources/juce_MemoryAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp b/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp index 0b4eda89..79d60e62 100644 --- a/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp +++ b/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_MixerAudioSource.h b/modules/juce_audio_basics/sources/juce_MixerAudioSource.h index ed217643..d99ee341 100644 --- a/modules/juce_audio_basics/sources/juce_MixerAudioSource.h +++ b/modules/juce_audio_basics/sources/juce_MixerAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h b/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h index 2ec17d05..1898bbbc 100644 --- a/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h +++ b/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp b/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp index 90af1de2..e4887270 100644 --- a/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp +++ b/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h b/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h index 58f9d436..ef189962 100644 --- a/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h +++ b/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp b/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp index 2cd1c256..3d7be3ed 100644 --- a/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp +++ b/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h b/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h index 07fc8dc2..1caa615c 100644 --- a/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h +++ b/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp b/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp index f3695cc7..0ad3e0b9 100644 --- a/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp +++ b/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h b/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h index 92adec66..0eb4163d 100644 --- a/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h +++ b/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp b/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp index 388d9d26..c407911f 100644 --- a/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp +++ b/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h b/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h index 53d69006..b9db266c 100644 --- a/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h +++ b/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/utilities/juce_ADSR.h b/modules/juce_audio_basics/utilities/juce_ADSR.h index 52d47c8e..f3737a12 100644 --- a/modules/juce_audio_basics/utilities/juce_ADSR.h +++ b/modules/juce_audio_basics/utilities/juce_ADSR.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -31,6 +31,10 @@ namespace juce with setParameters() then call getNextSample() to get the envelope value to be applied to each audio sample or applyEnvelopeToBuffer() to apply the envelope to a whole buffer. + Do not change the parameters during playback. If you change the parameters before the + release stage has completed then you must call reset() before the next call to + noteOn(). + @tags{Audio} */ class JUCE_API ADSR @@ -153,39 +157,54 @@ public: */ float getNextSample() noexcept { - if (state == State::idle) - return 0.0f; - - if (state == State::attack) + switch (state) { - envelopeVal += attackRate; + case State::idle: + { + return 0.0f; + } + + case State::attack: + { + envelopeVal += attackRate; - if (envelopeVal >= 1.0f) + if (envelopeVal >= 1.0f) + { + envelopeVal = 1.0f; + goToNextState(); + } + + break; + } + + case State::decay: { - envelopeVal = 1.0f; - goToNextState(); + envelopeVal -= decayRate; + + if (envelopeVal <= parameters.sustain) + { + envelopeVal = parameters.sustain; + goToNextState(); + } + + break; } - } - else if (state == State::decay) - { - envelopeVal -= decayRate; - if (envelopeVal <= parameters.sustain) + case State::sustain: { envelopeVal = parameters.sustain; - goToNextState(); + break; } - } - else if (state == State::sustain) - { - envelopeVal = parameters.sustain; - } - else if (state == State::release) - { - envelopeVal -= releaseRate; - if (envelopeVal <= 0.0f) - goToNextState(); + case State::release: + { + envelopeVal -= releaseRate; + + if (envelopeVal <= 0.0f) + goToNextState(); + + break; + } } return envelopeVal; @@ -250,10 +269,18 @@ private: void goToNextState() noexcept { if (state == State::attack) + { state = (decayRate > 0.0f ? State::decay : State::sustain); - else if (state == State::decay) + return; + } + + if (state == State::decay) + { state = State::sustain; - else if (state == State::release) + return; + } + + if (state == State::release) reset(); } diff --git a/modules/juce_audio_basics/utilities/juce_ADSR_test.cpp b/modules/juce_audio_basics/utilities/juce_ADSR_test.cpp index deff9312..94189b9e 100644 --- a/modules/juce_audio_basics/utilities/juce_ADSR_test.cpp +++ b/modules/juce_audio_basics/utilities/juce_ADSR_test.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/utilities/juce_Decibels.h b/modules/juce_audio_basics/utilities/juce_Decibels.h index 601b30c0..e5eb8026 100644 --- a/modules/juce_audio_basics/utilities/juce_Decibels.h +++ b/modules/juce_audio_basics/utilities/juce_Decibels.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/utilities/juce_GenericInterpolator.h b/modules/juce_audio_basics/utilities/juce_GenericInterpolator.h index 1a8ac8f9..084927d2 100644 --- a/modules/juce_audio_basics/utilities/juce_GenericInterpolator.h +++ b/modules/juce_audio_basics/utilities/juce_GenericInterpolator.h @@ -2,19 +2,16 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE diff --git a/modules/juce_audio_basics/utilities/juce_IIRFilter.cpp b/modules/juce_audio_basics/utilities/juce_IIRFilter.cpp index fae0c9f9..fedeb759 100644 --- a/modules/juce_audio_basics/utilities/juce_IIRFilter.cpp +++ b/modules/juce_audio_basics/utilities/juce_IIRFilter.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/utilities/juce_IIRFilter.h b/modules/juce_audio_basics/utilities/juce_IIRFilter.h index 9f6dcc04..3a53e489 100644 --- a/modules/juce_audio_basics/utilities/juce_IIRFilter.h +++ b/modules/juce_audio_basics/utilities/juce_IIRFilter.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/utilities/juce_Interpolators.cpp b/modules/juce_audio_basics/utilities/juce_Interpolators.cpp index 6302f320..9ddaf18b 100644 --- a/modules/juce_audio_basics/utilities/juce_Interpolators.cpp +++ b/modules/juce_audio_basics/utilities/juce_Interpolators.cpp @@ -2,19 +2,16 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE diff --git a/modules/juce_audio_basics/utilities/juce_Interpolators.h b/modules/juce_audio_basics/utilities/juce_Interpolators.h index cdd2c875..0b2d454c 100644 --- a/modules/juce_audio_basics/utilities/juce_Interpolators.h +++ b/modules/juce_audio_basics/utilities/juce_Interpolators.h @@ -2,19 +2,16 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE diff --git a/modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp b/modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp index c1d2809c..d57a5037 100644 --- a/modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp +++ b/modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/utilities/juce_Reverb.h b/modules/juce_audio_basics/utilities/juce_Reverb.h index a1a78b90..8a7ad092 100644 --- a/modules/juce_audio_basics/utilities/juce_Reverb.h +++ b/modules/juce_audio_basics/utilities/juce_Reverb.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp b/modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp index cb581633..e65e06cc 100644 --- a/modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp +++ b/modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/utilities/juce_SmoothedValue.h b/modules/juce_audio_basics/utilities/juce_SmoothedValue.h index 1757966f..21888b85 100644 --- a/modules/juce_audio_basics/utilities/juce_SmoothedValue.h +++ b/modules/juce_audio_basics/utilities/juce_SmoothedValue.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp b/modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp index c278e087..80aefa11 100644 --- a/modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp +++ b/modules/juce_audio_basics/utilities/juce_WindowedSincInterpolator.cpp @@ -2,19 +2,16 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE diff --git a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp index c6b87f32..fa8a59c2 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp +++ b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -69,9 +69,14 @@ public: CallbackHandler (AudioDeviceManager& adm) noexcept : owner (adm) {} private: - void audioDeviceIOCallback (const float** ins, int numIns, float** outs, int numOuts, int numSamples) override + void audioDeviceIOCallbackWithContext (const float** ins, + int numIns, + float** outs, + int numOuts, + int numSamples, + const AudioIODeviceCallbackContext& context) override { - owner.audioDeviceIOCallbackInt (ins, numIns, outs, numOuts, numSamples); + owner.audioDeviceIOCallbackInt (ins, numIns, outs, numOuts, numSamples, context); } void audioDeviceAboutToStart (AudioIODevice* device) override @@ -900,7 +905,8 @@ void AudioDeviceManager::audioDeviceIOCallbackInt (const float** inputChannelDat int numInputChannels, float** outputChannelData, int numOutputChannels, - int numSamples) + int numSamples, + const AudioIODeviceCallbackContext& context) { const ScopedLock sl (audioCallbackLock); @@ -912,15 +918,23 @@ void AudioDeviceManager::audioDeviceIOCallbackInt (const float** inputChannelDat tempBuffer.setSize (jmax (1, numOutputChannels), jmax (1, numSamples), false, false, true); - callbacks.getUnchecked(0)->audioDeviceIOCallback (inputChannelData, numInputChannels, - outputChannelData, numOutputChannels, numSamples); + callbacks.getUnchecked(0)->audioDeviceIOCallbackWithContext (inputChannelData, + numInputChannels, + outputChannelData, + numOutputChannels, + numSamples, + context); auto** tempChans = tempBuffer.getArrayOfWritePointers(); for (int i = callbacks.size(); --i > 0;) { - callbacks.getUnchecked(i)->audioDeviceIOCallback (inputChannelData, numInputChannels, - tempChans, numOutputChannels, numSamples); + callbacks.getUnchecked(i)->audioDeviceIOCallbackWithContext (inputChannelData, + numInputChannels, + tempChans, + numOutputChannels, + numSamples, + context); for (int chan = 0; chan < numOutputChannels; ++chan) { @@ -1074,6 +1088,7 @@ void AudioDeviceManager::setDefaultMidiOutputDevice (const String& identifier) { if (defaultMidiOutputDeviceInfo.identifier != identifier) { + std::unique_ptr oldMidiPort; Array oldCallbacks; { @@ -1085,7 +1100,7 @@ void AudioDeviceManager::setDefaultMidiOutputDevice (const String& identifier) for (int i = oldCallbacks.size(); --i >= 0;) oldCallbacks.getUnchecked (i)->audioDeviceStopped(); - defaultMidiOutput.reset(); + std::swap (oldMidiPort, defaultMidiOutput); if (identifier.isNotEmpty()) defaultMidiOutput = MidiOutput::openDevice (identifier); @@ -1105,7 +1120,7 @@ void AudioDeviceManager::setDefaultMidiOutputDevice (const String& identifier) } updateXml(); - sendChangeMessage(); + sendSynchronousChangeMessage(); } } diff --git a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h index 28b9df01..f288b6e1 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h +++ b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -526,8 +526,12 @@ private: class CallbackHandler; std::unique_ptr callbackHandler; - void audioDeviceIOCallbackInt (const float** inputChannelData, int totalNumInputChannels, - float** outputChannelData, int totalNumOutputChannels, int numSamples); + void audioDeviceIOCallbackInt (const float** inputChannelData, + int totalNumInputChannels, + float** outputChannelData, + int totalNumOutputChannels, + int numSamples, + const AudioIODeviceCallbackContext& context); void audioDeviceAboutToStartInt (AudioIODevice*); void audioDeviceStoppedInt(); void audioDeviceErrorInt (const String&); diff --git a/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp b/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp index 3dc20383..45a83d2b 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp +++ b/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h b/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h index 2e061933..8864ffd7 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h +++ b/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -25,6 +25,14 @@ namespace juce class AudioIODevice; +/** Additional information that may be passed to the AudioIODeviceCallback. */ +struct AudioIODeviceCallbackContext +{ + /** If the host provides this information, this field will be set to point to + an integer holding the current value; otherwise, this will be nullptr. + */ + const uint64_t* hostTimeNs = nullptr; +}; //============================================================================== /** @@ -87,7 +95,26 @@ public: int numInputChannels, float** outputChannelData, int numOutputChannels, - int numSamples) = 0; + int numSamples) + { + ignoreUnused (inputChannelData, numInputChannels, outputChannelData, numOutputChannels, numSamples); + } + + /** The same as audioDeviceIOCallback(), but with an additional context argument. + + The default implementation of this function will call audioDeviceIOCallback(), + but you can override this function if you need to make use of the context information. + */ + virtual void audioDeviceIOCallbackWithContext (const float** inputChannelData, + int numInputChannels, + float** outputChannelData, + int numOutputChannels, + int numSamples, + const AudioIODeviceCallbackContext& context) + { + audioDeviceIOCallback (inputChannelData, numInputChannels, outputChannelData, numOutputChannels, numSamples); + ignoreUnused (context); + } /** Called to indicate that the device is about to start calling back. diff --git a/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp b/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp index 2c08b112..6483a040 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp +++ b/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h b/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h index 6015bc2b..aa08cece 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h +++ b/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp b/modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp new file mode 100644 index 00000000..aa2fe826 --- /dev/null +++ b/modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp @@ -0,0 +1,48 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ +namespace SampleRateHelpers +{ + +static inline const std::vector& getAllSampleRates() +{ + static auto sampleRates = [] + { + std::vector result; + constexpr double baseRates[] = { 8000.0, 11025.0, 12000.0 }; + constexpr double maxRate = 768000.0; + + for (auto rate : baseRates) + for (; rate <= maxRate; rate *= 2) + result.insert (std::upper_bound (result.begin(), result.end(), rate), + rate); + + return result; + }(); + + return sampleRates; +} + +} // namespace SampleRateHelpers +} // namespace juce diff --git a/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h b/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h index 6d8b7637..e4ead981 100644 --- a/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h +++ b/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/juce_audio_devices.cpp b/modules/juce_audio_devices/juce_audio_devices.cpp index c76663a1..f4b4de06 100644 --- a/modules/juce_audio_devices/juce_audio_devices.cpp +++ b/modules/juce_audio_devices/juce_audio_devices.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -45,6 +45,8 @@ #include "juce_audio_devices.h" +#include "audio_io/juce_SampleRateHelpers.cpp" + //============================================================================== #if JUCE_MAC || JUCE_IOS #include diff --git a/modules/juce_audio_devices/juce_audio_devices.h b/modules/juce_audio_devices/juce_audio_devices.h index b4077022..e8e7b4e3 100644 --- a/modules/juce_audio_devices/juce_audio_devices.h +++ b/modules/juce_audio_devices/juce_audio_devices.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -32,7 +32,7 @@ ID: juce_audio_devices vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE audio and MIDI I/O device classes description: Classes to play and record from audio and MIDI I/O devices website: http://www.juce.com/juce diff --git a/modules/juce_audio_devices/juce_audio_devices.mm b/modules/juce_audio_devices/juce_audio_devices.mm index c58ad3f9..7a50e8be 100644 --- a/modules/juce_audio_devices/juce_audio_devices.mm +++ b/modules/juce_audio_devices/juce_audio_devices.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp b/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp index df654376..51f0e5af 100644 --- a/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp +++ b/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/midi_io/juce_MidiDevices.h b/modules/juce_audio_devices/midi_io/juce_MidiDevices.h index d30de656..814cb7d8 100644 --- a/modules/juce_audio_devices/midi_io/juce_MidiDevices.h +++ b/modules/juce_audio_devices/midi_io/juce_MidiDevices.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp b/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp index 5e837f5b..8eced815 100644 --- a/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp +++ b/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h b/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h index b9344e9f..8f74eccf 100644 --- a/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h +++ b/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h index 7adb9bb6..1cdad80c 100644 --- a/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h +++ b/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp b/modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp deleted file mode 100644 index cc69b23c..00000000 --- a/modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp +++ /dev/null @@ -1,1022 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - The code included in this file is provided under the terms of the ISC license - http://www.isc.org/downloads/software-support-policy/isc-license. Permission - To use, copy, modify, and/or distribute this software for any purpose with or - without fee is hereby granted provided that the above copyright notice and - this permission notice appear in all copies. - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -namespace juce -{ -namespace universal_midi_packets -{ - -#if JUCE_UNIT_TESTS - -constexpr uint8_t operator""_u8 (unsigned long long int i) { return static_cast (i); } -constexpr uint16_t operator""_u16 (unsigned long long int i) { return static_cast (i); } -constexpr uint32_t operator""_u32 (unsigned long long int i) { return static_cast (i); } -constexpr uint64_t operator""_u64 (unsigned long long int i) { return static_cast (i); } - -class UniversalMidiPacketTests : public UnitTest -{ -public: - UniversalMidiPacketTests() - : UnitTest ("Universal MIDI Packet", UnitTestCategories::midi) - { - } - - void runTest() override - { - auto random = getRandom(); - - beginTest ("Short bytestream midi messages can be round-tripped through the UMP converter"); - { - Midi1ToBytestreamTranslator translator (0); - - forEachNonSysExTestMessage (random, [&] (const MidiMessage& m) - { - Packets packets; - Conversion::toMidi1 (m, packets); - expect (packets.size() == 1); - - // Make sure that the message type is correct - expect (Utils::getMessageType (packets.data()[0]) == ((m.getRawData()[0] >> 0x4) == 0xf ? 0x1 : 0x2)); - - translator.dispatch (View {packets.data() }, - 0, - [&] (const MidiMessage& roundTripped) - { - expect (equal (m, roundTripped)); - }); - }); - } - - beginTest ("Bytestream SysEx converts to universal packets"); - { - { - // Zero length message - Packets packets; - Conversion::toMidi1 (createRandomSysEx (random, 0), packets); - expect (packets.size() == 2); - - expect (packets.data()[0] == 0x30000000); - expect (packets.data()[1] == 0x00000000); - } - - { - const auto message = createRandomSysEx (random, 1); - Packets packets; - Conversion::toMidi1 (message, packets); - expect (packets.size() == 2); - - const auto* sysEx = message.getSysExData(); - expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x01, sysEx[0], 0)); - expect (packets.data()[1] == 0x00000000); - } - - { - const auto message = createRandomSysEx (random, 6); - Packets packets; - Conversion::toMidi1 (message, packets); - expect (packets.size() == 2); - - const auto* sysEx = message.getSysExData(); - expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x06, sysEx[0], sysEx[1])); - expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4], sysEx[5])); - } - - { - const auto message = createRandomSysEx (random, 12); - Packets packets; - Conversion::toMidi1 (message, packets); - expect (packets.size() == 4); - - const auto* sysEx = message.getSysExData(); - expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x16, sysEx[0], sysEx[1])); - expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4], sysEx[5])); - expect (packets.data()[2] == Utils::bytesToWord (0x30, 0x36, sysEx[6], sysEx[7])); - expect (packets.data()[3] == Utils::bytesToWord (sysEx[8], sysEx[9], sysEx[10], sysEx[11])); - } - - { - const auto message = createRandomSysEx (random, 13); - Packets packets; - Conversion::toMidi1 (message, packets); - expect (packets.size() == 6); - - const auto* sysEx = message.getSysExData(); - expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x16, sysEx[0], sysEx[1])); - expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4], sysEx[5])); - expect (packets.data()[2] == Utils::bytesToWord (0x30, 0x26, sysEx[6], sysEx[7])); - expect (packets.data()[3] == Utils::bytesToWord (sysEx[8], sysEx[9], sysEx[10], sysEx[11])); - expect (packets.data()[4] == Utils::bytesToWord (0x30, 0x31, sysEx[12], 0)); - expect (packets.data()[5] == 0x00000000); - } - } - - ToBytestreamDispatcher converter (0); - Packets packets; - - const auto checkRoundTrip = [&] (const MidiBuffer& expected) - { - for (const auto meta : expected) - Conversion::toMidi1 (meta.getMessage(), packets); - - MidiBuffer output; - converter.dispatch (packets.data(), - packets.data() + packets.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - packets.clear(); - - expect (equal (expected, output)); - }; - - beginTest ("Long SysEx bytestream midi messages can be round-tripped through the UMP converter"); - { - for (auto length : { 0, 1, 2, 3, 4, 5, 6, 7, 13, 20, 100, 1000 }) - { - MidiBuffer expected; - expected.addEvent (createRandomSysEx (random, size_t (length)), 0); - checkRoundTrip (expected); - } - } - - beginTest ("UMP SysEx7 messages interspersed with utility messages convert to bytestream"); - { - const auto sysEx = createRandomSysEx (random, 100); - Packets originalPackets; - Conversion::toMidi1 (sysEx, originalPackets); - - Packets modifiedPackets; - - const auto addRandomUtilityUMP = [&] - { - const auto newPacket = createRandomUtilityUMP (random); - modifiedPackets.add (View (newPacket.data())); - }; - - for (const auto& packet : originalPackets) - { - addRandomUtilityUMP(); - modifiedPackets.add (packet); - addRandomUtilityUMP(); - } - - MidiBuffer output; - converter.dispatch (modifiedPackets.data(), - modifiedPackets.data() + modifiedPackets.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - - // All Utility messages should have been ignored - expect (output.getNumEvents() == 1); - - for (const auto meta : output) - expect (equal (meta.getMessage(), sysEx)); - } - - beginTest ("UMP SysEx7 messages interspersed with System Realtime messages convert to bytestream"); - { - const auto sysEx = createRandomSysEx (random, 200); - Packets originalPackets; - Conversion::toMidi1 (sysEx, originalPackets); - - Packets modifiedPackets; - MidiBuffer realtimeMessages; - - const auto addRandomRealtimeUMP = [&] - { - const auto newPacket = createRandomRealtimeUMP (random); - modifiedPackets.add (View (newPacket.data())); - realtimeMessages.addEvent (Midi1ToBytestreamTranslator::fromUmp (newPacket), 0); - }; - - for (const auto& packet : originalPackets) - { - addRandomRealtimeUMP(); - modifiedPackets.add (packet); - addRandomRealtimeUMP(); - } - - MidiBuffer output; - converter.dispatch (modifiedPackets.data(), - modifiedPackets.data() + modifiedPackets.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - - const auto numOutputs = output.getNumEvents(); - const auto numInputs = realtimeMessages.getNumEvents(); - expect (numOutputs == numInputs + 1); - - if (numOutputs == numInputs + 1) - { - const auto isMetadataEquivalent = [] (const MidiMessageMetadata& a, - const MidiMessageMetadata& b) - { - return equal (a.getMessage(), b.getMessage()); - }; - - auto it = output.begin(); - - for (const auto meta : realtimeMessages) - { - if (! isMetadataEquivalent (*it, meta)) - { - expect (equal ((*it).getMessage(), sysEx)); - ++it; - } - - expect (isMetadataEquivalent (*it, meta)); - ++it; - } - } - } - - beginTest ("UMP SysEx7 messages interspersed with System Realtime and Utility messages convert to bytestream"); - { - const auto sysEx = createRandomSysEx (random, 300); - Packets originalPackets; - Conversion::toMidi1 (sysEx, originalPackets); - - Packets modifiedPackets; - MidiBuffer realtimeMessages; - - const auto addRandomRealtimeUMP = [&] - { - const auto newPacket = createRandomRealtimeUMP (random); - modifiedPackets.add (View (newPacket.data())); - realtimeMessages.addEvent (Midi1ToBytestreamTranslator::fromUmp (newPacket), 0); - }; - - const auto addRandomUtilityUMP = [&] - { - const auto newPacket = createRandomUtilityUMP (random); - modifiedPackets.add (View (newPacket.data())); - }; - - for (const auto& packet : originalPackets) - { - addRandomRealtimeUMP(); - addRandomUtilityUMP(); - modifiedPackets.add (packet); - addRandomRealtimeUMP(); - addRandomUtilityUMP(); - } - - MidiBuffer output; - converter.dispatch (modifiedPackets.data(), - modifiedPackets.data() + modifiedPackets.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - - const auto numOutputs = output.getNumEvents(); - const auto numInputs = realtimeMessages.getNumEvents(); - expect (numOutputs == numInputs + 1); - - if (numOutputs == numInputs + 1) - { - const auto isMetadataEquivalent = [] (const MidiMessageMetadata& a, const MidiMessageMetadata& b) - { - return equal (a.getMessage(), b.getMessage()); - }; - - auto it = output.begin(); - - for (const auto meta : realtimeMessages) - { - if (! isMetadataEquivalent (*it, meta)) - { - expect (equal ((*it).getMessage(), sysEx)); - ++it; - } - - expect (isMetadataEquivalent (*it, meta)); - ++it; - } - } - } - - beginTest ("SysEx messages are terminated by non-Utility, non-Realtime messages"); - { - const auto noteOn = [&] - { - MidiBuffer b; - b.addEvent (MidiMessage::noteOn (1, uint8_t (64), uint8_t (64)), 0); - return b; - }(); - - const auto noteOnPackets = [&] - { - Packets p; - - for (const auto meta : noteOn) - Conversion::toMidi1 (meta.getMessage(), p); - - return p; - }(); - - const auto sysEx = createRandomSysEx (random, 300); - - const auto originalPackets = [&] - { - Packets p; - Conversion::toMidi1 (sysEx, p); - return p; - }(); - - const auto modifiedPackets = [&] - { - Packets p; - - const auto insertionPoint = std::next (originalPackets.begin(), 10); - std::for_each (originalPackets.begin(), - insertionPoint, - [&] (const View& view) { p.add (view); }); - - for (const auto& view : noteOnPackets) - p.add (view); - - std::for_each (insertionPoint, - originalPackets.end(), - [&] (const View& view) { p.add (view); }); - - return p; - }(); - - // modifiedPackets now contains some SysEx packets interrupted by a MIDI 1 noteOn - - MidiBuffer output; - - const auto pushToOutput = [&] (const Packets& p) - { - converter.dispatch (p.data(), - p.data() + p.size(), - 0, - [&] (const MidiMessage& roundTripped) - { - output.addEvent (roundTripped, int (roundTripped.getTimeStamp())); - }); - }; - - pushToOutput (modifiedPackets); - - // Interrupted sysEx shouldn't be present - expect (equal (output, noteOn)); - - const auto newSysEx = createRandomSysEx (random, 300); - Packets newSysExPackets; - Conversion::toMidi1 (newSysEx, newSysExPackets); - - // If we push another midi event without interrupting it, - // it should get through without being modified, - // and it shouldn't be affected by the previous (interrupted) sysex. - - output.clear(); - pushToOutput (newSysExPackets); - - expect (output.getNumEvents() == 1); - - for (const auto meta : output) - expect (equal (meta.getMessage(), newSysEx)); - } - - beginTest ("Widening conversions work"); - { - // This is similar to the 'slow' example code from the MIDI 2.0 spec - const auto baselineScale = [] (uint32_t srcVal, uint32_t srcBits, uint32_t dstBits) - { - const auto scaleBits = (uint32_t) (dstBits - srcBits); - - auto bitShiftedValue = (uint32_t) (srcVal << scaleBits); - - const auto srcCenter = (uint32_t) (1 << (srcBits - 1)); - - if (srcVal <= srcCenter) - return bitShiftedValue; - - const auto repeatBits = (uint32_t) (srcBits - 1); - const auto repeatMask = (uint32_t) ((1 << repeatBits) - 1); - - auto repeatValue = (uint32_t) (srcVal & repeatMask); - - if (scaleBits > repeatBits) - repeatValue <<= scaleBits - repeatBits; - else - repeatValue >>= repeatBits - scaleBits; - - while (repeatValue != 0) - { - bitShiftedValue |= repeatValue; - repeatValue >>= repeatBits; - } - - return bitShiftedValue; - }; - - const auto baselineScale7To8 = [&] (uint8_t in) - { - return baselineScale (in, 7, 8); - }; - - const auto baselineScale7To16 = [&] (uint8_t in) - { - return baselineScale (in, 7, 16); - }; - - const auto baselineScale14To16 = [&] (uint16_t in) - { - return baselineScale (in, 14, 16); - }; - - const auto baselineScale7To32 = [&] (uint8_t in) - { - return baselineScale (in, 7, 32); - }; - - const auto baselineScale14To32 = [&] (uint16_t in) - { - return baselineScale (in, 14, 32); - }; - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals ((int64_t) Conversion::scaleTo8 (rand), - (int64_t) baselineScale7To8 (rand)); - } - - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x00), (int64_t) 0x0000); - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x0a), (int64_t) 0x1400); - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x40), (int64_t) 0x8000); - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x57), (int64_t) 0xaeba); - expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x7f), (int64_t) 0xffff); - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals ((int64_t) Conversion::scaleTo16 (rand), - (int64_t) baselineScale7To16 (rand)); - } - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint16_t) random.nextInt (0x4000); - expectEquals ((int64_t) Conversion::scaleTo16 (rand), - (int64_t) baselineScale14To16 (rand)); - } - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals ((int64_t) Conversion::scaleTo32 (rand), - (int64_t) baselineScale7To32 (rand)); - } - - expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x0000), (int64_t) 0x00000000); - expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x2000), (int64_t) 0x80000000); - expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x3fff), (int64_t) 0xffffffff); - - for (auto i = 0; i != 100; ++i) - { - const auto rand = (uint16_t) random.nextInt (0x4000); - expectEquals ((int64_t) Conversion::scaleTo32 (rand), - (int64_t) baselineScale14To32 (rand)); - } - } - - beginTest ("Round-trip widening/narrowing conversions work"); - { - for (auto i = 0; i != 100; ++i) - { - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals (Conversion::scaleTo7 (Conversion::scaleTo8 (rand)), rand); - } - - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals (Conversion::scaleTo7 (Conversion::scaleTo16 (rand)), rand); - } - - { - const auto rand = (uint8_t) random.nextInt (0x80); - expectEquals (Conversion::scaleTo7 (Conversion::scaleTo32 (rand)), rand); - } - - { - const auto rand = (uint16_t) random.nextInt (0x4000); - expectEquals ((uint64_t) Conversion::scaleTo14 (Conversion::scaleTo16 (rand)), (uint64_t) rand); - } - - { - const auto rand = (uint16_t) random.nextInt (0x4000); - expectEquals ((uint64_t) Conversion::scaleTo14 (Conversion::scaleTo32 (rand)), (uint64_t) rand); - } - } - } - - beginTest ("MIDI 2 -> 1 note on conversions"); - { - { - Packets midi2; - midi2.add (PacketX2 { 0x41946410, 0x12345678 }); - - Packets midi1; - midi1.add (PacketX1 { 0x21946409 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - { - // If the velocity is close to 0, the output velocity should still be 1 - Packets midi2; - midi2.add (PacketX2 { 0x4295327f, 0x00345678 }); - - Packets midi1; - midi1.add (PacketX1 { 0x22953201 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - } - - beginTest ("MIDI 2 -> 1 note off conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x448b0520, 0xfedcba98 }); - - Packets midi1; - midi1.add (PacketX1 { 0x248b057f }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 poly pressure conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x49af0520, 0x80dcba98 }); - - Packets midi1; - midi1.add (PacketX1 { 0x29af0540 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 control change conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x49b00520, 0x80dcba98 }); - - Packets midi1; - midi1.add (PacketX1 { 0x29b00540 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 channel pressure conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x40d20520, 0x80dcba98 }); - - Packets midi1; - midi1.add (PacketX1 { 0x20d24000 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 nrpn rpn conversion"); - { - { - Packets midi2; - midi2.add (PacketX2 { 0x44240123, 0x456789ab }); - - Packets midi1; - midi1.add (PacketX1 { 0x24b46501 }); - midi1.add (PacketX1 { 0x24b46423 }); - midi1.add (PacketX1 { 0x24b40622 }); - midi1.add (PacketX1 { 0x24b42659 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - { - Packets midi2; - midi2.add (PacketX2 { 0x48347f7f, 0xffffffff }); - - Packets midi1; - midi1.add (PacketX1 { 0x28b4637f }); - midi1.add (PacketX1 { 0x28b4627f }); - midi1.add (PacketX1 { 0x28b4067f }); - midi1.add (PacketX1 { 0x28b4267f }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - } - - beginTest ("MIDI 2 -> 1 program change and bank select conversion"); - { - { - // If the bank valid bit is 0, just emit a program change - Packets midi2; - midi2.add (PacketX2 { 0x4cc10000, 0x70004020 }); - - Packets midi1; - midi1.add (PacketX1 { 0x2cc17000 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - { - // If the bank valid bit is 1, emit bank select control changes and a program change - Packets midi2; - midi2.add (PacketX2 { 0x4bc20001, 0x70004020 }); - - Packets midi1; - midi1.add (PacketX1 { 0x2bb20040 }); - midi1.add (PacketX1 { 0x2bb22020 }); - midi1.add (PacketX1 { 0x2bc27000 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - } - - beginTest ("MIDI 2 -> 1 pitch bend conversion"); - { - Packets midi2; - midi2.add (PacketX2 { 0x4eee0000, 0x12340000 }); - - Packets midi1; - midi1.add (PacketX1 { 0x2eee0d09 }); - - checkMidi2ToMidi1Conversion (midi2, midi1); - } - - beginTest ("MIDI 2 -> 1 messages which don't convert"); - { - const uint8_t opcodes[] { 0x0, 0x1, 0x4, 0x5, 0x6, 0xf }; - - for (const auto opcode : opcodes) - { - Packets midi2; - midi2.add (PacketX2 { Utils::bytesToWord (0x40, (uint8_t) (opcode << 0x4), 0, 0), 0x0 }); - checkMidi2ToMidi1Conversion (midi2, {}); - } - } - - beginTest ("MIDI 2 -> 1 messages which are passed through"); - { - const uint8_t typecodesX1[] { 0x0, 0x1, 0x2 }; - - for (const auto typecode : typecodesX1) - { - Packets p; - p.add (PacketX1 { (uint32_t) ((int64_t) typecode << 0x1c | (random.nextInt64() & 0xffffff)) }); - - checkMidi2ToMidi1Conversion (p, p); - } - - { - Packets p; - p.add (PacketX2 { (uint32_t) (0x3 << 0x1c | (random.nextInt64() & 0xffffff)), - (uint32_t) (random.nextInt64() & 0xffffffff) }); - - checkMidi2ToMidi1Conversion (p, p); - } - - { - Packets p; - p.add (PacketX4 { (uint32_t) (0x5 << 0x1c | (random.nextInt64() & 0xffffff)), - (uint32_t) (random.nextInt64() & 0xffffffff), - (uint32_t) (random.nextInt64() & 0xffffffff), - (uint32_t) (random.nextInt64() & 0xffffffff) }); - - checkMidi2ToMidi1Conversion (p, p); - } - } - - beginTest ("MIDI 2 -> 1 control changes which should be ignored"); - { - const uint8_t CCs[] { 6, 38, 98, 99, 100, 101, 0, 32 }; - - for (const auto cc : CCs) - { - Packets midi2; - midi2.add (PacketX2 { (uint32_t) (0x40b00000 | (cc << 0x8)), 0x00000000 }); - - checkMidi2ToMidi1Conversion (midi2, {}); - } - } - - beginTest ("MIDI 1 -> 2 note on conversions"); - { - { - Packets midi1; - midi1.add (PacketX1 { 0x20904040 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40904000, static_cast (Conversion::scaleTo16 (0x40_u8)) << 0x10 }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - // If velocity is 0, convert to a note-off - { - Packets midi1; - midi1.add (PacketX1 { 0x23935100 }); - - Packets midi2; - midi2.add (PacketX2 { 0x43835100, 0x0 }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - } - - beginTest ("MIDI 1 -> 2 note off conversions"); - { - Packets midi1; - midi1.add (PacketX1 { 0x21831020 }); - - Packets midi2; - midi2.add (PacketX2 { 0x41831000, static_cast (Conversion::scaleTo16 (0x20_u8)) << 0x10 }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - beginTest ("MIDI 1 -> 2 poly pressure conversions"); - { - Packets midi1; - midi1.add (PacketX1 { 0x20af7330 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40af7300, Conversion::scaleTo32 (0x30_u8) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - beginTest ("individual MIDI 1 -> 2 control changes which should be ignored"); - { - const uint8_t CCs[] { 6, 38, 98, 99, 100, 101, 0, 32 }; - - for (const auto cc : CCs) - { - Packets midi1; - midi1.add (PacketX1 { Utils::bytesToWord (0x20, 0xb0, cc, 0x00) }); - - checkMidi1ToMidi2Conversion (midi1, {}); - } - } - - beginTest ("MIDI 1 -> 2 control change conversions"); - { - // normal control change - { - Packets midi1; - midi1.add (PacketX1 { 0x29b1017f }); - - Packets midi2; - midi2.add (PacketX2 { 0x49b10100, Conversion::scaleTo32 (0x7f_u8) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - // nrpn - { - Packets midi1; - midi1.add (PacketX1 { 0x20b06301 }); - midi1.add (PacketX1 { 0x20b06223 }); - midi1.add (PacketX1 { 0x20b00645 }); - midi1.add (PacketX1 { 0x20b02667 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40300123, Conversion::scaleTo32 (static_cast ((0x45 << 7) | 0x67)) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - // rpn - { - Packets midi1; - midi1.add (PacketX1 { 0x20b06543 }); - midi1.add (PacketX1 { 0x20b06421 }); - midi1.add (PacketX1 { 0x20b00601 }); - midi1.add (PacketX1 { 0x20b02623 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40204321, Conversion::scaleTo32 (static_cast ((0x01 << 7) | 0x23)) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - } - - beginTest ("MIDI 1 -> MIDI 2 program change and bank select"); - { - Packets midi1; - // program change with bank - midi1.add (PacketX1 { 0x2bb20030 }); - midi1.add (PacketX1 { 0x2bb22010 }); - midi1.add (PacketX1 { 0x2bc24000 }); - // program change without bank (different group and channel) - midi1.add (PacketX1 { 0x20c01000 }); - - Packets midi2; - midi2.add (PacketX2 { 0x4bc20001, 0x40003010 }); - midi2.add (PacketX2 { 0x40c00000, 0x10000000 }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - beginTest ("MIDI 1 -> MIDI 2 channel pressure conversions"); - { - Packets midi1; - midi1.add (PacketX1 { 0x20df3000 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40df0000, Conversion::scaleTo32 (0x30_u8) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - - beginTest ("MIDI 1 -> MIDI 2 pitch bend conversions"); - { - Packets midi1; - midi1.add (PacketX1 { 0x20e74567 }); - - Packets midi2; - midi2.add (PacketX2 { 0x40e70000, Conversion::scaleTo32 (static_cast ((0x67 << 7) | 0x45)) }); - - checkMidi1ToMidi2Conversion (midi1, midi2); - } - } - -private: - static Packets convertMidi2ToMidi1 (const Packets& midi2) - { - Packets r; - - for (const auto& packet : midi2) - Conversion::midi2ToMidi1DefaultTranslation (packet, [&r] (const View& v) { r.add (v); }); - - return r; - } - - static Packets convertMidi1ToMidi2 (const Packets& midi1) - { - Packets r; - Midi1ToMidi2DefaultTranslator translator; - - for (const auto& packet : midi1) - translator.dispatch (packet, [&r] (const View& v) { r.add (v); }); - - return r; - } - - void checkBytestreamConversion (const Packets& actual, const Packets& expected) - { - expectEquals ((int) actual.size(), (int) expected.size()); - - if (actual.size() != expected.size()) - return; - - auto actualPtr = actual.data(); - - std::for_each (expected.data(), - expected.data() + expected.size(), - [&] (const uint32_t word) { expectEquals ((uint64_t) *actualPtr++, (uint64_t) word); }); - } - - void checkMidi2ToMidi1Conversion (const Packets& midi2, const Packets& expected) - { - checkBytestreamConversion (convertMidi2ToMidi1 (midi2), expected); - } - - void checkMidi1ToMidi2Conversion (const Packets& midi1, const Packets& expected) - { - checkBytestreamConversion (convertMidi1ToMidi2 (midi1), expected); - } - - MidiMessage createRandomSysEx (Random& random, size_t sysExBytes) - { - std::vector data; - data.reserve (sysExBytes); - - for (size_t i = 0; i != sysExBytes; ++i) - data.push_back (uint8_t (random.nextInt (0x80))); - - return MidiMessage::createSysExMessage (data.data(), int (data.size())); - } - - PacketX1 createRandomUtilityUMP (Random& random) - { - const auto status = random.nextInt (3); - - return PacketX1 { Utils::bytesToWord (0, - uint8_t (status << 0x4), - uint8_t (status == 0 ? 0 : random.nextInt (0x100)), - uint8_t (status == 0 ? 0 : random.nextInt (0x100))) }; - } - - PacketX1 createRandomRealtimeUMP (Random& random) - { - const auto status = [&] - { - switch (random.nextInt (6)) - { - case 0: return 0xf8; - case 1: return 0xfa; - case 2: return 0xfb; - case 3: return 0xfc; - case 4: return 0xfe; - case 5: return 0xff; - } - - jassertfalse; - return 0x00; - }(); - - return PacketX1 { Utils::bytesToWord (0x10, uint8_t (status), 0x00, 0x00) }; - } - - template - void forEachNonSysExTestMessage (Random& random, Fn&& fn) - { - for (uint16_t counter = 0x80; counter != 0x100; ++counter) - { - const auto firstByte = (uint8_t) counter; - - if (firstByte == 0xf0 || firstByte == 0xf7) - continue; // sysEx is tested separately - - const auto length = MidiMessage::getMessageLengthFromFirstByte (firstByte); - const auto getDataByte = [&] { return uint8_t (random.nextInt (256) & 0x7f); }; - - const auto message = [&] - { - switch (length) - { - case 1: return MidiMessage (firstByte); - case 2: return MidiMessage (firstByte, getDataByte()); - case 3: return MidiMessage (firstByte, getDataByte(), getDataByte()); - } - - return MidiMessage(); - }(); - - fn (message); - } - } - - #if JUCE_WINDOWS && ! JUCE_MINGW - #define JUCE_CHECKED_ITERATOR(msg, size) \ - stdext::checked_array_iterator::type> ((msg), (size_t) (size)) - #else - #define JUCE_CHECKED_ITERATOR(msg, size) (msg) - #endif - - static bool equal (const MidiMessage& a, const MidiMessage& b) noexcept - { - return a.getRawDataSize() == b.getRawDataSize() - && std::equal (a.getRawData(), a.getRawData() + a.getRawDataSize(), - JUCE_CHECKED_ITERATOR (b.getRawData(), b.getRawDataSize())); - } - - #undef JUCE_CHECKED_ITERATOR - - static bool equal (const MidiBuffer& a, const MidiBuffer& b) noexcept - { - return a.data == b.data; - } -}; - -static UniversalMidiPacketTests universalMidiPacketTests; - -#endif - -} -} diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h index 89b17543..2733f053 100644 --- a/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h +++ b/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/native/java/app/com/rmsl/juce/JuceMidiSupport.java b/modules/juce_audio_devices/native/java/app/com/rmsl/juce/JuceMidiSupport.java index 1520284f..0fd83c65 100644 --- a/modules/juce_audio_devices/native/java/app/com/rmsl/juce/JuceMidiSupport.java +++ b/modules/juce_audio_devices/native/java/app/com/rmsl/juce/JuceMidiSupport.java @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/native/juce_android_Audio.cpp b/modules/juce_audio_devices/native/juce_android_Audio.cpp index 108ff761..75607c69 100644 --- a/modules/juce_audio_devices/native/juce_android_Audio.cpp +++ b/modules/juce_audio_devices/native/juce_android_Audio.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -357,9 +357,11 @@ public: if (callback != nullptr) { - callback->audioDeviceIOCallback (inputChannelBuffer.getArrayOfReadPointers(), numClientInputChannels, - outputChannelBuffer.getArrayOfWritePointers(), numClientOutputChannels, - actualBufferSize); + callback->audioDeviceIOCallbackWithContext (inputChannelBuffer.getArrayOfReadPointers(), + numClientInputChannels, + outputChannelBuffer.getArrayOfWritePointers(), + numClientOutputChannels, + actualBufferSize, {}); } else { diff --git a/modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h b/modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h index c87d6aea..c76f96d6 100644 --- a/modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h +++ b/modules/juce_audio_devices/native/juce_android_HighPerformanceAudioHelpers.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/native/juce_android_Midi.cpp b/modules/juce_audio_devices/native/juce_android_Midi.cpp index 94b687dd..371ac4c8 100644 --- a/modules/juce_audio_devices/native/juce_android_Midi.cpp +++ b/modules/juce_audio_devices/native/juce_android_Midi.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/native/juce_android_Oboe.cpp b/modules/juce_audio_devices/native/juce_android_Oboe.cpp index 92827efc..105a182a 100644 --- a/modules/juce_audio_devices/native/juce_android_Oboe.cpp +++ b/modules/juce_audio_devices/native/juce_android_Oboe.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -428,8 +428,12 @@ private: { if (auto* cb = callback.exchange (nullptr)) { - cb->audioDeviceIOCallback (inputChannelData, numInputChannels, - outputChannelData, numOutputChannels, numFrames); + cb->audioDeviceIOCallbackWithContext (inputChannelData, + numInputChannels, + outputChannelData, + numOutputChannels, + numFrames, + {}); callback.set (cb); } else @@ -1416,6 +1420,7 @@ private: }; //============================================================================== +pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr); pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr) { auto thread = std::make_unique(); diff --git a/modules/juce_audio_devices/native/juce_android_OpenSL.cpp b/modules/juce_audio_devices/native/juce_android_OpenSL.cpp index d8cf674d..674f827e 100644 --- a/modules/juce_audio_devices/native/juce_android_OpenSL.cpp +++ b/modules/juce_audio_devices/native/juce_android_OpenSL.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -605,7 +605,7 @@ public: { if (auto* cb = callback.exchange (nullptr)) { - cb->audioDeviceIOCallback (inputChannelData, inputChannels, outputChannelData, outputChannels, bufferSize); + cb->audioDeviceIOCallbackWithContext (inputChannelData, inputChannels, outputChannelData, outputChannels, bufferSize, {}); callback.set (cb); } else @@ -1273,6 +1273,7 @@ private: }; //============================================================================== +pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr); pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr) { auto thread = std::make_unique(); diff --git a/modules/juce_audio_devices/native/juce_ios_Audio.cpp b/modules/juce_audio_devices/native/juce_ios_Audio.cpp index e8f19036..a3821a6e 100644 --- a/modules/juce_audio_devices/native/juce_ios_Audio.cpp +++ b/modules/juce_audio_devices/native/juce_ios_Audio.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -20,6 +20,8 @@ ============================================================================== */ +#include + namespace juce { @@ -250,8 +252,7 @@ private: }; //============================================================================== -struct iOSAudioIODevice::Pimpl : public AudioPlayHead, - public AsyncUpdater +struct iOSAudioIODevice::Pimpl : public AsyncUpdater { Pimpl (iOSAudioIODeviceType* ioDeviceType, iOSAudioIODevice& ioDevice) : deviceType (ioDeviceType), @@ -564,132 +565,140 @@ struct iOSAudioIODevice::Pimpl : public AudioPlayHead, } //============================================================================== - bool canControlTransport() override { return interAppAudioConnected; } - - void transportPlay (bool shouldSartPlaying) override - { - if (! canControlTransport()) - return; - - HostCallbackInfo callbackInfo; - fillHostCallbackInfo (callbackInfo); - - Boolean hostIsPlaying = NO; - OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, - &hostIsPlaying, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr); - - ignoreUnused (err); - jassert (err == noErr); - - if (hostIsPlaying != shouldSartPlaying) - handleAudioTransportEvent (kAudioUnitRemoteControlEvent_TogglePlayPause); - } - - void transportRecord (bool shouldStartRecording) override - { - if (! canControlTransport()) - return; - - HostCallbackInfo callbackInfo; - fillHostCallbackInfo (callbackInfo); - - Boolean hostIsRecording = NO; - OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, - nullptr, - &hostIsRecording, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr); - ignoreUnused (err); - jassert (err == noErr); - - if (hostIsRecording != shouldStartRecording) - handleAudioTransportEvent (kAudioUnitRemoteControlEvent_ToggleRecord); - } - - void transportRewind() override - { - if (canControlTransport()) - handleAudioTransportEvent (kAudioUnitRemoteControlEvent_Rewind); - } - - bool getCurrentPosition (CurrentPositionInfo& result) override + class PlayHead : public AudioPlayHead { - if (! canControlTransport()) - return false; + public: + explicit PlayHead (Pimpl& implIn) : impl (implIn) {} - zerostruct (result); + bool canControlTransport() override { return canControlTransportImpl(); } - HostCallbackInfo callbackInfo; - fillHostCallbackInfo (callbackInfo); + void transportPlay (bool shouldSartPlaying) override + { + if (! canControlTransport()) + return; - if (callbackInfo.hostUserData == nullptr) - return false; + HostCallbackInfo callbackInfo; + impl.fillHostCallbackInfo (callbackInfo); - Boolean hostIsPlaying = NO; - Boolean hostIsRecording = NO; - Float64 hostCurrentSampleInTimeLine = 0; - Boolean hostIsCycling = NO; - Float64 hostCycleStartBeat = 0; - Float64 hostCycleEndBeat = 0; - OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, - &hostIsPlaying, - &hostIsRecording, - nullptr, - &hostCurrentSampleInTimeLine, - &hostIsCycling, - &hostCycleStartBeat, - &hostCycleEndBeat); - if (err == kAUGraphErr_CannotDoInCurrentContext) - return false; + Boolean hostIsPlaying = NO; + OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, + &hostIsPlaying, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr); - jassert (err == noErr); + ignoreUnused (err); + jassert (err == noErr); - result.timeInSamples = (int64) hostCurrentSampleInTimeLine; - result.isPlaying = hostIsPlaying; - result.isRecording = hostIsRecording; - result.isLooping = hostIsCycling; - result.ppqLoopStart = hostCycleStartBeat; - result.ppqLoopEnd = hostCycleEndBeat; + if (hostIsPlaying != shouldSartPlaying) + impl.handleAudioTransportEvent (kAudioUnitRemoteControlEvent_TogglePlayPause); + } - result.timeInSeconds = result.timeInSamples / sampleRate; + void transportRecord (bool shouldStartRecording) override + { + if (! canControlTransport()) + return; - Float64 hostBeat = 0; - Float64 hostTempo = 0; - err = callbackInfo.beatAndTempoProc (callbackInfo.hostUserData, - &hostBeat, - &hostTempo); - jassert (err == noErr); + HostCallbackInfo callbackInfo; + impl.fillHostCallbackInfo (callbackInfo); + + Boolean hostIsRecording = NO; + OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, + nullptr, + &hostIsRecording, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr); + ignoreUnused (err); + jassert (err == noErr); + + if (hostIsRecording != shouldStartRecording) + impl.handleAudioTransportEvent (kAudioUnitRemoteControlEvent_ToggleRecord); + } - result.ppqPosition = hostBeat; - result.bpm = hostTempo; - - Float32 hostTimeSigNumerator = 0; - UInt32 hostTimeSigDenominator = 0; - Float64 hostCurrentMeasureDownBeat = 0; - err = callbackInfo.musicalTimeLocationProc (callbackInfo.hostUserData, - nullptr, - &hostTimeSigNumerator, - &hostTimeSigDenominator, - &hostCurrentMeasureDownBeat); - jassert (err == noErr); + void transportRewind() override + { + if (canControlTransport()) + impl.handleAudioTransportEvent (kAudioUnitRemoteControlEvent_Rewind); + } - result.ppqPositionOfLastBarStart = hostCurrentMeasureDownBeat; - result.timeSigNumerator = (int) hostTimeSigNumerator; - result.timeSigDenominator = (int) hostTimeSigDenominator; + Optional getPosition() const override + { + if (! canControlTransportImpl()) + return {}; + + HostCallbackInfo callbackInfo; + impl.fillHostCallbackInfo (callbackInfo); + + if (callbackInfo.hostUserData == nullptr) + return {}; + + Boolean hostIsPlaying = NO; + Boolean hostIsRecording = NO; + Float64 hostCurrentSampleInTimeLine = 0; + Boolean hostIsCycling = NO; + Float64 hostCycleStartBeat = 0; + Float64 hostCycleEndBeat = 0; + OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, + &hostIsPlaying, + &hostIsRecording, + nullptr, + &hostCurrentSampleInTimeLine, + &hostIsCycling, + &hostCycleStartBeat, + &hostCycleEndBeat); + if (err == kAUGraphErr_CannotDoInCurrentContext) + return {}; + + jassert (err == noErr); + + PositionInfo result; + + result.setTimeInSamples ((int64) hostCurrentSampleInTimeLine); + result.setIsPlaying (hostIsPlaying); + result.setIsRecording (hostIsRecording); + result.setIsLooping (hostIsCycling); + result.setLoopPoints (LoopPoints { hostCycleStartBeat, hostCycleEndBeat }); + result.setTimeInSeconds (*result.getTimeInSamples() / impl.sampleRate); + + Float64 hostBeat = 0; + Float64 hostTempo = 0; + err = callbackInfo.beatAndTempoProc (callbackInfo.hostUserData, + &hostBeat, + &hostTempo); + jassert (err == noErr); + + result.setPpqPosition (hostBeat); + result.setBpm (hostTempo); + + Float32 hostTimeSigNumerator = 0; + UInt32 hostTimeSigDenominator = 0; + Float64 hostCurrentMeasureDownBeat = 0; + err = callbackInfo.musicalTimeLocationProc (callbackInfo.hostUserData, + nullptr, + &hostTimeSigNumerator, + &hostTimeSigDenominator, + &hostCurrentMeasureDownBeat); + jassert (err == noErr); + + result.setPpqPositionOfLastBarStart (hostCurrentMeasureDownBeat); + result.setTimeSignature (TimeSignature { (int) hostTimeSigNumerator, (int) hostTimeSigDenominator }); + + result.setFrameRate (AudioPlayHead::fpsUnknown); + + return result; + } - result.frameRate = AudioPlayHead::fpsUnknown; + private: + bool canControlTransportImpl() const { return impl.interAppAudioConnected; } - return true; - } + Pimpl& impl; + }; //============================================================================== #if JUCE_MODULE_AVAILABLE_juce_graphics @@ -900,9 +909,14 @@ struct iOSAudioIODevice::Pimpl : public AudioPlayHead, zeromem (inputData[c], channelDataSize); } - callback->audioDeviceIOCallback ((const float**) inputData, channelData.inputs ->numActiveChannels, - outputData, channelData.outputs->numActiveChannels, - (int) numFrames); + const auto nanos = time != nullptr ? timeConversions.hostTimeToNanos (time->mHostTime) : 0; + + callback->audioDeviceIOCallbackWithContext ((const float**) inputData, + channelData.inputs ->numActiveChannels, + outputData, + channelData.outputs->numActiveChannels, + (int) numFrames, + { (time != nullptr && (time->mFlags & kAudioTimeStampHostTimeValid) != 0) ? &nanos : nullptr }); for (int c = 0; c < channelData.outputs->numActiveChannels; ++c) { @@ -1329,6 +1343,8 @@ struct iOSAudioIODevice::Pimpl : public AudioPlayHead, AudioBuffer audioData { 0, 0 }; }; + CoreAudioTimeConversions timeConversions; + IOChannelData channelData; BigInteger requestedInputChannels, requestedOutputChannels; @@ -1370,6 +1386,7 @@ struct iOSAudioIODevice::Pimpl : public AudioPlayHead, Float64 lastSampleTime; unsigned int lastNumFrames; int xrun; + PlayHead playhead { *this }; JUCE_DECLARE_NON_COPYABLE (Pimpl) }; @@ -1420,7 +1437,7 @@ int iOSAudioIODevice::getOutputLatencyInSamples() { return rou int iOSAudioIODevice::getXRunCount() const noexcept { return pimpl->xrun; } void iOSAudioIODevice::setMidiMessageCollector (MidiMessageCollector* collector) { pimpl->messageCollector = collector; } -AudioPlayHead* iOSAudioIODevice::getAudioPlayHead() const { return pimpl.get(); } +AudioPlayHead* iOSAudioIODevice::getAudioPlayHead() const { return &pimpl->playhead; } bool iOSAudioIODevice::isInterAppAudioConnected() const { return pimpl->interAppAudioConnected; } #if JUCE_MODULE_AVAILABLE_juce_graphics diff --git a/modules/juce_audio_devices/native/juce_ios_Audio.h b/modules/juce_audio_devices/native/juce_ios_Audio.h index dc95dd5d..8728f66e 100644 --- a/modules/juce_audio_devices/native/juce_ios_Audio.h +++ b/modules/juce_audio_devices/native/juce_ios_Audio.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/native/juce_linux_ALSA.cpp b/modules/juce_audio_devices/native/juce_linux_ALSA.cpp index 1b010c3e..dafb34cf 100644 --- a/modules/juce_audio_devices/native/juce_linux_ALSA.cpp +++ b/modules/juce_audio_devices/native/juce_linux_ALSA.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -50,17 +50,15 @@ namespace static void getDeviceSampleRates (snd_pcm_t* handle, Array& rates) { - const int ratesToTry[] = { 22050, 24000, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 0 }; - snd_pcm_hw_params_t* hwParams; snd_pcm_hw_params_alloca (&hwParams); - for (int i = 0; ratesToTry[i] != 0; ++i) + for (const auto rateToTry : SampleRateHelpers::getAllSampleRates()) { if (snd_pcm_hw_params_any (handle, hwParams) >= 0 - && snd_pcm_hw_params_test_rate (handle, hwParams, (unsigned int) ratesToTry[i], 0) == 0) + && snd_pcm_hw_params_test_rate (handle, hwParams, (unsigned int) rateToTry, 0) == 0) { - rates.addIfNotAlreadyThere ((double) ratesToTry[i]); + rates.addIfNotAlreadyThere (rateToTry); } } } @@ -713,11 +711,12 @@ public: if (callback != nullptr) { - callback->audioDeviceIOCallback (inputChannelDataForCallback.getRawDataPointer(), - inputChannelDataForCallback.size(), - outputChannelDataForCallback.getRawDataPointer(), - outputChannelDataForCallback.size(), - bufferSize); + callback->audioDeviceIOCallbackWithContext (inputChannelDataForCallback.getRawDataPointer(), + inputChannelDataForCallback.size(), + outputChannelDataForCallback.getRawDataPointer(), + outputChannelDataForCallback.size(), + bufferSize, + {}); } else { @@ -792,7 +791,7 @@ private: const String inputId, outputId; std::unique_ptr outputDevice, inputDevice; std::atomic numCallbacks { 0 }; - bool audioIoInProgress = false; + std::atomic audioIoInProgress { false }; CriticalSection callbackLock; @@ -1289,12 +1288,12 @@ private: } //============================================================================== -AudioIODeviceType* createAudioIODeviceType_ALSA_Soundcards() +static inline AudioIODeviceType* createAudioIODeviceType_ALSA_Soundcards() { return new ALSAAudioIODeviceType (true, "ALSA HW"); } -AudioIODeviceType* createAudioIODeviceType_ALSA_PCMDevices() +static inline AudioIODeviceType* createAudioIODeviceType_ALSA_PCMDevices() { return new ALSAAudioIODeviceType (false, "ALSA"); } diff --git a/modules/juce_audio_devices/native/juce_linux_Bela.cpp b/modules/juce_audio_devices/native/juce_linux_Bela.cpp index 69bb5a09..bf1ff16f 100644 --- a/modules/juce_audio_devices/native/juce_linux_Bela.cpp +++ b/modules/juce_audio_devices/native/juce_linux_Bela.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -433,9 +433,12 @@ private: channelOutBuffer[ch] = &context.analogOut[(Frames) (ch - analogChannelStart) * context.audioFrames]; } - callback->audioDeviceIOCallback (channelInBuffer.getData(), actualNumberOfInputs, - channelOutBuffer.getData(), actualNumberOfOutputs, - (int) context.audioFrames); + callback->audioDeviceIOCallbackWithContext (channelInBuffer.getData(), + actualNumberOfInputs, + channelOutBuffer.getData(), + actualNumberOfOutputs, + (int) context.audioFrames, + {}); } } diff --git a/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp b/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp index 662a4bac..8b7e7757 100644 --- a/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp +++ b/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -462,8 +462,12 @@ private: if (callback != nullptr) { if ((numActiveInChans + numActiveOutChans) > 0) - callback->audioDeviceIOCallback (const_cast (inChans.getData()), numActiveInChans, - outChans, numActiveOutChans, numSamples); + callback->audioDeviceIOCallbackWithContext (const_cast (inChans.getData()), + numActiveInChans, + outChans, + numActiveOutChans, + numSamples, + {}); } else { diff --git a/modules/juce_audio_devices/native/juce_linux_Midi.cpp b/modules/juce_audio_devices/native/juce_linux_Midi.cpp index 696f2987..3f87c27d 100644 --- a/modules/juce_audio_devices/native/juce_linux_Midi.cpp +++ b/modules/juce_audio_devices/native/juce_linux_Midi.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp b/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp index 24e5bfda..b9dfa3e9 100644 --- a/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp +++ b/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -20,6 +20,8 @@ ============================================================================== */ +#include + namespace juce { @@ -294,15 +296,11 @@ public: if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, ranges))) { - for (auto r : { 8000, 11025, 16000, 22050, 24000, 32000, - 44100, 48000, 88200, 96000, 176400, - 192000, 352800, 384000, 705600, 768000 }) + for (const auto rate : SampleRateHelpers::getAllSampleRates()) { - auto rate = (double) r; - for (int j = size / (int) sizeof (AudioValueRange); --j >= 0;) { - if (rate >= ranges[j].mMinimum - 2 && rate <= ranges[j].mMaximum + 2) + if (ranges[j].mMinimum - 2 <= rate && rate <= ranges[j].mMaximum + 2) { newSampleRates.add (rate); break; @@ -315,6 +313,11 @@ public: if (newSampleRates.isEmpty() && sampleRate > 0) newSampleRates.add (sampleRate); + auto nominalRate = getNominalSampleRate(); + + if ((nominalRate > 0) && ! newSampleRates.contains (nominalRate)) + newSampleRates.addUsingDefaultSort (nominalRate); + return newSampleRates; } @@ -745,7 +748,8 @@ public: double getSampleRate() const { return sampleRate; } int getBufferSize() const { return bufferSize; } - void audioCallback (const AudioBufferList* inInputData, + void audioCallback (const AudioTimeStamp* timeStamp, + const AudioBufferList* inInputData, AudioBufferList* outOutputData) { const ScopedLock sl (callbackLock); @@ -777,11 +781,14 @@ public: } } - callback->audioDeviceIOCallback (const_cast (tempInputBuffers.get()), - numInputChans, - tempOutputBuffers, - numOutputChans, - bufferSize); + const auto nanos = timeStamp != nullptr ? timeConversions.hostTimeToNanos (timeStamp->mHostTime) : 0; + + callback->audioDeviceIOCallbackWithContext (const_cast (tempInputBuffers.get()), + numInputChans, + tempOutputBuffers, + numOutputChans, + bufferSize, + { timeStamp != nullptr ? &nanos : nullptr }); for (int i = numOutputChans; --i >= 0;) { @@ -837,13 +844,14 @@ public: AudioDeviceIOProcID audioProcID = {}; private: + CoreAudioTimeConversions timeConversions; AudioIODeviceCallback* callback = nullptr; CriticalSection callbackLock; AudioDeviceID deviceID; bool started = false, audioDeviceStopPending = false; std::atomic playing { false }; double sampleRate = 0; - int bufferSize = 512; + int bufferSize = 0; HeapBlock audioBuffer; int numInputChans = 0; int numOutputChans = 0; @@ -875,14 +883,14 @@ private: } static OSStatus audioIOProc (AudioDeviceID /*inDevice*/, - const AudioTimeStamp* /*inNow*/, + const AudioTimeStamp* inNow, const AudioBufferList* inInputData, const AudioTimeStamp* /*inInputTime*/, AudioBufferList* outOutputData, const AudioTimeStamp* /*inOutputTime*/, void* device) { - static_cast (device)->audioCallback (inInputData, outOutputData); + static_cast (device)->audioCallback (inNow, inInputData, outOutputData); return noErr; } @@ -1623,8 +1631,12 @@ private: const ScopedLock sl (callbackLock); if (callback != nullptr) - callback->audioDeviceIOCallback ((const float**) inputChans.getRawDataPointer(), numInputChans, - outputChans.getRawDataPointer(), numOutputChans, numSamples); + callback->audioDeviceIOCallbackWithContext ((const float**) inputChans.getRawDataPointer(), + numInputChans, + outputChans.getRawDataPointer(), + numOutputChans, + numSamples, + {}); // Can't predict when the next output callback will happen else didCallback = false; } @@ -1919,9 +1931,12 @@ private: outputFifo.finishedWrite (size1 + size2); } - void audioDeviceIOCallback (const float** inputChannelData, int numInputChannels, - float** outputChannelData, int numOutputChannels, - int numSamples) override + void audioDeviceIOCallbackWithContext (const float** inputChannelData, + int numInputChannels, + float** outputChannelData, + int numOutputChannels, + int numSamples, + const AudioIODeviceCallbackContext&) override { if (numInputChannels > 0) { diff --git a/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm b/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm index 4e082e09..4f6d8b81 100644 --- a/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm +++ b/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -82,10 +82,8 @@ namespace CoreMidiHelpers struct Sender; #if JUCE_HAS_NEW_COREMIDI_API - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") - template <> - struct Sender : public SenderBase + struct API_AVAILABLE (macos (11.0), ios (14.0)) Sender : public SenderBase { explicit Sender (MIDIEndpointRef ep) : umpConverter (getProtocolForEndpoint (ep)) @@ -177,8 +175,6 @@ namespace CoreMidiHelpers send(); } }; - - JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif #if JUCE_HAS_OLD_COREMIDI_API @@ -829,10 +825,8 @@ namespace CoreMidiHelpers struct CreatorFunctions; #if JUCE_HAS_NEW_COREMIDI_API - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability", "-Wunguarded-availability-new") - template <> - struct CreatorFunctions + struct API_AVAILABLE (macos (11.0), ios (14.0)) CreatorFunctions { static OSStatus createInputPort (ump::PacketProtocol protocol, MIDIClientRef client, @@ -894,8 +888,6 @@ namespace CoreMidiHelpers static_cast (readProcRefCon)->handlePackets (*list); } }; - - JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif #if JUCE_HAS_OLD_COREMIDI_API diff --git a/modules/juce_audio_devices/native/juce_win32_ASIO.cpp b/modules/juce_audio_devices/native/juce_win32_ASIO.cpp index 904c7f4b..529c8b6f 100644 --- a/modules/juce_audio_devices/native/juce_win32_ASIO.cpp +++ b/modules/juce_audio_devices/native/juce_win32_ASIO.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -349,13 +349,9 @@ public: Array newRates; if (asioObject != nullptr) - { - for (auto rate : { 8000, 11025, 16000, 22050, 24000, 32000, - 44100, 48000, 88200, 96000, 176400, - 192000, 352800, 384000, 705600, 768000 }) - if (asioObject->canSampleRate ((double) rate) == 0) - newRates.add ((double) rate); - } + for (const auto rate : SampleRateHelpers::getAllSampleRates()) + if (asioObject->canSampleRate (rate) == 0) + newRates.add (rate); if (newRates.isEmpty()) { @@ -1330,8 +1326,12 @@ private: inputFormat[i].convertToFloat (infos[i].buffers[bufferIndex], inBuffers[i], samps); } - currentCallback->audioDeviceIOCallback (const_cast (inBuffers.getData()), numActiveInputChans, - outBuffers, numActiveOutputChans, samps); + currentCallback->audioDeviceIOCallbackWithContext (const_cast (inBuffers.getData()), + numActiveInputChans, + outBuffers, + numActiveOutputChans, + samps, + {}); for (int i = 0; i < numActiveOutputChans; ++i) { diff --git a/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp b/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp index 811bfb9c..b0e5dcd1 100644 --- a/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp +++ b/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -130,7 +130,7 @@ namespace juce //============================================================================== namespace DSoundLogging { - String getErrorMessage (HRESULT hr) + static String getErrorMessage (HRESULT hr) { const char* result = nullptr; @@ -1016,9 +1016,12 @@ public: if (isStarted) { - callback->audioDeviceIOCallback (inputBuffers.getArrayOfReadPointers(), inputBuffers.getNumChannels(), - outputBuffers.getArrayOfWritePointers(), outputBuffers.getNumChannels(), - bufferSizeSamples); + callback->audioDeviceIOCallbackWithContext (inputBuffers.getArrayOfReadPointers(), + inputBuffers.getNumChannels(), + outputBuffers.getArrayOfWritePointers(), + outputBuffers.getNumChannels(), + bufferSizeSamples, + {}); } else { diff --git a/modules/juce_audio_devices/native/juce_win32_Midi.cpp b/modules/juce_audio_devices/native/juce_win32_Midi.cpp index 0ac9bfe5..803f5b34 100644 --- a/modules/juce_audio_devices/native/juce_win32_Midi.cpp +++ b/modules/juce_audio_devices/native/juce_win32_Midi.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp b/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp index ae927e08..b1a0aae1 100644 --- a/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp +++ b/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. @@ -33,7 +33,7 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") namespace WasapiClasses { -void logFailure (HRESULT hr) +static void logFailure (HRESULT hr) { ignoreUnused (hr); jassert (hr != (HRESULT) 0x800401f0); // If you hit this, it means you're trying to call from @@ -89,7 +89,7 @@ void logFailure (HRESULT hr) #undef check -bool check (HRESULT hr) +static bool check (HRESULT hr) { logFailure (hr); return SUCCEEDED (hr); @@ -361,7 +361,7 @@ namespace juce namespace WasapiClasses { -String getDeviceID (IMMDevice* device) +static String getDeviceID (IMMDevice* device) { String s; WCHAR* deviceId = nullptr; @@ -676,9 +676,7 @@ private: void querySupportedSampleRates (WAVEFORMATEXTENSIBLE format, ComSmartPtr& audioClient) { - for (auto rate : { 8000, 11025, 16000, 22050, 24000, 32000, - 44100, 48000, 88200, 96000, 176400, - 192000, 352800, 384000, 705600, 768000 }) + for (auto rate : SampleRateHelpers::getAllSampleRates()) { if (rates.contains (rate)) continue; @@ -695,7 +693,7 @@ private: : &nearestFormat))) { if (nearestFormat != nullptr) - rate = (int) nearestFormat->nSamplesPerSec; + rate = (double) nearestFormat->nSamplesPerSec; if (! rates.contains (rate)) rates.addUsingDefaultSort (rate); @@ -1517,8 +1515,12 @@ public: const ScopedTryLock sl (startStopLock); if (sl.isLocked() && isStarted) - callback->audioDeviceIOCallback (const_cast (inputBuffers), numInputBuffers, - outputBuffers, numOutputBuffers, bufferSize); + callback->audioDeviceIOCallbackWithContext (const_cast (inputBuffers), + numInputBuffers, + outputBuffers, + numOutputBuffers, + bufferSize, + {}); else outs.clear(); } diff --git a/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp b/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp index 4968487f..8270d20a 100644 --- a/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp +++ b/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h b/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h index 7733a843..65c19aac 100644 --- a/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h +++ b/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp b/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp index 64fa1447..cbf1a5b3 100644 --- a/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp +++ b/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_devices/sources/juce_AudioTransportSource.h b/modules/juce_audio_devices/sources/juce_AudioTransportSource.h index 7e35946c..3d82788c 100644 --- a/modules/juce_audio_devices/sources/juce_AudioTransportSource.h +++ b/modules/juce_audio_devices/sources/juce_AudioTransportSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. diff --git a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp index c24b2987..a5b63297 100644 --- a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h index 0b31235c..2396b3ba 100644 --- a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp index b018b80a..e7ef336d 100644 --- a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h index 60c9e54a..0b66416b 100644 --- a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp index e780ca5a..da653987 100644 --- a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -153,12 +153,13 @@ namespace FlacNamespace #include "flac/libFLAC/stream_encoder_framing.c" #include "flac/libFLAC/window_flac.c" #undef VERSION -#else - #include -#endif JUCE_END_IGNORE_WARNINGS_GCC_LIKE JUCE_END_IGNORE_WARNINGS_MSVC + +#else + #include +#endif } #undef max diff --git a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h index 258efca2..ededf6ca 100644 --- a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp index 39d874c7..1120b0ff 100644 --- a/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h b/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h index c0c08c55..766513c5 100644 --- a/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp index 49bf0fe2..7a287f9c 100644 --- a/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h b/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h index 22d9db6c..15561c8e 100644 --- a/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp index d9ffa50b..d1e0efdb 100644 --- a/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -49,7 +49,8 @@ namespace OggVorbisNamespace "-Wredundant-decls", "-Wmisleading-indentation", "-Wmissing-prototypes", - "-Wcast-align") + "-Wcast-align", + "-Wmaybe-uninitialized") JUCE_BEGIN_NO_SANITIZE ("undefined") #include "oggvorbis/vorbisenc.h" diff --git a/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h b/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h index 1e82d457..bc3e8b5b 100644 --- a/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp index aa2ef4ff..20f0f492 100644 --- a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -168,6 +168,91 @@ const char* const WavAudioFormat::riffInfoWatermarkURL = "IWMU"; const char* const WavAudioFormat::riffInfoWrittenBy = "IWRI"; const char* const WavAudioFormat::riffInfoYear = "YEAR"; +const char* const WavAudioFormat::aswgContentType = "contentType"; +const char* const WavAudioFormat::aswgProject = "project"; +const char* const WavAudioFormat::aswgOriginator = "originator"; +const char* const WavAudioFormat::aswgOriginatorStudio = "originatorStudio"; +const char* const WavAudioFormat::aswgNotes = "notes"; +const char* const WavAudioFormat::aswgSession = "session"; +const char* const WavAudioFormat::aswgState = "state"; +const char* const WavAudioFormat::aswgEditor = "editor"; +const char* const WavAudioFormat::aswgMixer = "mixer"; +const char* const WavAudioFormat::aswgFxChainName = "fxChainName"; +const char* const WavAudioFormat::aswgChannelConfig = "channelConfig"; +const char* const WavAudioFormat::aswgAmbisonicFormat = "ambisonicFormat"; +const char* const WavAudioFormat::aswgAmbisonicChnOrder = "ambisonicChnOrder"; +const char* const WavAudioFormat::aswgAmbisonicNorm = "ambisonicNorm"; +const char* const WavAudioFormat::aswgMicType = "micType"; +const char* const WavAudioFormat::aswgMicConfig = "micConfig"; +const char* const WavAudioFormat::aswgMicDistance = "micDistance"; +const char* const WavAudioFormat::aswgRecordingLoc = "recordingLoc"; +const char* const WavAudioFormat::aswgIsDesigned = "isDesigned"; +const char* const WavAudioFormat::aswgRecEngineer = "recEngineer"; +const char* const WavAudioFormat::aswgRecStudio = "recStudio"; +const char* const WavAudioFormat::aswgImpulseLocation = "impulseLocation"; +const char* const WavAudioFormat::aswgCategory = "category"; +const char* const WavAudioFormat::aswgSubCategory = "subCategory"; +const char* const WavAudioFormat::aswgCatId = "catId"; +const char* const WavAudioFormat::aswgUserCategory = "userCategory"; +const char* const WavAudioFormat::aswgUserData = "userData"; +const char* const WavAudioFormat::aswgVendorCategory = "vendorCategory"; +const char* const WavAudioFormat::aswgFxName = "fxName"; +const char* const WavAudioFormat::aswgLibrary = "library"; +const char* const WavAudioFormat::aswgCreatorId = "creatorId"; +const char* const WavAudioFormat::aswgSourceId = "sourceId"; +const char* const WavAudioFormat::aswgRmsPower = "rmsPower"; +const char* const WavAudioFormat::aswgLoudness = "loudness"; +const char* const WavAudioFormat::aswgLoudnessRange = "loudnessRange"; +const char* const WavAudioFormat::aswgMaxPeak = "maxPeak"; +const char* const WavAudioFormat::aswgSpecDensity = "specDensity"; +const char* const WavAudioFormat::aswgZeroCrossRate = "zeroCrossRate"; +const char* const WavAudioFormat::aswgPapr = "papr"; +const char* const WavAudioFormat::aswgText = "text"; +const char* const WavAudioFormat::aswgEfforts = "efforts"; +const char* const WavAudioFormat::aswgEffortType = "effortType"; +const char* const WavAudioFormat::aswgProjection = "projection"; +const char* const WavAudioFormat::aswgLanguage = "language"; +const char* const WavAudioFormat::aswgTimingRestriction = "timingRestriction"; +const char* const WavAudioFormat::aswgCharacterName = "characterName"; +const char* const WavAudioFormat::aswgCharacterGender = "characterGender"; +const char* const WavAudioFormat::aswgCharacterAge = "characterAge"; +const char* const WavAudioFormat::aswgCharacterRole = "characterRole"; +const char* const WavAudioFormat::aswgActorName = "actorName"; +const char* const WavAudioFormat::aswgActorGender = "actorGender"; +const char* const WavAudioFormat::aswgDirector = "director"; +const char* const WavAudioFormat::aswgDirection = "direction"; +const char* const WavAudioFormat::aswgFxUsed = "fxUsed"; +const char* const WavAudioFormat::aswgUsageRights = "usageRights"; +const char* const WavAudioFormat::aswgIsUnion = "isUnion"; +const char* const WavAudioFormat::aswgAccent = "accent"; +const char* const WavAudioFormat::aswgEmotion = "emotion"; +const char* const WavAudioFormat::aswgComposor = "composor"; +const char* const WavAudioFormat::aswgArtist = "artist"; +const char* const WavAudioFormat::aswgSongTitle = "songTitle"; +const char* const WavAudioFormat::aswgGenre = "genre"; +const char* const WavAudioFormat::aswgSubGenre = "subGenre"; +const char* const WavAudioFormat::aswgProducer = "producer"; +const char* const WavAudioFormat::aswgMusicSup = "musicSup"; +const char* const WavAudioFormat::aswgInstrument = "instrument"; +const char* const WavAudioFormat::aswgMusicPublisher = "musicPublisher"; +const char* const WavAudioFormat::aswgRightsOwner = "rightsOwner"; +const char* const WavAudioFormat::aswgIsSource = "isSource"; +const char* const WavAudioFormat::aswgIsLoop = "isLoop"; +const char* const WavAudioFormat::aswgIntensity = "intensity"; +const char* const WavAudioFormat::aswgIsFinal = "isFinal"; +const char* const WavAudioFormat::aswgOrderRef = "orderRef"; +const char* const WavAudioFormat::aswgIsOst = "isOst"; +const char* const WavAudioFormat::aswgIsCinematic = "isCinematic"; +const char* const WavAudioFormat::aswgIsLicensed = "isLicensed"; +const char* const WavAudioFormat::aswgIsDiegetic = "isDiegetic"; +const char* const WavAudioFormat::aswgMusicVersion = "musicVersion"; +const char* const WavAudioFormat::aswgIsrcId = "isrcId"; +const char* const WavAudioFormat::aswgTempo = "tempo"; +const char* const WavAudioFormat::aswgTimeSig = "timeSig"; +const char* const WavAudioFormat::aswgInKey = "inKey"; +const char* const WavAudioFormat::aswgBillingCode = "billingCode"; +const char* const WavAudioFormat::aswgVersion = "IXML_VERSION"; + const char* const WavAudioFormat::ISRC = "ISRC"; const char* const WavAudioFormat::internationalStandardRecordingCode = "international standard recording code"; const char* const WavAudioFormat::tracktionLoopInfo = "tracktion loop info"; @@ -863,6 +948,157 @@ namespace WavFileHelpers } }; + //============================================================================= + namespace IXMLChunk + { + static const std::unordered_set aswgMetadataKeys + { + WavAudioFormat::aswgContentType, + WavAudioFormat::aswgProject, + WavAudioFormat::aswgOriginator, + WavAudioFormat::aswgOriginatorStudio, + WavAudioFormat::aswgNotes, + WavAudioFormat::aswgSession, + WavAudioFormat::aswgState, + WavAudioFormat::aswgEditor, + WavAudioFormat::aswgMixer, + WavAudioFormat::aswgFxChainName, + WavAudioFormat::aswgChannelConfig, + WavAudioFormat::aswgAmbisonicFormat, + WavAudioFormat::aswgAmbisonicChnOrder, + WavAudioFormat::aswgAmbisonicNorm, + WavAudioFormat::aswgMicType, + WavAudioFormat::aswgMicConfig, + WavAudioFormat::aswgMicDistance, + WavAudioFormat::aswgRecordingLoc, + WavAudioFormat::aswgIsDesigned, + WavAudioFormat::aswgRecEngineer, + WavAudioFormat::aswgRecStudio, + WavAudioFormat::aswgImpulseLocation, + WavAudioFormat::aswgCategory, + WavAudioFormat::aswgSubCategory, + WavAudioFormat::aswgCatId, + WavAudioFormat::aswgUserCategory, + WavAudioFormat::aswgUserData, + WavAudioFormat::aswgVendorCategory, + WavAudioFormat::aswgFxName, + WavAudioFormat::aswgLibrary, + WavAudioFormat::aswgCreatorId, + WavAudioFormat::aswgSourceId, + WavAudioFormat::aswgRmsPower, + WavAudioFormat::aswgLoudness, + WavAudioFormat::aswgLoudnessRange, + WavAudioFormat::aswgMaxPeak, + WavAudioFormat::aswgSpecDensity, + WavAudioFormat::aswgZeroCrossRate, + WavAudioFormat::aswgPapr, + WavAudioFormat::aswgText, + WavAudioFormat::aswgEfforts, + WavAudioFormat::aswgEffortType, + WavAudioFormat::aswgProjection, + WavAudioFormat::aswgLanguage, + WavAudioFormat::aswgTimingRestriction, + WavAudioFormat::aswgCharacterName, + WavAudioFormat::aswgCharacterGender, + WavAudioFormat::aswgCharacterAge, + WavAudioFormat::aswgCharacterRole, + WavAudioFormat::aswgActorName, + WavAudioFormat::aswgActorGender, + WavAudioFormat::aswgDirector, + WavAudioFormat::aswgDirection, + WavAudioFormat::aswgFxUsed, + WavAudioFormat::aswgUsageRights, + WavAudioFormat::aswgIsUnion, + WavAudioFormat::aswgAccent, + WavAudioFormat::aswgEmotion, + WavAudioFormat::aswgComposor, + WavAudioFormat::aswgArtist, + WavAudioFormat::aswgSongTitle, + WavAudioFormat::aswgGenre, + WavAudioFormat::aswgSubGenre, + WavAudioFormat::aswgProducer, + WavAudioFormat::aswgMusicSup, + WavAudioFormat::aswgInstrument, + WavAudioFormat::aswgMusicPublisher, + WavAudioFormat::aswgRightsOwner, + WavAudioFormat::aswgIsSource, + WavAudioFormat::aswgIsLoop, + WavAudioFormat::aswgIntensity, + WavAudioFormat::aswgIsFinal, + WavAudioFormat::aswgOrderRef, + WavAudioFormat::aswgIsOst, + WavAudioFormat::aswgIsCinematic, + WavAudioFormat::aswgIsLicensed, + WavAudioFormat::aswgIsDiegetic, + WavAudioFormat::aswgMusicVersion, + WavAudioFormat::aswgIsrcId, + WavAudioFormat::aswgTempo, + WavAudioFormat::aswgTimeSig, + WavAudioFormat::aswgInKey, + WavAudioFormat::aswgBillingCode + }; + + static void addToMetadata (StringMap& destValues, const String& source) + { + if (auto xml = parseXML (source)) + { + if (xml->hasTagName ("BWFXML")) + { + if (const auto* entry = xml->getChildByName (WavAudioFormat::aswgVersion)) + destValues[WavAudioFormat::aswgVersion] = entry->getAllSubText(); + + if (const auto* aswgElement = xml->getChildByName ("ASWG")) + { + for (const auto* entry : aswgElement->getChildIterator()) + { + const auto& tag = entry->getTagName(); + + if (aswgMetadataKeys.find (tag) != aswgMetadataKeys.end()) + destValues[tag] = entry->getAllSubText(); + } + } + } + } + } + + static MemoryBlock createFrom (const StringMap& values) + { + auto createTextElement = [] (const StringRef& key, const StringRef& value) + { + auto* elem = new XmlElement (key); + elem->addTextElement (value); + return elem; + }; + + std::unique_ptr aswgElement; + + for (const auto& pair : values) + { + if (aswgMetadataKeys.find (pair.first) != aswgMetadataKeys.end()) + { + if (aswgElement == nullptr) + aswgElement = std::make_unique ("ASWG"); + + aswgElement->addChildElement (createTextElement (pair.first, pair.second)); + } + } + + MemoryOutputStream outputStream; + + if (aswgElement != nullptr) + { + XmlElement xml ("BWFXML"); + auto aswgVersion = getValueWithDefault (values, WavAudioFormat::aswgVersion, "3.01"); + xml.addChildElement (createTextElement (WavAudioFormat::aswgVersion, aswgVersion)); + xml.addChildElement (aswgElement.release()); + xml.writeTo (outputStream); + outputStream.writeRepeatedByte (0, outputStream.getDataSize()); + } + + return outputStream.getMemoryBlock(); + } + } + //============================================================================== namespace AXMLChunk { @@ -1143,6 +1379,12 @@ public: input->readIntoMemoryBlock (axml, (ssize_t) length); AXMLChunk::addToMetadata (dict, axml.toString()); } + else if (chunkType == chunkName ("iXML")) + { + MemoryBlock ixml; + input->readIntoMemoryBlock (ixml, (ssize_t) length); + IXMLChunk::addToMetadata (dict, ixml.toString()); + } else if (chunkType == chunkName ("LIST")) { auto subChunkType = input->readInt(); @@ -1357,6 +1599,7 @@ public: const auto map = toMap (metadataValues); bwavChunk = BWAVChunk::createFrom (map); + ixmlChunk = IXMLChunk::createFrom (map); axmlChunk = AXMLChunk::createFrom (map); smplChunk = SMPLChunk::createFrom (map); instChunk = InstChunk::createFrom (map); @@ -1427,7 +1670,7 @@ public: } private: - MemoryBlock tempBlock, bwavChunk, axmlChunk, smplChunk, instChunk, cueChunk, listChunk, listInfoChunk, acidChunk, trckChunk; + MemoryBlock tempBlock, bwavChunk, ixmlChunk, axmlChunk, smplChunk, instChunk, cueChunk, listChunk, listInfoChunk, acidChunk, trckChunk; uint64 lengthInSamples = 0, bytesWritten = 0; int64 headerPosition = 0; bool writeFailed = false; @@ -1457,6 +1700,7 @@ private: int64 riffChunkSize = (int64) (4 /* 'RIFF' */ + 8 + 40 /* WAVEFORMATEX */ + 8 + audioDataSize + (audioDataSize & 1) + chunkSize (bwavChunk) + + chunkSize (ixmlChunk) + chunkSize (axmlChunk) + chunkSize (smplChunk) + chunkSize (instChunk) @@ -1539,6 +1783,7 @@ private: } writeChunk (bwavChunk, chunkName ("bext")); + writeChunk (ixmlChunk, chunkName ("iXML")); writeChunk (axmlChunk, chunkName ("axml")); writeChunk (smplChunk, chunkName ("smpl")); writeChunk (instChunk, chunkName ("inst"), 7); @@ -1958,6 +2203,61 @@ struct WaveAudioFormatTests : public UnitTest expect (a[WavAudioFormat::riffInfoSource] == "source"); expect (a[WavAudioFormat::internationalStandardRecordingCode] == "UUVVVXXYYYYY"); } + + { + beginTest ("Files containing ASWG metadata read and write correctly"); + MemoryBlock block; + StringPairArray meta; + + for (const auto& key : WavFileHelpers::IXMLChunk::aswgMetadataKeys) + meta.set (key, "Test123&<>"); + + { + auto writer = rawToUniquePtr (WavAudioFormat().createWriterFor (new MemoryOutputStream (block, false), 48000, 1, 32, meta, 0)); + expect (writer != nullptr); + } + + expect ([&] + { + auto input = std::make_unique (block, false); + + while (! input->isExhausted()) + { + char chunkType[4] {}; + auto pos = input->getPosition(); + + input->read (chunkType, 4); + + if (memcmp (chunkType, "iXML", 4) == 0) + { + auto length = (uint32) input->readInt(); + + MemoryBlock xmlBlock; + input->readIntoMemoryBlock (xmlBlock, (ssize_t) length); + + return parseXML (xmlBlock.toString()) != nullptr; + } + + input->setPosition (pos + 1); + } + + return false; + }()); + + { + auto reader = rawToUniquePtr (WavAudioFormat().createReaderFor (new MemoryInputStream (block, false), true)); + expect (reader != nullptr); + + for (const auto& key : meta.getAllKeys()) + { + const auto oldValue = meta.getValue (key, "!"); + const auto newValue = reader->metadataValues.getValue (key, ""); + expectEquals (oldValue, newValue); + } + + expect (reader->metadataValues.getValue (WavAudioFormat::aswgVersion, "") == "3.01"); + } + } } private: diff --git a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h index 766d76b8..f3dae852 100644 --- a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -175,6 +175,94 @@ public: static const char* const riffInfoWrittenBy; /**< Metadata property name used in INFO chunks. */ static const char* const riffInfoYear; /**< Metadata property name used in INFO chunks. */ + //============================================================================== + // ASWG chunk properties: + + static const char* const aswgContentType; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgProject; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgOriginator; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgOriginatorStudio; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgNotes; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgSession; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgState; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgEditor; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMixer; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgFxChainName; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgChannelConfig; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgAmbisonicFormat; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgAmbisonicChnOrder; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgAmbisonicNorm; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMicType; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMicConfig; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMicDistance; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgRecordingLoc; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsDesigned; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgRecEngineer; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgRecStudio; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgImpulseLocation; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCategory; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgSubCategory; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCatId; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgUserCategory; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgUserData; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgVendorCategory; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgFxName; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgLibrary; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCreatorId; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgSourceId; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgRmsPower; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgLoudness; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgLoudnessRange; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMaxPeak; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgSpecDensity; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgZeroCrossRate; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgPapr; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgText; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgEfforts; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgEffortType; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgProjection; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgLanguage; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgTimingRestriction; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCharacterName; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCharacterGender; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCharacterAge; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgCharacterRole; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgActorName; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgActorGender; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgDirector; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgDirection; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgFxUsed; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgUsageRights; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsUnion; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgAccent; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgEmotion; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgComposor; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgArtist; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgSongTitle; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgGenre; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgSubGenre; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgProducer; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMusicSup; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgInstrument; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMusicPublisher; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgRightsOwner; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsSource; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsLoop; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIntensity; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsFinal; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgOrderRef; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsOst; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsCinematic; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsLicensed; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsDiegetic; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgMusicVersion; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgIsrcId; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgTempo; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgTimeSig; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgInKey; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgBillingCode; /**< Metadata property name used in ASWG/iXML chunks. */ + static const char* const aswgVersion; /**< Metadata property name used in ASWG/iXML chunks. */ + //============================================================================== /** Metadata property name used when reading an ISRC code from an AXML chunk. */ [[deprecated ("This string is identical to riffInfoSource, making it impossible to differentiate between the two")]] diff --git a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp index aa8b289c..9764a696 100644 --- a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h index a25b9868..15306132 100644 --- a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp b/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp new file mode 100644 index 00000000..e02ab8f7 --- /dev/null +++ b/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp @@ -0,0 +1,310 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +ARAAudioSourceReader::ARAAudioSourceReader (ARAAudioSource* audioSource) + : AudioFormatReader (nullptr, "ARAAudioSourceReader"), + audioSourceBeingRead (audioSource) +{ + jassert (audioSourceBeingRead != nullptr); + + bitsPerSample = 32; + usesFloatingPointData = true; + sampleRate = audioSourceBeingRead->getSampleRate(); + numChannels = (unsigned int) audioSourceBeingRead->getChannelCount(); + lengthInSamples = audioSourceBeingRead->getSampleCount(); + tmpPtrs.resize (numChannels); + + audioSourceBeingRead->addListener (this); + + if (audioSourceBeingRead->isSampleAccessEnabled()) + hostReader.reset (new ARA::PlugIn::HostAudioReader (audioSourceBeingRead)); +} + +ARAAudioSourceReader::~ARAAudioSourceReader() +{ + invalidate(); +} + +void ARAAudioSourceReader::invalidate() +{ + ScopedWriteLock scopedLock (lock); + + if (! isValid()) + return; + + hostReader.reset(); + + audioSourceBeingRead->removeListener (this); + audioSourceBeingRead = nullptr; +} + +void ARAAudioSourceReader::willUpdateAudioSourceProperties (ARAAudioSource* audioSource, + ARAAudioSource::PropertiesPtr newProperties) +{ + if (audioSource->getSampleCount() != newProperties->sampleCount + || audioSource->getSampleRate() != newProperties->sampleRate + || audioSource->getChannelCount() != newProperties->channelCount) + { + invalidate(); + } +} + +void ARAAudioSourceReader::doUpdateAudioSourceContent (ARAAudioSource* audioSource, + ARAContentUpdateScopes scopeFlags) +{ + jassertquiet (audioSourceBeingRead == audioSource); + + // Don't invalidate if the audio signal is unchanged + if (scopeFlags.affectSamples()) + invalidate(); +} + +void ARAAudioSourceReader::willEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) +{ + jassertquiet (audioSourceBeingRead == audioSource); + + // Invalidate our reader if sample access is disabled + if (! enable) + { + ScopedWriteLock scopedLock (lock); + hostReader.reset(); + } +} + +void ARAAudioSourceReader::didEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) +{ + jassertquiet (audioSourceBeingRead == audioSource); + + // Recreate our reader if sample access is enabled + if (enable && isValid()) + { + ScopedWriteLock scopedLock (lock); + hostReader.reset (new ARA::PlugIn::HostAudioReader (audioSourceBeingRead)); + } +} + +void ARAAudioSourceReader::willDestroyAudioSource (ARAAudioSource* audioSource) +{ + jassertquiet (audioSourceBeingRead == audioSource); + + invalidate(); +} + +bool ARAAudioSourceReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) +{ + const auto destSize = (bitsPerSample / 8) * (size_t) numSamples; + const auto bufferOffset = (int) (bitsPerSample / 8) * startOffsetInDestBuffer; + + if (isValid() && hostReader != nullptr) + { + const ScopedTryReadLock readLock (lock); + + if (readLock.isLocked()) + { + for (size_t i = 0; i < tmpPtrs.size(); ++i) + { + if ((i < (size_t) numDestChannels) && (destSamples[i] != nullptr)) + { + tmpPtrs[i] = ((uint8_t*) destSamples[i]) + bufferOffset; + } + else + { + // We need to provide destination pointers for all channels in the ARA read call, even if + // readSamples is not reading all of them. Hence we use this dummy buffer to pad the read + // destination area. + static thread_local std::vector dummyBuffer; + + if (destSize > dummyBuffer.size()) + dummyBuffer.resize (destSize); + + tmpPtrs[i] = dummyBuffer.data(); + } + } + + return hostReader->readAudioSamples (startSampleInFile, numSamples, tmpPtrs.data()); + } + } + + for (int i = 0; i < numDestChannels; ++i) + if (destSamples[i] != nullptr) + zeromem (((uint8_t*) destSamples[i]) + bufferOffset, destSize); + + return false; +} + +//============================================================================== +ARAPlaybackRegionReader::ARAPlaybackRegionReader (ARAPlaybackRegion* playbackRegion) + : ARAPlaybackRegionReader (playbackRegion->getAudioModification()->getAudioSource()->getSampleRate(), + playbackRegion->getAudioModification()->getAudioSource()->getChannelCount(), + { playbackRegion }) +{} + +ARAPlaybackRegionReader::ARAPlaybackRegionReader (double rate, int numChans, + const std::vector& playbackRegions) + : AudioFormatReader (nullptr, "ARAPlaybackRegionReader") +{ + // We're only providing the minimal set of meaningful values, since the ARA renderer should only + // look at the time position and the playing state, and read any related tempo or bar signature + // information from the ARA model directly (MusicalContext). + positionInfo.setIsPlaying (true); + + sampleRate = rate; + numChannels = (unsigned int) numChans; + bitsPerSample = 32; + usesFloatingPointData = true; + + auto* documentController = (! playbackRegions.empty()) + ? playbackRegions.front()->getDocumentController() + : nullptr; + + playbackRenderer.reset (documentController ? static_cast (documentController->doCreatePlaybackRenderer()) + : nullptr); + + if (playbackRenderer != nullptr) + { + double regionsStartTime = std::numeric_limits::max(); + double regionsEndTime = std::numeric_limits::lowest(); + + for (const auto& playbackRegion : playbackRegions) + { + jassert (playbackRegion->getDocumentController() == documentController); + auto playbackRegionTimeRange = playbackRegion->getTimeRange (ARAPlaybackRegion::IncludeHeadAndTail::yes); + regionsStartTime = jmin (regionsStartTime, playbackRegionTimeRange.getStart()); + regionsEndTime = jmax (regionsEndTime, playbackRegionTimeRange.getEnd()); + + playbackRenderer->addPlaybackRegion (ARA::PlugIn::toRef (playbackRegion)); + playbackRegion->addListener (this); + } + + startInSamples = (int64) (regionsStartTime * sampleRate + 0.5); + lengthInSamples = (int64) ((regionsEndTime - regionsStartTime) * sampleRate + 0.5); + + playbackRenderer->prepareToPlay (rate, + maximumBlockSize, + numChans, + AudioProcessor::ProcessingPrecision::singlePrecision, + ARARenderer::AlwaysNonRealtime::yes); + } + else + { + startInSamples = 0; + lengthInSamples = 0; + } +} + +ARAPlaybackRegionReader::~ARAPlaybackRegionReader() +{ + invalidate(); +} + +void ARAPlaybackRegionReader::invalidate() +{ + ScopedWriteLock scopedWrite (lock); + + if (! isValid()) + return; + + for (auto& playbackRegion : playbackRenderer->getPlaybackRegions()) + playbackRegion->removeListener (this); + + playbackRenderer->releaseResources(); + playbackRenderer.reset(); +} + +bool ARAPlaybackRegionReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) +{ + bool success = false; + bool needClearSamples = true; + + const ScopedTryReadLock readLock (lock); + + if (readLock.isLocked()) + { + if (isValid()) + { + success = true; + needClearSamples = false; + positionInfo.setTimeInSamples (startSampleInFile + startInSamples); + + while (numSamples > 0) + { + const int numSliceSamples = jmin (numSamples, maximumBlockSize); + AudioBuffer buffer ((float **) destSamples, numDestChannels, startOffsetInDestBuffer, numSliceSamples); + positionInfo.setTimeInSeconds (static_cast (*positionInfo.getTimeInSamples()) / sampleRate); + success &= playbackRenderer->processBlock (buffer, AudioProcessor::Realtime::no, positionInfo); + numSamples -= numSliceSamples; + startOffsetInDestBuffer += numSliceSamples; + positionInfo.setTimeInSamples (*positionInfo.getTimeInSamples() + numSliceSamples); + } + } + } + + if (needClearSamples) + for (int chan_i = 0; chan_i < numDestChannels; ++chan_i) + FloatVectorOperations::clear ((float *) destSamples[chan_i], numSamples); + + return success; +} + +void ARAPlaybackRegionReader::willUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion, ARAPlaybackRegion::PropertiesPtr newProperties) +{ + jassert (ARA::contains (playbackRenderer->getPlaybackRegions(), playbackRegion)); + + if ((playbackRegion->getStartInAudioModificationTime() != newProperties->startInModificationTime) + || (playbackRegion->getDurationInAudioModificationTime() != newProperties->durationInModificationTime) + || (playbackRegion->getStartInPlaybackTime() != newProperties->startInPlaybackTime) + || (playbackRegion->getDurationInPlaybackTime() != newProperties->durationInPlaybackTime) + || (playbackRegion->isTimestretchEnabled() != ((newProperties->transformationFlags & ARA::kARAPlaybackTransformationTimestretch) != 0)) + || (playbackRegion->isTimeStretchReflectingTempo() != ((newProperties->transformationFlags & ARA::kARAPlaybackTransformationTimestretchReflectingTempo) != 0)) + || (playbackRegion->hasContentBasedFadeAtHead() != ((newProperties->transformationFlags & ARA::kARAPlaybackTransformationContentBasedFadeAtHead) != 0)) + || (playbackRegion->hasContentBasedFadeAtTail() != ((newProperties->transformationFlags & ARA::kARAPlaybackTransformationContentBasedFadeAtTail) != 0))) + { + invalidate(); + } +} + +void ARAPlaybackRegionReader::didUpdatePlaybackRegionContent (ARAPlaybackRegion* playbackRegion, + ARAContentUpdateScopes scopeFlags) +{ + jassertquiet (ARA::contains (playbackRenderer->getPlaybackRegions(), playbackRegion)); + + // Invalidate if the audio signal is changed + if (scopeFlags.affectSamples()) + invalidate(); +} + +void ARAPlaybackRegionReader::willDestroyPlaybackRegion (ARAPlaybackRegion* playbackRegion) +{ + jassertquiet (ARA::contains (playbackRenderer->getPlaybackRegions(), playbackRegion)); + + invalidate(); +} + +} // namespace juce diff --git a/modules/juce_audio_formats/format/juce_ARAAudioReaders.h b/modules/juce_audio_formats/format/juce_ARAAudioReaders.h new file mode 100644 index 00000000..c55a0636 --- /dev/null +++ b/modules/juce_audio_formats/format/juce_ARAAudioReaders.h @@ -0,0 +1,194 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#pragma once + +namespace juce +{ + +class AudioProcessor; + +/* All these readers follow a common pattern of "invalidation": + + Whenever the samples they are reading are altered, the readers become invalid and will stop + accessing the model graph. These alterations are model edits such as property changes, content + changes (if affecting sample scope), or the deletion of some model object involved in the read + process. Since these edits are performed on the document controller thread, reader validity can + immediately be checked after the edit has been concluded, and any reader that has become invalid + can be recreated. + + Note that encountering a failure in any individual read call does not invalidate the reader, so + that the entity using the reader can decide whether to retry or to back out. This includes trying + to read an audio source for which the host has currently disabled access: the failure will be + immediately visible, but the reader will remain valid. This ensures that for example a realtime + renderer can just keep reading and will be seeing proper samples again once sample access is + re-enabled. + + If desired, the code calling readSamples() can also implement proper signaling of any read error + to the document controller thread to trigger rebuilding the reader as needed. This will typically + be done when implementing audio source analysis: if there is an error upon reading the samples + that cannot be resolved within a reasonable timeout, then the analysis would be aborted. The + document controller code that monitors the analysis tasks can evaluate this and re-launch a new + analysis when appropriate (e.g. when access is re-enabled). + + When reading playback regions (directly or through a region sequence reader), the reader will + represent the regions as a single source object that covers the union of all affected regions. + The first sample produced by the reader thus will be the first sample of the earliest region. + This means that the location of this region has to be taken into account by the calling code if + it wants to relate the samples to the model or any other reader output. +*/ + +//============================================================================== +/** + Subclass of AudioFormatReader that reads samples from a single ARA audio source. + + Plug-Ins typically use this from their rendering code, wrapped in a BufferingAudioReader + to bridge between realtime rendering and non-realtime audio reading. + + The reader becomes invalidated if + - the audio source content is updated in a way that affects its samples, + - the audio source sample access is disabled, or + - the audio source being read is destroyed. + + @tags{ARA} +*/ +class JUCE_API ARAAudioSourceReader : public AudioFormatReader, + private ARAAudioSource::Listener +{ +public: + /** Use an ARAAudioSource to construct an audio source reader for the given \p audioSource. */ + explicit ARAAudioSourceReader (ARAAudioSource* audioSource); + + ~ARAAudioSourceReader() override; + + bool readSamples (int** destSamples, + int numDestChannels, + int startOffsetInDestBuffer, + int64 startSampleInFile, + int numSamples) override; + + /** Returns true as long as the reader's underlying ARAAudioSource remains accessible and its + sample content is not changed. + */ + bool isValid() const { return audioSourceBeingRead != nullptr; } + + /** Invalidate the reader - the reader will call this internally if needed, but can also be + invalidated from the outside (from message thread only!). + */ + void invalidate(); + + void willUpdateAudioSourceProperties (ARAAudioSource* audioSource, + ARAAudioSource::PropertiesPtr newProperties) override; + void doUpdateAudioSourceContent (ARAAudioSource* audioSource, + ARAContentUpdateScopes scopeFlags) override; + void willEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) override; + void didEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) override; + void willDestroyAudioSource (ARAAudioSource* audioSource) override; + +private: + ARAAudioSource* audioSourceBeingRead; + std::unique_ptr hostReader; + ReadWriteLock lock; + std::vector tmpPtrs; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAAudioSourceReader) +}; + +//============================================================================== +/** + Subclass of AudioFormatReader that reads samples from a group of playback regions. + + Plug-Ins typically use this to draw the output of a playback region in their UI. + + In order to read from playback regions, the reader requires an audio processor that acts as ARA + playback renderer. Configuring the audio processor for real-time operation results in the reader + being real-time capable too, unlike most other AudioFormatReaders. The reader instance will take + care of adding all regions being read to the renderer and invoke its processBlock function in + order to read the region samples. + + The reader becomes invalid if + - any region properties are updated in a way that would affect its samples, + - any region content is updated in a way that would affect its samples, or + - any of its regions are destroyed. + + @tags{ARA} +*/ +class JUCE_API ARAPlaybackRegionReader : public AudioFormatReader, + private ARAPlaybackRegion::Listener +{ +public: + /** Create an ARAPlaybackRegionReader instance to read the given \p playbackRegion, using the + sample rate and channel count of the underlying ARAAudioSource. + + @param playbackRegion The playback region that should be read - must not be nullptr! + */ + explicit ARAPlaybackRegionReader (ARAPlaybackRegion* playbackRegion); + + /** Create an ARAPlaybackRegionReader instance to read the given \p playbackRegions + + @param sampleRate The sample rate that should be used for reading. + @param numChannels The channel count that should be used for reading. + @param playbackRegions The vector of playback regions that should be read - must not be empty! + All regions must be part of the same ARADocument. + */ + ARAPlaybackRegionReader (double sampleRate, int numChannels, + const std::vector& playbackRegions); + + ~ARAPlaybackRegionReader() override; + + /** Returns true as long as any of the reader's underlying playback region's haven't changed. */ + bool isValid() const { return (playbackRenderer != nullptr); } + + /** Invalidate the reader - this should be called if the sample content of any of the reader's + ARAPlaybackRegions changes. + */ + void invalidate(); + + bool readSamples (int** destSamples, + int numDestChannels, + int startOffsetInDestBuffer, + int64 startSampleInFile, + int numSamples) override; + + void willUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion, + ARAPlaybackRegion::PropertiesPtr newProperties) override; + void didUpdatePlaybackRegionContent (ARAPlaybackRegion* playbackRegion, + ARAContentUpdateScopes scopeFlags) override; + void willDestroyPlaybackRegion (ARAPlaybackRegion* playbackRegion) override; + + /** The starting point of the reader in playback samples */ + int64 startInSamples = 0; + +private: + std::unique_ptr playbackRenderer; + AudioPlayHead::PositionInfo positionInfo; + ReadWriteLock lock; + + static constexpr int maximumBlockSize = 4 * 1024; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ARAPlaybackRegionReader) +}; + +} // namespace juce diff --git a/modules/juce_audio_formats/format/juce_AudioFormat.cpp b/modules/juce_audio_formats/format/juce_AudioFormat.cpp index 2e2e62d3..13cc287b 100644 --- a/modules/juce_audio_formats/format/juce_AudioFormat.cpp +++ b/modules/juce_audio_formats/format/juce_AudioFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/format/juce_AudioFormat.h b/modules/juce_audio_formats/format/juce_AudioFormat.h index c81b3d6b..cb69edaa 100644 --- a/modules/juce_audio_formats/format/juce_AudioFormat.h +++ b/modules/juce_audio_formats/format/juce_AudioFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp b/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp index 2b5570ab..cb67ca37 100644 --- a/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp +++ b/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/format/juce_AudioFormatManager.h b/modules/juce_audio_formats/format/juce_AudioFormatManager.h index dd838888..c5c11202 100644 --- a/modules/juce_audio_formats/format/juce_AudioFormatManager.h +++ b/modules/juce_audio_formats/format/juce_AudioFormatManager.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp b/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp index 2e465124..21e6e82b 100644 --- a/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp +++ b/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -122,7 +122,7 @@ bool AudioFormatReader::read (int* const* destChannels, return true; } -static void readChannels (AudioFormatReader& reader, int** chans, AudioBuffer* buffer, +static bool readChannels (AudioFormatReader& reader, int** chans, AudioBuffer* buffer, int startSample, int numSamples, int64 readerStartSample, int numTargetChannels, bool convertToFloat) { @@ -130,13 +130,16 @@ static void readChannels (AudioFormatReader& reader, int** chans, AudioBuffer (buffer->getWritePointer (j, startSample)); chans[numTargetChannels] = nullptr; - reader.read (chans, numTargetChannels, readerStartSample, numSamples, true); + + const bool success = reader.read (chans, numTargetChannels, readerStartSample, numSamples, true); if (convertToFloat) convertFixedToFloat (chans, numTargetChannels, numSamples); + + return success; } -void AudioFormatReader::read (AudioBuffer* buffer, +bool AudioFormatReader::read (AudioBuffer* buffer, int startSample, int numSamples, int64 readerStartSample, @@ -146,58 +149,61 @@ void AudioFormatReader::read (AudioBuffer* buffer, jassert (buffer != nullptr); jassert (startSample >= 0 && startSample + numSamples <= buffer->getNumSamples()); - if (numSamples > 0) - { - auto numTargetChannels = buffer->getNumChannels(); - - if (numTargetChannels <= 2) - { - int* dests[2] = { reinterpret_cast (buffer->getWritePointer (0, startSample)), - reinterpret_cast (numTargetChannels > 1 ? buffer->getWritePointer (1, startSample) : nullptr) }; - int* chans[3] = {}; - - if (useReaderLeftChan == useReaderRightChan) - { - chans[0] = dests[0]; + if (numSamples <= 0) + return true; - if (numChannels > 1) - chans[1] = dests[1]; - } - else if (useReaderLeftChan || (numChannels == 1)) - { - chans[0] = dests[0]; - } - else if (useReaderRightChan) - { - chans[1] = dests[0]; - } + auto numTargetChannels = buffer->getNumChannels(); - read (chans, 2, readerStartSample, numSamples, true); + if (numTargetChannels <= 2) + { + int* dests[2] = { reinterpret_cast (buffer->getWritePointer (0, startSample)), + reinterpret_cast (numTargetChannels > 1 ? buffer->getWritePointer (1, startSample) : nullptr) }; + int* chans[3] = {}; - // if the target's stereo and the source is mono, dupe the first channel.. - if (numTargetChannels > 1 - && (chans[0] == nullptr || chans[1] == nullptr) - && (dests[0] != nullptr && dests[1] != nullptr)) - { - memcpy (dests[1], dests[0], (size_t) numSamples * sizeof (float)); - } + if (useReaderLeftChan == useReaderRightChan) + { + chans[0] = dests[0]; - if (! usesFloatingPointData) - convertFixedToFloat (dests, 2, numSamples); + if (numChannels > 1) + chans[1] = dests[1]; } - else if (numTargetChannels <= 64) + else if (useReaderLeftChan || (numChannels == 1)) { - int* chans[65]; - readChannels (*this, chans, buffer, startSample, numSamples, - readerStartSample, numTargetChannels, ! usesFloatingPointData); + chans[0] = dests[0]; } - else + else if (useReaderRightChan) + { + chans[1] = dests[0]; + } + + if (! read (chans, 2, readerStartSample, numSamples, true)) + return false; + + // if the target's stereo and the source is mono, dupe the first channel.. + if (numTargetChannels > 1 + && (chans[0] == nullptr || chans[1] == nullptr) + && (dests[0] != nullptr && dests[1] != nullptr)) { - HeapBlock chans (numTargetChannels + 1); - readChannels (*this, chans, buffer, startSample, numSamples, - readerStartSample, numTargetChannels, ! usesFloatingPointData); + memcpy (dests[1], dests[0], (size_t) numSamples * sizeof (float)); } + + if (! usesFloatingPointData) + convertFixedToFloat (dests, 2, numSamples); + + return true; } + + if (numTargetChannels <= 64) + { + int* chans[65]; + return readChannels (*this, chans, buffer, startSample, numSamples, + readerStartSample, numTargetChannels, ! usesFloatingPointData); + } + + HeapBlock chans (numTargetChannels + 1); + + return readChannels (*this, chans, buffer, startSample, numSamples, + readerStartSample, numTargetChannels, ! usesFloatingPointData); } void AudioFormatReader::readMaxLevels (int64 startSampleInFile, int64 numSamples, diff --git a/modules/juce_audio_formats/format/juce_AudioFormatReader.h b/modules/juce_audio_formats/format/juce_AudioFormatReader.h index 970d1ae1..eff78691 100644 --- a/modules/juce_audio_formats/format/juce_AudioFormatReader.h +++ b/modules/juce_audio_formats/format/juce_AudioFormatReader.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -139,8 +139,12 @@ public: the buffer's floating-point format, and will try to intelligently cope with mismatches between the number of channels in the reader and the buffer. + + @returns true if the operation succeeded, false if there was an error. Note + that reading sections of data beyond the extent of the stream isn't an + error - the reader should just return zeros for these regions */ - void read (AudioBuffer* buffer, + bool read (AudioBuffer* buffer, int startSampleInDestBuffer, int numSamples, int64 readerStartSample, diff --git a/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp b/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp index 6ee9ce37..7c47f86a 100644 --- a/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp +++ b/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h b/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h index caa6c26b..8b5ffb9b 100644 --- a/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h +++ b/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp b/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp index d74c7986..dfdba2e9 100644 --- a/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp +++ b/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/format/juce_AudioFormatWriter.h b/modules/juce_audio_formats/format/juce_AudioFormatWriter.h index 367c6d64..e5381918 100644 --- a/modules/juce_audio_formats/format/juce_AudioFormatWriter.h +++ b/modules/juce_audio_formats/format/juce_AudioFormatWriter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp b/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp index 5f9eef1d..8c16177e 100644 --- a/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp +++ b/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h b/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h index 5e5f3d71..52d4ba6e 100644 --- a/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h +++ b/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp index 90478299..d59b279a 100644 --- a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp +++ b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -63,6 +63,8 @@ bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels, const ScopedLock sl (lock); nextReadPosition = startSampleInFile; + bool allSamplesRead = true; + while (numSamples > 0) { if (auto block = getBlockContaining (startSampleInFile)) @@ -86,6 +88,8 @@ bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels, startOffsetInDestBuffer += numToDo; startSampleInFile += numToDo; numSamples -= numToDo; + + allSamplesRead = allSamplesRead && block->allSamplesRead; } else { @@ -95,6 +99,7 @@ bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels, if (auto* dest = (float*) destSamples[j]) FloatVectorOperations::clear (dest + startOffsetInDestBuffer, numSamples); + allSamplesRead = false; break; } else @@ -105,14 +110,14 @@ bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels, } } - return true; + return allSamplesRead; } BufferingAudioReader::BufferedBlock::BufferedBlock (AudioFormatReader& reader, int64 pos, int numSamples) : range (pos, pos + numSamples), - buffer ((int) reader.numChannels, numSamples) + buffer ((int) reader.numChannels, numSamples), + allSamplesRead (reader.read (&buffer, 0, numSamples, pos, true, true)) { - reader.read (&buffer, 0, numSamples, pos, true, true); } BufferingAudioReader::BufferedBlock* BufferingAudioReader::getBlockContaining (int64 pos) const noexcept diff --git a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h index 2b2758da..8414c18a 100644 --- a/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h +++ b/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -73,6 +73,7 @@ private: Range range; AudioBuffer buffer; + bool allSamplesRead = false; }; int useTimeSlice() override; diff --git a/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h b/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h index 45d9d324..2476657e 100644 --- a/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h +++ b/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/juce_audio_formats.cpp b/modules/juce_audio_formats/juce_audio_formats.cpp index edba99dc..90a243ef 100644 --- a/modules/juce_audio_formats/juce_audio_formats.cpp +++ b/modules/juce_audio_formats/juce_audio_formats.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -68,6 +68,11 @@ #include "codecs/juce_WavAudioFormat.cpp" #include "codecs/juce_LAMEEncoderAudioFormat.cpp" +#if JucePlugin_Enable_ARA + #include "juce_audio_processors/utilities/ARA/juce_ARADocumentControllerCommon.cpp" + #include "format/juce_ARAAudioReaders.cpp" +#endif + #if JUCE_WINDOWS && JUCE_USE_WINDOWS_MEDIA_FORMAT #include "codecs/juce_WindowsMediaAudioFormat.cpp" #endif diff --git a/modules/juce_audio_formats/juce_audio_formats.h b/modules/juce_audio_formats/juce_audio_formats.h index 461d3cf0..8a7a0f36 100644 --- a/modules/juce_audio_formats/juce_audio_formats.h +++ b/modules/juce_audio_formats/juce_audio_formats.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,7 +35,7 @@ ID: juce_audio_formats vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE audio file format codecs description: Classes for reading and writing various audio file formats. website: http://www.juce.com/juce @@ -128,3 +128,9 @@ #include "codecs/juce_WavAudioFormat.h" #include "codecs/juce_WindowsMediaAudioFormat.h" #include "sampler/juce_Sampler.h" + +#if JucePlugin_Enable_ARA + #include + + #include "format/juce_ARAAudioReaders.h" +#endif diff --git a/modules/juce_audio_formats/juce_audio_formats.mm b/modules/juce_audio_formats/juce_audio_formats.mm index c24c5a59..4bee5877 100644 --- a/modules/juce_audio_formats/juce_audio_formats.mm +++ b/modules/juce_audio_formats/juce_audio_formats.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/sampler/juce_Sampler.cpp b/modules/juce_audio_formats/sampler/juce_Sampler.cpp index 77a0edb0..ab9c2d2f 100644 --- a/modules/juce_audio_formats/sampler/juce_Sampler.cpp +++ b/modules/juce_audio_formats/sampler/juce_Sampler.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_formats/sampler/juce_Sampler.h b/modules/juce_audio_formats/sampler/juce_Sampler.h index 111150a2..57c987bc 100644 --- a/modules/juce_audio_formats/sampler/juce_Sampler.h +++ b/modules/juce_audio_formats/sampler/juce_Sampler.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h b/modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h index 0f1d7ca1..eff58e97 100644 --- a/modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h +++ b/modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp index 67f29bee..9abcb113 100644 --- a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -1035,52 +1035,72 @@ namespace AAXClasses AudioProcessor& getPluginInstance() const noexcept { return *pluginInstance; } - bool getCurrentPosition (juce::AudioPlayHead::CurrentPositionInfo& info) override + Optional getPosition() const override { + PositionInfo info; + const AAX_ITransport& transport = *Transport(); - info.bpm = 0.0; - check (transport.GetCurrentTempo (&info.bpm)); + info.setBpm ([&] + { + double bpm = 0.0; + + return transport.GetCurrentTempo (&bpm) == AAX_SUCCESS ? makeOptional (bpm) : nullopt; + }()); + + info.setTimeSignature ([&] + { + int32_t num = 4, den = 4; - int32_t num = 4, den = 4; - transport.GetCurrentMeter (&num, &den); - info.timeSigNumerator = (int) num; - info.timeSigDenominator = (int) den; - info.timeInSamples = 0; + return transport.GetCurrentMeter (&num, &den) == AAX_SUCCESS + ? makeOptional (TimeSignature { (int) num, (int) den }) + : nullopt; + }()); - if (transport.IsTransportPlaying (&info.isPlaying) != AAX_SUCCESS) - info.isPlaying = false; + info.setIsPlaying ([&] + { + bool isPlaying = false; - if (info.isPlaying - || transport.GetTimelineSelectionStartPosition (&info.timeInSamples) != AAX_SUCCESS) - check (transport.GetCurrentNativeSampleLocation (&info.timeInSamples)); + return transport.IsTransportPlaying (&isPlaying) == AAX_SUCCESS && isPlaying; + }()); - info.timeInSeconds = (float) info.timeInSamples / sampleRate; + info.setTimeInSamples ([&] + { + int64_t timeInSamples = 0; - int64_t ticks = 0; + return ((! info.getIsPlaying() && transport.GetTimelineSelectionStartPosition (&timeInSamples) == AAX_SUCCESS) + || transport.GetCurrentNativeSampleLocation (&timeInSamples) == AAX_SUCCESS) + ? makeOptional (timeInSamples) + : nullopt; + }()); - if (info.isPlaying) - check (transport.GetCustomTickPosition (&ticks, info.timeInSamples)); - else - check (transport.GetCurrentTickPosition (&ticks)); + info.setTimeInSeconds ((float) info.getTimeInSamples().orFallback (0) / sampleRate); - info.ppqPosition = (double) ticks / 960000.0; + info.setPpqPosition ([&] + { + int64_t ticks = 0; + + return ((info.getIsPlaying() && transport.GetCustomTickPosition (&ticks, info.getTimeInSamples().orFallback (0))) == AAX_SUCCESS) + || transport.GetCurrentTickPosition (&ticks) == AAX_SUCCESS + ? makeOptional (ticks / 960000.0) + : nullopt; + }()); - info.isLooping = false; + bool isLooping = false; int64_t loopStartTick = 0, loopEndTick = 0; - check (transport.GetCurrentLoopPosition (&info.isLooping, &loopStartTick, &loopEndTick)); - info.ppqLoopStart = (double) loopStartTick / 960000.0; - info.ppqLoopEnd = (double) loopEndTick / 960000.0; - std::tie (info.frameRate, info.editOriginTime) = [&transport] + if (transport.GetCurrentLoopPosition (&isLooping, &loopStartTick, &loopEndTick) == AAX_SUCCESS) { - AAX_EFrameRate frameRate; - int32_t offset; + info.setIsLooping (isLooping); + info.setLoopPoints (LoopPoints { (double) loopStartTick / 960000.0, (double) loopEndTick / 960000.0 }); + } - if (transport.GetTimeCodeInfo (&frameRate, &offset) != AAX_SUCCESS) - return std::make_tuple (FrameRate(), 0.0); + AAX_EFrameRate frameRate; + int32_t offset; - const auto rate = [&] + if (transport.GetTimeCodeInfo (&frameRate, &offset) == AAX_SUCCESS) + { + info.setFrameRate ([&]() -> Optional { switch ((JUCE_AAX_EFrameRate) frameRate) { @@ -1114,18 +1134,14 @@ namespace AAXClasses case JUCE_AAX_eFrameRate_Undeclared: break; } - return FrameRate(); - }(); - - const auto effectiveRate = rate.getEffectiveRate(); - return std::make_tuple (rate, effectiveRate != 0.0 ? offset / effectiveRate : 0.0); - }(); + return {}; + }()); + } - // No way to get these: (?) - info.isRecording = false; - info.ppqPositionOfLastBarStart = 0; + const auto effectiveRate = info.getFrameRate().hasValue() ? info.getFrameRate()->getEffectiveRate() : 0.0; + info.setEditOriginTime (effectiveRate != 0.0 ? makeOptional (offset / effectiveRate) : nullopt); - return true; + return info; } void audioProcessorParameterChanged (AudioProcessor* /*processor*/, int parameterIndex, float newValue) override @@ -1191,8 +1207,7 @@ namespace AAXClasses if (data != nullptr && size == sizeof (AAX_EProcessingState)) { const auto state = *static_cast (data); - const auto nonRealtime = state == AAX_eProcessingState_Start - || state == AAX_eProcessingState_StartPass + const auto nonRealtime = state == AAX_eProcessingState_StartPass || state == AAX_eProcessingState_BeginPassGroup; pluginInstance->setNonRealtime (nonRealtime); } @@ -1601,7 +1616,7 @@ namespace AAXClasses if (bypassParameter == nullptr) { - ownedBypassParameter.reset (new AudioParameterBool (cDefaultMasterBypassID, "Master Bypass", false, {}, {}, {})); + ownedBypassParameter.reset (new AudioParameterBool (cDefaultMasterBypassID, "Master Bypass", false)); bypassParameter = ownedBypassParameter.get(); } diff --git a/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.cpp b/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.cpp new file mode 100644 index 00000000..f9aaafe5 --- /dev/null +++ b/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.cpp @@ -0,0 +1,68 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include +#include "../utility/juce_CheckSettingMacros.h" + +#if JucePlugin_Enable_ARA + +#include "../utility/juce_IncludeSystemHeaders.h" +#include "../utility/juce_IncludeModuleHeaders.h" + +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunused-parameter", "-Wgnu-zero-variadic-macro-arguments", "-Wmissing-prototypes") +JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4100) + +#include +#include +#include + +JUCE_END_IGNORE_WARNINGS_MSVC +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + +namespace juce +{ + +#if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS +JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept +{ + #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) + DBG (diagnosis); + #endif + + logAssertion (file, line); + + #if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) + if (juce_isRunningUnderDebugger()) + JUCE_BREAK_IN_DEBUGGER; + JUCE_ANALYZER_NORETURN + #endif +} +#endif + +ARA_SETUP_DEBUG_MESSAGE_PREFIX(JucePlugin_Name); + +} // namespace juce + +#endif diff --git a/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.h b/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.h new file mode 100644 index 00000000..766c39c6 --- /dev/null +++ b/modules/juce_audio_plugin_client/ARA/juce_ARA_Wrapper.h @@ -0,0 +1,55 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#pragma once + +#if JucePlugin_Enable_ARA +// Configure ARA debug support prior to including ARA SDK headers +namespace juce +{ + +#if (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS + +#define ARA_ENABLE_INTERNAL_ASSERTS 1 + +extern JUCE_API void JUCE_CALLTYPE handleARAAssertion (const char* file, const int line, const char* diagnosis) noexcept; + +#if !defined(ARA_HANDLE_ASSERT) +#define ARA_HANDLE_ASSERT(file, line, diagnosis) juce::handleARAAssertion (file, line, diagnosis) +#endif + +#if JUCE_LOG_ASSERTIONS +#define ARA_ENABLE_DEBUG_OUTPUT 1 +#endif + +#else + +#define ARA_ENABLE_INTERNAL_ASSERTS 0 + +#endif // (JUCE_DEBUG && ! JUCE_DISABLE_ASSERTIONS) || JUCE_LOG_ASSERTIONS + +} // namespace juce + +#endif diff --git a/modules/juce_audio_plugin_client/CMakeLists.txt b/modules/juce_audio_plugin_client/CMakeLists.txt new file mode 100644 index 00000000..116346c6 --- /dev/null +++ b/modules/juce_audio_plugin_client/CMakeLists.txt @@ -0,0 +1,29 @@ +# ============================================================================== +# +# This file is part of the JUCE library. +# Copyright (c) 2022 - Raw Material Software Limited +# +# JUCE is an open source library subject to commercial or open-source +# licensing. +# +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. +# +# End User License Agreement: www.juce.com/juce-7-licence +# Privacy Policy: www.juce.com/juce-privacy-policy +# +# Or: You may also use this code under the terms of the GPL v3 (see +# www.gnu.org/licenses). +# +# JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER +# EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE +# DISCLAIMED. +# +# ============================================================================== + +add_executable(juce_lv2_helper LV2/juce_LV2TurtleDumpProgram.cpp) +add_executable(juce::juce_lv2_helper ALIAS juce_lv2_helper) +target_compile_features(juce_lv2_helper PRIVATE cxx_std_14) +set_target_properties(juce_lv2_helper PROPERTIES BUILD_WITH_INSTALL_RPATH ON) +target_link_libraries(juce_lv2_helper PRIVATE ${CMAKE_DL_LIBS}) +install(TARGETS juce_lv2_helper EXPORT LV2_HELPER DESTINATION "bin/JUCE-${JUCE_VERSION}") diff --git a/modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp b/modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp new file mode 100644 index 00000000..0e4723d2 --- /dev/null +++ b/modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp @@ -0,0 +1,78 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#ifdef _WIN32 + #include + HMODULE dlopen (const char* filename, int) { return LoadLibrary (filename); } + FARPROC dlsym (HMODULE handle, const char* name) { return GetProcAddress (handle, name); } + enum { RTLD_LAZY = 0 }; +#else + #include +#endif + +#include + +// Replicating some of the LV2 header here so that we don't have to set up any +// custom include paths for this file. +// Normally this would be a bad idea, but the LV2 API has to keep these definitions +// in order to remain backwards-compatible. + +extern "C" +{ + typedef struct LV2_Descriptor + { + const void* a; + const void* b; + const void* c; + const void* d; + const void* e; + const void* f; + const void* g; + const void* (*extension_data)(const char* uri); + } LV2_Descriptor; +} + +int main (int argc, const char** argv) +{ + if (argc != 2) + return 1; + + const auto* libraryPath = argv[1]; + + struct RecallFeature + { + int (*doRecall) (const char*); + }; + + if (auto* handle = dlopen (libraryPath, RTLD_LAZY)) + if (auto* getDescriptor = reinterpret_cast (dlsym (handle, "lv2_descriptor"))) + if (auto* descriptor = getDescriptor (0)) + if (auto* extensionData = descriptor->extension_data) + if (auto* recallFeature = reinterpret_cast (extensionData ("https://lv2-extensions.juce.com/turtle_recall"))) + if (auto* doRecall = recallFeature->doRecall) + return doRecall (libraryPath); + + return 1; +} diff --git a/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp b/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp new file mode 100644 index 00000000..dc2e6cc8 --- /dev/null +++ b/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp @@ -0,0 +1,1778 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#if JucePlugin_Build_LV2 + +#ifndef _SCL_SECURE_NO_WARNINGS + #define _SCL_SECURE_NO_WARNINGS +#endif + +#ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS +#endif + +#define JUCE_CORE_INCLUDE_NATIVE_HEADERS 1 +#define JUCE_CORE_INCLUDE_OBJC_HELPERS 1 +#define JUCE_GUI_BASICS_INCLUDE_XHEADERS 1 + +#include +#include +#include + +#include +#include + +#include "JuceLV2Defines.h" +#include + +#include + +#define JUCE_TURTLE_RECALL_URI "https://lv2-extensions.juce.com/turtle_recall" + +#ifndef JucePlugin_LV2URI + #error "You need to define the JucePlugin_LV2URI value! If you're using the Projucer/CMake, the definition will be written into JuceLV2Defines.h automatically." +#endif + +namespace juce +{ +namespace lv2_client +{ + +constexpr auto uriSeparator = ":"; +const auto JucePluginLV2UriUi = String (JucePlugin_LV2URI) + uriSeparator + "UI"; +const auto JucePluginLV2UriState = String (JucePlugin_LV2URI) + uriSeparator + "StateString"; +const auto JucePluginLV2UriProgram = String (JucePlugin_LV2URI) + uriSeparator + "Program"; + +static const LV2_Feature* findMatchingFeature (const LV2_Feature* const* features, const char* uri) +{ + for (auto feature = features; *feature != nullptr; ++feature) + if (std::strcmp ((*feature)->URI, uri) == 0) + return *feature; + + return nullptr; +} + +static bool hasFeature (const LV2_Feature* const* features, const char* uri) +{ + return findMatchingFeature (features, uri) != nullptr; +} + +template +Data findMatchingFeatureData (const LV2_Feature* const* features, const char* uri) +{ + if (const auto* feature = findMatchingFeature (features, uri)) + return static_cast (feature->data); + + return {}; +} + +static const LV2_Options_Option* findMatchingOption (const LV2_Options_Option* options, LV2_URID urid) +{ + for (auto option = options; option->value != nullptr; ++option) + if (option->key == urid) + return option; + + return nullptr; +} + +class ParameterStorage : private AudioProcessorListener +{ +public: + ParameterStorage (AudioProcessor& proc, LV2_URID_Map map) + : processor (proc), + mapFeature (map), + legacyParameters (proc, false) + { + processor.addListener (this); + } + + ~ParameterStorage() override + { + processor.removeListener (this); + } + + /* This is the string that will be used to uniquely identify the parameter. + + This string will be written into the plugin's manifest as an IRI, so it must be + syntactically valid. + + We escape this string rather than writing the user-defined parameter ID directly to avoid + writing a malformed manifest in the case that user IDs contain spaces or other reserved + characters. This should allow users to keep the same param IDs for all plugin formats. + */ + static String getIri (const AudioProcessorParameter& param) + { + return URL::addEscapeChars (LegacyAudioParameter::getParamID (¶m, false), true); + } + + void setValueFromHost (LV2_URID urid, float value) noexcept + { + const auto it = uridToIndexMap.find (urid); + + if (it == uridToIndexMap.end()) + { + // No such parameter. + jassertfalse; + return; + } + + if (auto* param = legacyParameters.getParamForIndex ((int) it->second)) + { + const auto scaledValue = [&] + { + if (auto* rangedParam = dynamic_cast (param)) + return rangedParam->convertTo0to1 (value); + + return value; + }(); + + if (scaledValue != param->getValue()) + { + ScopedValueSetter scope (ignoreCallbacks, true); + param->setValueNotifyingHost (scaledValue); + } + } + } + + struct Options + { + bool parameterValue, gestureBegin, gestureEnd; + }; + + static constexpr auto newClientValue = 1 << 0, + gestureBegan = 1 << 1, + gestureEnded = 1 << 2; + + template + void forEachChangedParameter (Callback&& callback) + { + stateCache.ifSet ([this, &callback] (size_t parameterIndex, float, uint32_t bits) + { + const Options options { (bits & newClientValue) != 0, + (bits & gestureBegan) != 0, + (bits & gestureEnded) != 0 }; + + callback (*legacyParameters.getParamForIndex ((int) parameterIndex), + indexToUridMap[parameterIndex], + options); + }); + } + +private: + void audioProcessorParameterChanged (AudioProcessor*, int parameterIndex, float value) override + { + if (! ignoreCallbacks) + stateCache.setValueAndBits ((size_t) parameterIndex, value, newClientValue); + } + + void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int parameterIndex) override + { + if (! ignoreCallbacks) + stateCache.setBits ((size_t) parameterIndex, gestureBegan); + } + + void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int parameterIndex) override + { + if (! ignoreCallbacks) + stateCache.setBits ((size_t) parameterIndex, gestureEnded); + } + + void audioProcessorChanged (AudioProcessor*, const ChangeDetails&) override {} + + AudioProcessor& processor; + const LV2_URID_Map mapFeature; + const LegacyAudioParametersWrapper legacyParameters; + const std::vector indexToUridMap = [&] + { + std::vector result; + + for (auto* param : legacyParameters) + { + jassert ((size_t) param->getParameterIndex() == result.size()); + + const auto uri = JucePlugin_LV2URI + String (uriSeparator) + getIri (*param); + const auto urid = mapFeature.map (mapFeature.handle, uri.toRawUTF8()); + result.push_back (urid); + } + + return result; + }(); + const std::map uridToIndexMap = [&] + { + std::map result; + size_t index = 0; + + for (const auto& urid : indexToUridMap) + result.emplace (urid, index++); + + return result; + }(); + FlaggedFloatCache<3> stateCache { (size_t) legacyParameters.getNumParameters() }; + bool ignoreCallbacks = false; + + JUCE_LEAK_DETECTOR (ParameterStorage) +}; + +enum class PortKind { seqInput, seqOutput, latencyOutput, freeWheelingInput, enabledInput }; + +struct PortIndices +{ + PortIndices (int numInputsIn, int numOutputsIn) + : numInputs (numInputsIn), numOutputs (numOutputsIn) {} + + int getPortIndexForAudioInput (int audioIndex) const noexcept + { + return audioIndex; + } + + int getPortIndexForAudioOutput (int audioIndex) const noexcept + { + return audioIndex + numInputs; + } + + int getPortIndexFor (PortKind p) const noexcept { return getMaxAudioPortIndex() + (int) p; } + + // Audio ports are numbered from 0 to numInputs + numOutputs + int getMaxAudioPortIndex() const noexcept { return numInputs + numOutputs; } + + int numInputs, numOutputs; +}; + +//============================================================================== +class PlayHead : public AudioPlayHead +{ +public: + PlayHead (LV2_URID_Map mapFeatureIn, double sampleRateIn) + : parser (mapFeatureIn), sampleRate (sampleRateIn) + { + } + + void invalidate() { info = nullopt; } + + void readNewInfo (const LV2_Atom_Event* event) + { + if (event->body.type != mLV2_ATOM__Object && event->body.type != mLV2_ATOM__Blank) + return; + + const auto* object = reinterpret_cast (&event->body); + + if (object->body.otype != mLV2_TIME__Position) + return; + + const LV2_Atom* atomFrame = nullptr; + const LV2_Atom* atomSpeed = nullptr; + const LV2_Atom* atomBar = nullptr; + const LV2_Atom* atomBeat = nullptr; + const LV2_Atom* atomBeatUnit = nullptr; + const LV2_Atom* atomBeatsPerBar = nullptr; + const LV2_Atom* atomBeatsPerMinute = nullptr; + + LV2_Atom_Object_Query query[] { { mLV2_TIME__frame, &atomFrame }, + { mLV2_TIME__speed, &atomSpeed }, + { mLV2_TIME__bar, &atomBar }, + { mLV2_TIME__beat, &atomBeat }, + { mLV2_TIME__beatUnit, &atomBeatUnit }, + { mLV2_TIME__beatsPerBar, &atomBeatsPerBar }, + { mLV2_TIME__beatsPerMinute, &atomBeatsPerMinute }, + LV2_ATOM_OBJECT_QUERY_END }; + + lv2_atom_object_query (object, query); + + info.emplace(); + + // Carla always seems to give us an integral 'beat' even though I'd expect + // it to be a floating-point value + + const auto numerator = parser.parseNumericAtom (atomBeatsPerBar); + const auto denominator = parser.parseNumericAtom (atomBeatUnit); + + if (numerator.hasValue() && denominator.hasValue()) + info->setTimeSignature (TimeSignature { (int) *numerator, (int) *denominator }); + + info->setBpm (parser.parseNumericAtom (atomBeatsPerMinute)); + info->setPpqPosition (parser.parseNumericAtom (atomBeat)); + info->setIsPlaying (parser.parseNumericAtom (atomSpeed).orFallback (0.0f) != 0.0f); + info->setBarCount (parser.parseNumericAtom (atomBar)); + + if (const auto parsed = parser.parseNumericAtom (atomFrame)) + { + info->setTimeInSamples (*parsed); + info->setTimeInSeconds ((double) *parsed / sampleRate); + } + } + + Optional getPosition() const override + { + return info; + } + +private: + lv2_shared::NumericAtomParser parser; + Optional info; + double sampleRate; + + #define X(str) const LV2_URID m##str = parser.map (str); + X (LV2_ATOM__Blank) + X (LV2_ATOM__Object) + X (LV2_TIME__Position) + X (LV2_TIME__beat) + X (LV2_TIME__beatUnit) + X (LV2_TIME__beatsPerBar) + X (LV2_TIME__beatsPerMinute) + X (LV2_TIME__frame) + X (LV2_TIME__speed) + X (LV2_TIME__bar) + #undef X + + JUCE_LEAK_DETECTOR (PlayHead) +}; + +//============================================================================== +class Ports +{ +public: + Ports (LV2_URID_Map map, int numInputsIn, int numOutputsIn) + : forge (map), + indices (numInputsIn, numOutputsIn), + mLV2_ATOM__Sequence (map.map (map.handle, LV2_ATOM__Sequence)) + { + audioBuffers.resize (static_cast (numInputsIn + numOutputsIn), nullptr); + } + + void connect (int port, void* data) + { + // The following is not UB _if_ data really points to an object with the expected type. + + if (port == indices.getPortIndexFor (PortKind::seqInput)) + { + inputData = static_cast (data); + } + else if (port == indices.getPortIndexFor (PortKind::seqOutput)) + { + outputData = static_cast (data); + } + else if (port == indices.getPortIndexFor (PortKind::latencyOutput)) + { + latency = static_cast (data); + } + else if (port == indices.getPortIndexFor (PortKind::freeWheelingInput)) + { + freeWheeling = static_cast (data); + } + else if (port == indices.getPortIndexFor (PortKind::enabledInput)) + { + enabled = static_cast (data); + } + else if (isPositiveAndBelow (port, indices.getMaxAudioPortIndex())) + { + audioBuffers[(size_t) port] = static_cast (data); + } + else + { + // This port was not declared! + jassertfalse; + } + } + + template + void forEachInputEvent (Callback&& callback) + { + if (inputData != nullptr && inputData->atom.type == mLV2_ATOM__Sequence) + for (const auto* event : lv2_shared::SequenceIterator { lv2_shared::SequenceWithSize { inputData } }) + callback (event); + } + + void prepareToWrite() + { + // Note: Carla seems to have a bug (verified with the eg-fifths plugin) where + // the output buffer size is incorrect on alternate calls. + forge.setBuffer (reinterpret_cast (outputData), outputData->atom.size); + } + + void writeLatency (int value) + { + if (latency != nullptr) + *latency = (float) value; + } + + const float* getBufferForAudioInput (int index) const noexcept + { + return audioBuffers[(size_t) indices.getPortIndexForAudioInput (index)]; + } + + float* getBufferForAudioOutput (int index) const noexcept + { + return audioBuffers[(size_t) indices.getPortIndexForAudioOutput (index)]; + } + + bool isFreeWheeling() const noexcept + { + if (freeWheeling != nullptr) + return *freeWheeling > 0.5f; + + return false; + } + + bool isEnabled() const noexcept + { + if (enabled != nullptr) + return *enabled > 0.5f; + + return true; + } + + lv2_shared::AtomForge forge; + PortIndices indices; + +private: + static constexpr auto numParamPorts = 3; + const LV2_Atom_Sequence* inputData = nullptr; + LV2_Atom_Sequence* outputData = nullptr; + float* latency = nullptr; + float* freeWheeling = nullptr; + float* enabled = nullptr; + std::vector audioBuffers; + const LV2_URID mLV2_ATOM__Sequence; + + JUCE_LEAK_DETECTOR (Ports) +}; + +class LV2PluginInstance : private AudioProcessorListener +{ +public: + LV2PluginInstance (double sampleRate, + int64_t maxBlockSize, + const char*, + LV2_URID_Map mapFeatureIn) + : mapFeature (mapFeatureIn), + playHead (mapFeature, sampleRate) + { + processor->addListener (this); + processor->setPlayHead (&playHead); + prepare (sampleRate, (int) maxBlockSize); + } + + void connect (uint32_t port, void* data) + { + ports.connect ((int) port, data); + } + + void activate() {} + + template + static void iterateAudioBuffer (AudioBuffer& ab, UnaryFunction fn) + { + float** sampleData = ab.getArrayOfWritePointers(); + + for (int c = ab.getNumChannels(); --c >= 0;) + for (int s = ab.getNumSamples(); --s >= 0;) + fn (sampleData[c][s]); + } + + static int countNaNs (AudioBuffer& ab) noexcept + { + int count = 0; + iterateAudioBuffer (ab, [&count] (float s) + { + if (std::isnan (s)) + ++count; + }); + + return count; + } + + void run (uint32_t numSteps) + { + midi.clear(); + playHead.invalidate(); + + ports.forEachInputEvent ([&] (const LV2_Atom_Event* event) + { + struct Callback + { + explicit Callback (LV2PluginInstance& s) : self (s) {} + + void setParameter (LV2_URID property, float value) const noexcept + { + self.parameters.setValueFromHost (property, value); + } + + // The host probably shouldn't send us 'touched' messages. + void gesture (LV2_URID, bool) const noexcept {} + + LV2PluginInstance& self; + }; + + patchSetHelper.processPatchSet (event, Callback { *this }); + + playHead.readNewInfo (event); + + if (event->body.type == mLV2_MIDI__MidiEvent) + midi.addEvent (event + 1, static_cast (event->body.size), static_cast (event->time.frames)); + }); + + processor->setNonRealtime (ports.isFreeWheeling()); + + for (auto i = 0, end = processor->getTotalNumInputChannels(); i < end; ++i) + audio.copyFrom (i, 0, ports.getBufferForAudioInput (i), (int) numSteps); + + jassert (countNaNs (audio) == 0); + + { + const ScopedLock lock { processor->getCallbackLock() }; + + if (processor->isSuspended()) + { + for (auto i = 0, end = processor->getTotalNumOutputChannels(); i < end; ++i) + { + const auto ptr = ports.getBufferForAudioOutput (i); + std::fill (ptr, ptr + numSteps, 0.0f); + } + } + else + { + const auto isEnabled = ports.isEnabled(); + + if (auto* param = processor->getBypassParameter()) + { + param->setValueNotifyingHost (isEnabled ? 0.0f : 1.0f); + processor->processBlock (audio, midi); + } + else if (isEnabled) + { + processor->processBlock (audio, midi); + } + else + { + processor->processBlockBypassed (audio, midi); + } + } + } + + for (auto i = 0, end = processor->getTotalNumOutputChannels(); i < end; ++i) + { + const auto src = audio.getReadPointer (i); + const auto dst = ports.getBufferForAudioOutput (i); + + if (dst != nullptr) + std::copy (src, src + numSteps, dst); + } + + ports.prepareToWrite(); + auto* forge = ports.forge.get(); + lv2_shared::SequenceFrame sequence { forge, (uint32_t) 0 }; + + parameters.forEachChangedParameter ([&] (const AudioProcessorParameter& param, + LV2_URID paramUrid, + const ParameterStorage::Options& options) + { + const auto sendTouched = [&] (bool state) + { + // TODO Implement begin/end change gesture support once it's supported by LV2 + ignoreUnused (state); + }; + + if (options.gestureBegin) + sendTouched (true); + + if (options.parameterValue) + { + lv2_atom_forge_frame_time (forge, 0); + + lv2_shared::ObjectFrame object { forge, (uint32_t) 0, patchSetHelper.mLV2_PATCH__Set }; + + lv2_atom_forge_key (forge, patchSetHelper.mLV2_PATCH__property); + lv2_atom_forge_urid (forge, paramUrid); + + lv2_atom_forge_key (forge, patchSetHelper.mLV2_PATCH__value); + lv2_atom_forge_float (forge, [&] + { + if (auto* rangedParam = dynamic_cast (¶m)) + return rangedParam->convertFrom0to1 (rangedParam->getValue()); + + return param.getValue(); + }()); + } + + if (options.gestureEnd) + sendTouched (false); + }); + + if (shouldSendStateChange.exchange (false)) + { + lv2_atom_forge_frame_time (forge, 0); + lv2_shared::ObjectFrame { forge, (uint32_t) 0, mLV2_STATE__StateChanged }; + } + + for (const auto meta : midi) + { + const auto bytes = static_cast (meta.numBytes); + lv2_atom_forge_frame_time (forge, meta.samplePosition); + lv2_atom_forge_atom (forge, bytes, mLV2_MIDI__MidiEvent); + lv2_atom_forge_write (forge, meta.data, bytes); + } + + ports.writeLatency (processor->getLatencySamples()); + } + + void deactivate() {} + + LV2_State_Status store (LV2_State_Store_Function storeFn, + LV2_State_Handle handle, + uint32_t, + const LV2_Feature* const*) + { + MemoryBlock block; + processor->getStateInformation (block); + const auto text = block.toBase64Encoding(); + storeFn (handle, + mJucePluginLV2UriState, + text.toRawUTF8(), + text.getNumBytesAsUTF8() + 1, + mLV2_ATOM__String, + LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE); + + return LV2_STATE_SUCCESS; + } + + LV2_State_Status retrieve (LV2_State_Retrieve_Function retrieveFn, + LV2_State_Handle handle, + uint32_t, + const LV2_Feature* const*) + { + size_t size = 0; + uint32_t type = 0; + uint32_t dataFlags = 0; + + // Try retrieving a port index (if this is a 'program' preset). + const auto* programData = retrieveFn (handle, mJucePluginLV2UriProgram, &size, &type, &dataFlags); + + if (programData != nullptr && type == mLV2_ATOM__Int && size == sizeof (int32_t)) + { + const auto programIndex = readUnaligned (programData); + processor->setCurrentProgram (programIndex); + return LV2_STATE_SUCCESS; + } + + // This doesn't seem to be a 'program' preset, try setting the full state from a string instead. + const auto* data = retrieveFn (handle, mJucePluginLV2UriState, &size, &type, &dataFlags); + + if (data == nullptr) + return LV2_STATE_ERR_NO_PROPERTY; + + if (type != mLV2_ATOM__String) + return LV2_STATE_ERR_BAD_TYPE; + + String text (static_cast (data), (size_t) size); + MemoryBlock block; + block.fromBase64Encoding (text); + processor->setStateInformation (block.getData(), (int) block.getSize()); + + return LV2_STATE_SUCCESS; + } + + std::unique_ptr createEditor() + { + return std::unique_ptr (processor->createEditorIfNeeded()); + } + + void editorBeingDeleted (AudioProcessorEditor* editor) + { + processor->editorBeingDeleted (editor); + } + + static std::unique_ptr createProcessorInstance() + { + std::unique_ptr result { createPluginFilterOfType (AudioProcessor::wrapperType_LV2) }; + + #if defined (JucePlugin_PreferredChannelConfigurations) + constexpr short channelConfigurations[][2] { JucePlugin_PreferredChannelConfigurations }; + + static_assert (numElementsInArray (channelConfigurations) > 0, + "JucePlugin_PreferredChannelConfigurations must contain at least one entry"); + static_assert (channelConfigurations[0][0] > 0 || channelConfigurations[0][1] > 0, + "JucePlugin_PreferredChannelConfigurations must have at least one input or output channel"); + result->setPlayConfigDetails (channelConfigurations[0][0], channelConfigurations[0][1], 44100.0, 1024); + + const auto desiredChannels = std::make_tuple (channelConfigurations[0][0], channelConfigurations[0][1]); + const auto actualChannels = std::make_tuple (result->getTotalNumInputChannels(), result->getTotalNumOutputChannels()); + + if (desiredChannels != actualChannels) + Logger::outputDebugString ("Failed to apply requested channel configuration!"); + #else + result->enableAllBuses(); + #endif + + return result; + } + +private: + void audioProcessorParameterChanged (AudioProcessor*, int, float) override {} + + void audioProcessorChanged (AudioProcessor*, const ChangeDetails& details) override + { + // Only check for non-parameter state here because: + // - Latency is automatically written every block. + // - There's no way for an LV2 plugin to report an internal program change. + // - Parameter info is hard-coded in the plugin's turtle description. + if (details.nonParameterStateChanged) + shouldSendStateChange = true; + } + + void prepare (double sampleRate, int maxBlockSize) + { + jassert (processor != nullptr); + processor->setRateAndBufferSizeDetails (sampleRate, maxBlockSize); + processor->prepareToPlay (sampleRate, maxBlockSize); + + const auto numChannels = jmax (processor->getTotalNumInputChannels(), + processor->getTotalNumOutputChannels()); + + midi.ensureSize (8192); + audio.setSize (numChannels, maxBlockSize); + audio.clear(); + } + + LV2_URID map (StringRef uri) const { return mapFeature.map (mapFeature.handle, uri); } + + ScopedJuceInitialiser_GUI scopedJuceInitialiser; + + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer messageThread; + #endif + + std::unique_ptr processor = createProcessorInstance(); + const LV2_URID_Map mapFeature; + ParameterStorage parameters { *processor, mapFeature }; + Ports ports { mapFeature, + processor->getTotalNumInputChannels(), + processor->getTotalNumOutputChannels() }; + lv2_shared::PatchSetHelper patchSetHelper { mapFeature, JucePlugin_LV2URI }; + PlayHead playHead; + MidiBuffer midi; + AudioBuffer audio; + std::atomic shouldSendStateChange { false }; + + #define X(str) const LV2_URID m##str = map (str); + X (JucePluginLV2UriProgram) + X (JucePluginLV2UriState) + X (LV2_ATOM__Int) + X (LV2_ATOM__String) + X (LV2_BUF_SIZE__maxBlockLength) + X (LV2_BUF_SIZE__sequenceSize) + X (LV2_MIDI__MidiEvent) + X (LV2_PATCH__Set) + X (LV2_STATE__StateChanged) + #undef X + + JUCE_LEAK_DETECTOR (LV2PluginInstance) +}; + +//============================================================================== +struct RecallFeature +{ + int (*doRecall) (const char*) = [] (const char* libraryPath) -> int + { + const ScopedJuceInitialiser_GUI scope; + const auto processor = LV2PluginInstance::createProcessorInstance(); + const File absolutePath { CharPointer_UTF8 { libraryPath } }; + + processor->enableAllBuses(); + + for (auto* fn : { writeManifestTtl, writeDspTtl, writeUiTtl }) + { + const auto result = fn (*processor, absolutePath); + + if (result.wasOk()) + continue; + + std::cerr << result.getErrorMessage() << '\n'; + return 1; + } + + return 0; + }; + +private: + static String getPresetUri (int index) + { + return JucePlugin_LV2URI + String (uriSeparator) + "preset" + String (index + 1); + } + + static std::ofstream openStream (const File& libraryPath, StringRef name) + { + return std::ofstream { libraryPath.getSiblingFile (name + ".ttl").getFullPathName().toRawUTF8() }; + } + + static Result writeManifestTtl (AudioProcessor& proc, const File& libraryPath) + { + auto os = openStream (libraryPath, "manifest"); + + os << "@prefix lv2: .\n" + "@prefix rdfs: .\n" + "@prefix pset: .\n" + "@prefix state: .\n" + "@prefix ui: .\n" + "@prefix xsd: .\n" + "\n" + "<" JucePlugin_LV2URI ">\n" + "\ta lv2:Plugin ;\n" + "\tlv2:binary <" << URL::addEscapeChars (libraryPath.getFileName(), false) << "> ;\n" + "\trdfs:seeAlso .\n"; + + if (proc.hasEditor()) + { + #if JUCE_MAC + #define JUCE_LV2_UI_KIND "CocoaUI" + #elif JUCE_WINDOWS + #define JUCE_LV2_UI_KIND "WindowsUI" + #elif JUCE_LINUX + #define JUCE_LV2_UI_KIND "X11UI" + #else + #error "LV2 UI is unsupported on this platform" + #endif + + os << "\n" + "<" << JucePluginLV2UriUi << ">\n" + "\ta ui:" JUCE_LV2_UI_KIND " ;\n" + "\tlv2:binary <" << URL::addEscapeChars (libraryPath.getFileName(), false) << "> ;\n" + "\trdfs:seeAlso .\n" + "\n"; + } + + for (auto i = 0, end = proc.getNumPrograms(); i < end; ++i) + { + os << "<" << getPresetUri (i) << ">\n" + "\ta pset:Preset ;\n" + "\tlv2:appliesTo <" JucePlugin_LV2URI "> ;\n" + "\trdfs:label \"" << proc.getProgramName (i) << "\" ;\n" + "\tstate:state [ <" << JucePluginLV2UriProgram << "> \"" << i << "\"^^xsd:int ; ] .\n" + "\n"; + } + + return Result::ok(); + } + + static std::vector findAllSubgroupsDepthFirst (const AudioProcessorParameterGroup& group, + std::vector foundSoFar = {}) + { + foundSoFar.push_back (&group); + + for (auto* node : group) + { + if (auto* subgroup = node->getGroup()) + foundSoFar = findAllSubgroupsDepthFirst (*subgroup, std::move (foundSoFar)); + } + + return foundSoFar; + } + + using GroupSymbolMap = std::map; + + static String getFlattenedGroupSymbol (const AudioProcessorParameterGroup& group, String symbol = "") + { + if (auto* parent = group.getParent()) + return getFlattenedGroupSymbol (*parent, group.getID() + (symbol.isEmpty() ? "" : group.getSeparator() + symbol)); + + return symbol; + } + + static String getSymbolForGroup (const AudioProcessorParameterGroup& group) + { + const String allowedCharacters ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789"); + const auto base = getFlattenedGroupSymbol (group); + + if (base.isEmpty()) + return {}; + + String copy; + + for (const auto character : base) + copy << String::charToString (allowedCharacters.containsChar (character) ? character : (juce_wchar) '_'); + + return "paramgroup_" + copy; + } + + static GroupSymbolMap getGroupsAndSymbols (const std::vector& groups) + { + std::set symbols; + GroupSymbolMap result; + + for (const auto& group : groups) + { + const auto symbol = [&] + { + const auto idealSymbol = getSymbolForGroup (*group); + + if (symbols.find (idealSymbol) == symbols.cend()) + return idealSymbol; + + for (auto i = 2; i < std::numeric_limits::max(); ++i) + { + const auto toTest = idealSymbol + "_" + String (i); + + if (symbols.find (toTest) == symbols.cend()) + return toTest; + } + + jassertfalse; + return String(); + }(); + + symbols.insert (symbol); + result.emplace (group, symbol); + } + + return result; + } + + template + static void visitAllParameters (const GroupSymbolMap& groups, Fn&& fn) + { + for (const auto& group : groups) + for (const auto* node : *group.first) + if (auto* param = node->getParameter()) + fn (group.second, *param); + } + + static Result writeDspTtl (AudioProcessor& proc, const File& libraryPath) + { + auto os = openStream (libraryPath, "dsp"); + + os << "@prefix atom: .\n" + "@prefix bufs: .\n" + "@prefix doap: .\n" + "@prefix foaf: .\n" + "@prefix lv2: .\n" + "@prefix midi: .\n" + "@prefix opts: .\n" + "@prefix param: .\n" + "@prefix patch: .\n" + "@prefix pg: .\n" + "@prefix plug: <" JucePlugin_LV2URI << uriSeparator << "> .\n" + "@prefix pprop: .\n" + "@prefix rdfs: .\n" + "@prefix rdf: .\n" + "@prefix rsz: .\n" + "@prefix state: .\n" + "@prefix time: .\n" + "@prefix ui: .\n" + "@prefix units: .\n" + "@prefix urid: .\n" + "@prefix xsd: .\n" + "\n"; + + LegacyAudioParametersWrapper legacyParameters (proc, false); + + const auto allGroups = findAllSubgroupsDepthFirst (legacyParameters.getGroup()); + const auto groupsAndSymbols = getGroupsAndSymbols (allGroups); + + const auto parameterVisitor = [&] (const String& symbol, + const AudioProcessorParameter& param) + { + os << "plug:" << ParameterStorage::getIri (param) << "\n" + "\ta lv2:Parameter ;\n" + "\trdfs:label \"" << param.getName (1024) << "\" ;\n"; + + if (symbol.isNotEmpty()) + os << "\tpg:group plug:" << symbol << " ;\n"; + + os << "\trdfs:range atom:Float ;\n"; + + if (auto* rangedParam = dynamic_cast (¶m)) + { + os << "\tlv2:default " << rangedParam->convertFrom0to1 (rangedParam->getDefaultValue()) << " ;\n" + "\tlv2:minimum " << rangedParam->getNormalisableRange().start << " ;\n" + "\tlv2:maximum " << rangedParam->getNormalisableRange().end; + } + else + { + os << "\tlv2:default " << param.getDefaultValue() << " ;\n" + "\tlv2:minimum 0.0 ;\n" + "\tlv2:maximum 1.0"; + } + + // Avoid writing out loads of scale points for parameters with lots of steps + constexpr auto stepLimit = 1000; + const auto numSteps = param.getNumSteps(); + + if (param.isDiscrete() && 2 <= numSteps && numSteps < stepLimit) + { + os << "\t ;\n" + "\tlv2:portProperty lv2:enumeration " << (param.isBoolean() ? ", lv2:toggled " : "") << ";\n" + "\tlv2:scalePoint "; + + const auto maxIndex = numSteps - 1; + + for (int i = 0; i < numSteps; ++i) + { + const auto value = (float) i / (float) maxIndex; + const auto text = param.getText (value, 1024); + + os << (i != 0 ? ", " : "") << "[\n" + "\t\trdfs:label \"" << text << "\" ;\n" + "\t\trdf:value " << value << " ;\n" + "\t]"; + } + } + + os << " .\n\n"; + }; + + visitAllParameters (groupsAndSymbols, parameterVisitor); + + for (const auto& groupInfo : groupsAndSymbols) + { + if (groupInfo.second.isEmpty()) + continue; + + os << "plug:" << groupInfo.second << "\n" + "\ta pg:Group ;\n"; + + if (auto* parent = groupInfo.first->getParent()) + { + if (parent->getParent() != nullptr) + { + const auto it = groupsAndSymbols.find (parent); + + if (it != groupsAndSymbols.cend()) + os << "\tpg:subGroupOf plug:" << it->second << " ;\n"; + } + } + + os << "\tlv2:symbol \"" << groupInfo.second << "\" ;\n" + "\tlv2:name \"" << groupInfo.first->getName() << "\" .\n\n"; + } + + const auto getBaseBusName = [] (bool isInput) { return isInput ? "input_group_" : "output_group_"; }; + + for (const auto isInput : { true, false }) + { + const auto baseBusName = getBaseBusName (isInput); + const auto groupKind = isInput ? "InputGroup" : "OutputGroup"; + const auto busCount = proc.getBusCount (isInput); + + for (auto i = 0; i < busCount; ++i) + { + if (const auto* bus = proc.getBus (isInput, i)) + { + os << "plug:" << baseBusName << (i + 1) << "\n" + "\ta pg:" << groupKind << " ;\n" + "\tlv2:name \"" << bus->getName() << "\" ;\n" + "\tlv2:symbol \"" << baseBusName << (i + 1) << "\" .\n\n"; + } + } + } + + os << "<" JucePlugin_LV2URI ">\n"; + + if (proc.hasEditor()) + os << "\tui:ui <" << JucePluginLV2UriUi << "> ;\n"; + + const auto versionParts = StringArray::fromTokens (JucePlugin_VersionString, ".", ""); + + const auto getVersionOrZero = [&] (int indexFromBack) + { + const auto str = versionParts[versionParts.size() - indexFromBack]; + return str.isEmpty() ? 0 : str.getIntValue(); + }; + + const auto minorVersion = getVersionOrZero (2); + const auto microVersion = getVersionOrZero (1); + + os << "\ta " + #if JucePlugin_IsSynth + "lv2:InstrumentPlugin" + #else + "lv2:Plugin" + #endif + " ;\n" + "\tdoap:name \"" JucePlugin_Name "\" ;\n" + "\tdoap:description \"" JucePlugin_Desc "\" ;\n" + "\tlv2:minorVersion " << minorVersion << " ;\n" + "\tlv2:microVersion " << microVersion << " ;\n" + "\tdoap:maintainer [\n" + "\t\ta foaf:Person ;\n" + "\t\tfoaf:name \"" JucePlugin_Manufacturer "\" ;\n" + "\t\tfoaf:homepage <" JucePlugin_ManufacturerWebsite "> ;\n" + "\t\tfoaf:mbox <" JucePlugin_ManufacturerEmail "> ;\n" + "\t] ;\n" + "\tdoap:release [\n" + "\t\ta doap:Version ;\n" + "\t\tdoap:revision \"" JucePlugin_VersionString "\" ;\n" + "\t] ;\n" + "\tlv2:optionalFeature\n" + "\t\tlv2:hardRTCapable ;\n" + "\tlv2:extensionData\n" + "\t\tstate:interface ;\n" + "\tlv2:requiredFeature\n" + "\t\turid:map ,\n" + "\t\topts:options ,\n" + "\t\tbufs:boundedBlockLength ;\n"; + + for (const auto isInput : { true, false }) + { + const auto kind = isInput ? "mainInput" : "mainOutput"; + + if (proc.getBusCount (isInput) > 0) + os << "\tpg:" << kind << " plug:" << getBaseBusName (isInput) << "1 ;\n"; + } + + if (legacyParameters.size() != 0) + { + for (const auto header : { "writable", "readable" }) + { + os << "\tpatch:" << header; + + bool isFirst = true; + + for (const auto* param : legacyParameters) + { + os << (isFirst ? "" : " ,") << "\n\t\tplug:" << ParameterStorage::getIri (*param); + isFirst = false; + } + + os << " ;\n"; + } + } + + os << "\tlv2:port [\n"; + + const PortIndices indices (proc.getTotalNumInputChannels(), + proc.getTotalNumOutputChannels()); + + const auto designationMap = [&] + { + std::map result; + + for (const auto& pair : lv2_shared::channelDesignationMap) + result.emplace (pair.second, pair.first); + + return result; + }(); + + // TODO add support for specific audio group kinds + for (const auto isInput : { true, false }) + { + const auto baseBusName = getBaseBusName (isInput); + const auto portKind = isInput ? "InputPort" : "OutputPort"; + const auto portName = isInput ? "Audio In " : "Audio Out "; + const auto portSymbol = isInput ? "audio_in_" : "audio_out_"; + const auto busCount = proc.getBusCount (isInput); + + auto channelCounter = 0; + + for (auto busIndex = 0; busIndex < busCount; ++busIndex) + { + if (const auto* bus = proc.getBus (isInput, busIndex)) + { + const auto channelCount = bus->getNumberOfChannels(); + const auto optionalBus = ! bus->isEnabledByDefault(); + + for (auto channelIndex = 0; channelIndex < channelCount; ++channelIndex, ++channelCounter) + { + const auto portIndex = isInput ? indices.getPortIndexForAudioInput (channelCounter) + : indices.getPortIndexForAudioOutput (channelCounter); + + os << "\t\ta lv2:" << portKind << " , lv2:AudioPort ;\n" + "\t\tlv2:index " << portIndex << " ;\n" + "\t\tlv2:symbol \"" << portSymbol << (channelCounter + 1) << "\" ;\n" + "\t\tlv2:name \"" << portName << (channelCounter + 1) << "\" ;\n" + "\t\tpg:group plug:" << baseBusName << (busIndex + 1) << " ;\n"; + + if (optionalBus) + os << "\t\tlv2:portProperty lv2:connectionOptional ;\n"; + + const auto designation = bus->getCurrentLayout().getTypeOfChannel (channelIndex); + const auto it = designationMap.find (designation); + + if (it != designationMap.end()) + os << "\t\tlv2:designation <" << it->second << "> ;\n"; + + os << "\t] , [\n"; + } + } + } + } + + // In the event that the plugin decides to send all of its parameters in one go, + // we should ensure that the output buffer is large enough to accommodate, with some + // extra room for the sequence header, MIDI messages etc.. + const auto patchSetSizeBytes = 72; + const auto additionalSize = 8192; + const auto atomPortMinSize = proc.getParameters().size() * patchSetSizeBytes + additionalSize; + + os << "\t\ta lv2:InputPort , atom:AtomPort ;\n" + "\t\trsz:minimumSize " << atomPortMinSize << " ;\n" + "\t\tatom:bufferType atom:Sequence ;\n" + "\t\tatom:supports\n"; + + #if ! JucePlugin_IsSynth && ! JucePlugin_IsMidiEffect + if (proc.acceptsMidi()) + #endif + os << "\t\t\tmidi:MidiEvent ,\n"; + + os << "\t\t\tpatch:Message ,\n" + "\t\t\ttime:Position ;\n" + "\t\tlv2:designation lv2:control ;\n" + "\t\tlv2:index " << indices.getPortIndexFor (PortKind::seqInput) << " ;\n" + "\t\tlv2:symbol \"in\" ;\n" + "\t\tlv2:name \"In\" ;\n" + "\t] , [\n" + "\t\ta lv2:OutputPort , atom:AtomPort ;\n" + "\t\trsz:minimumSize " << atomPortMinSize << " ;\n" + "\t\tatom:bufferType atom:Sequence ;\n" + "\t\tatom:supports\n"; + + #if ! JucePlugin_IsMidiEffect + if (proc.producesMidi()) + #endif + os << "\t\t\tmidi:MidiEvent ,\n"; + + os << "\t\t\tpatch:Message ;\n" + "\t\tlv2:designation lv2:control ;\n" + "\t\tlv2:index " << indices.getPortIndexFor (PortKind::seqOutput) << " ;\n" + "\t\tlv2:symbol \"out\" ;\n" + "\t\tlv2:name \"Out\" ;\n" + "\t] , [\n" + "\t\ta lv2:OutputPort , lv2:ControlPort ;\n" + "\t\tlv2:designation lv2:latency ;\n" + "\t\tlv2:symbol \"latency\" ;\n" + "\t\tlv2:name \"Latency\" ;\n" + "\t\tlv2:index " << indices.getPortIndexFor (PortKind::latencyOutput) << " ;\n" + "\t\tlv2:portProperty lv2:reportsLatency , lv2:integer , lv2:connectionOptional , pprop:notOnGUI ;\n" + "\t\tunits:unit units:frame ;\n" + "\t] , [\n" + "\t\ta lv2:InputPort , lv2:ControlPort ;\n" + "\t\tlv2:designation lv2:freeWheeling ;\n" + "\t\tlv2:symbol \"freeWheeling\" ;\n" + "\t\tlv2:name \"Free Wheeling\" ;\n" + "\t\tlv2:default 0.0 ;\n" + "\t\tlv2:minimum 0.0 ;\n" + "\t\tlv2:maximum 1.0 ;\n" + "\t\tlv2:index " << indices.getPortIndexFor (PortKind::freeWheelingInput) << " ;\n" + "\t\tlv2:portProperty lv2:toggled , lv2:connectionOptional , pprop:notOnGUI ;\n" + "\t] , [\n" + "\t\ta lv2:InputPort , lv2:ControlPort ;\n" + "\t\tlv2:designation lv2:enabled ;\n" + "\t\tlv2:symbol \"enabled\" ;\n" + "\t\tlv2:name \"Enabled\" ;\n" + "\t\tlv2:default 1.0 ;\n" + "\t\tlv2:minimum 0.0 ;\n" + "\t\tlv2:maximum 1.0 ;\n" + "\t\tlv2:index " << indices.getPortIndexFor (PortKind::enabledInput) << " ;\n" + "\t\tlv2:portProperty lv2:toggled , lv2:connectionOptional , pprop:notOnGUI ;\n" + "\t] ;\n" + "\topts:supportedOption\n" + "\t\tbufs:maxBlockLength .\n"; + + return Result::ok(); + } + + static Result writeUiTtl (AudioProcessor& proc, const File& libraryPath) + { + if (! proc.hasEditor()) + return Result::ok(); + + auto os = openStream (libraryPath, "ui"); + + const auto editorInstance = rawToUniquePtr (proc.createEditor()); + const auto resizeFeatureString = editorInstance->isResizable() ? "ui:resize" : "ui:noUserResize"; + + os << "@prefix lv2: .\n" + "@prefix opts: .\n" + "@prefix param: .\n" + "@prefix ui: .\n" + "@prefix urid: .\n" + "\n" + "<" << JucePluginLV2UriUi << ">\n" + "\tlv2:extensionData\n" + #if JUCE_LINUX || JUCE_BSD + "\t\tui:idleInterface ,\n" + #endif + "\t\topts:interface ,\n" + "\t\tui:noUserResize ,\n" // resize and noUserResize are always present in the extension data array + "\t\tui:resize ;\n" + "\n" + "\tlv2:requiredFeature\n" + #if JUCE_LINUX || JUCE_BSD + "\t\tui:idleInterface ,\n" + #endif + "\t\turid:map ,\n" + "\t\tui:parent ,\n" + "\t\t ;\n" + "\n" + "\tlv2:optionalFeature\n" + "\t\t" << resizeFeatureString << " ,\n" + "\t\topts:interface ,\n" + "\t\topts:options ;\n\n" + "\topts:supportedOption\n" + "\t\tui:scaleFactor ,\n" + "\t\tparam:sampleRate .\n"; + + return Result::ok(); + } + + JUCE_LEAK_DETECTOR (RecallFeature) +}; + +//============================================================================== +LV2_SYMBOL_EXPORT const LV2_Descriptor* lv2_descriptor (uint32_t index) +{ + PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_LV2; + + if (index != 0) + return nullptr; + + static const LV2_Descriptor descriptor + { + JucePlugin_LV2URI, // TODO some constexpr check that this is a valid URI in terms of RFC 3986 + [] (const LV2_Descriptor*, + double sampleRate, + const char* pathToBundle, + const LV2_Feature* const* features) -> LV2_Handle + { + const auto* mapFeature = findMatchingFeatureData (features, LV2_URID__map); + + if (mapFeature == nullptr) + { + // The host doesn't provide the 'urid map' feature + jassertfalse; + return nullptr; + } + + const auto boundedBlockLength = hasFeature (features, LV2_BUF_SIZE__boundedBlockLength); + + if (! boundedBlockLength) + { + // The host doesn't provide the 'bounded block length' feature + jassertfalse; + return nullptr; + } + + const auto* options = findMatchingFeatureData (features, LV2_OPTIONS__options); + + if (options == nullptr) + { + // The host doesn't provide the 'options' feature + jassertfalse; + return nullptr; + } + + const lv2_shared::NumericAtomParser parser { *mapFeature }; + const auto blockLengthUrid = mapFeature->map (mapFeature->handle, LV2_BUF_SIZE__maxBlockLength); + const auto blockSize = parser.parseNumericOption (findMatchingOption (options, blockLengthUrid)); + + if (! blockSize.hasValue()) + { + // The host doesn't specify a maximum block size + jassertfalse; + return nullptr; + } + + return new LV2PluginInstance { sampleRate, *blockSize, pathToBundle, *mapFeature }; + }, + [] (LV2_Handle instance, uint32_t port, void* data) + { + static_cast (instance)->connect (port, data); + }, + [] (LV2_Handle instance) { static_cast (instance)->activate(); }, + [] (LV2_Handle instance, uint32_t sampleCount) + { + static_cast (instance)->run (sampleCount); + }, + [] (LV2_Handle instance) { static_cast (instance)->deactivate(); }, + [] (LV2_Handle instance) + { + JUCE_AUTORELEASEPOOL + { + delete static_cast (instance); + } + }, + [] (const char* uri) -> const void* + { + const auto uriMatches = [&] (const LV2_Feature& f) { return std::strcmp (f.URI, uri) == 0; }; + + static RecallFeature recallFeature; + + static LV2_State_Interface stateInterface + { + [] (LV2_Handle instance, + LV2_State_Store_Function store, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature* const* features) -> LV2_State_Status + { + return static_cast (instance)->store (store, handle, flags, features); + }, + [] (LV2_Handle instance, + LV2_State_Retrieve_Function retrieve, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature* const* features) -> LV2_State_Status + { + return static_cast (instance)->retrieve (retrieve, handle, flags, features); + } + }; + + static const LV2_Feature features[] { { JUCE_TURTLE_RECALL_URI, &recallFeature }, + { LV2_STATE__interface, &stateInterface } }; + + const auto it = std::find_if (std::begin (features), std::end (features), uriMatches); + return it != std::end (features) ? it->data : nullptr; + } + }; + + return &descriptor; +} + +static Optional findScaleFactor (const LV2_URID_Map* symap, const LV2_Options_Option* options) +{ + if (options == nullptr || symap == nullptr) + return {}; + + const lv2_shared::NumericAtomParser parser { *symap }; + const auto scaleFactorUrid = symap->map (symap->handle, LV2_UI__scaleFactor); + const auto* scaleFactorOption = findMatchingOption (options, scaleFactorUrid); + return parser.parseNumericOption (scaleFactorOption); +} + +class LV2UIInstance : private Component, + private ComponentListener +{ +public: + LV2UIInstance (const char*, + const char*, + LV2UI_Write_Function writeFunctionIn, + LV2UI_Controller controllerIn, + LV2UI_Widget* widget, + LV2PluginInstance* pluginIn, + LV2UI_Widget parentIn, + const LV2_URID_Map* symapIn, + const LV2UI_Resize* resizeFeatureIn, + Optional scaleFactorIn) + : writeFunction (writeFunctionIn), + controller (controllerIn), + plugin (pluginIn), + parent (parentIn), + symap (symapIn), + resizeFeature (resizeFeatureIn), + scaleFactor (scaleFactorIn), + editor (plugin->createEditor()) + { + jassert (plugin != nullptr); + jassert (parent != nullptr); + jassert (editor != nullptr); + + if (editor == nullptr) + return; + + const auto bounds = getSizeToContainChild(); + setSize (bounds.getWidth(), bounds.getHeight()); + + addAndMakeVisible (*editor); + + setBroughtToFrontOnMouseClick (true); + setOpaque (true); + setVisible (false); + removeFromDesktop(); + addToDesktop (0, parent); + editor->addComponentListener (this); + + *widget = getWindowHandle(); + + setVisible (true); + + editor->setScaleFactor (getScaleFactor()); + requestResize(); + } + + ~LV2UIInstance() override + { + plugin->editorBeingDeleted (editor.get()); + } + + // This is called by the host when a parameter changes. + // We don't care, our UI will listen to the processor directly. + void portEvent (uint32_t, uint32_t, uint32_t, const void*) {} + + // Called when the host requests a resize + int resize (int width, int height) + { + const ScopedValueSetter scope (hostRequestedResize, true); + setSize (width, height); + return 0; + } + + // Called by the host to give us an opportunity to process UI events + void idleCallback() + { + #if JUCE_LINUX || JUCE_BSD + messageThread->processPendingEvents(); + #endif + } + + void resized() override + { + const ScopedValueSetter scope (hostRequestedResize, true); + + if (editor != nullptr) + { + const auto localArea = editor->getLocalArea (this, getLocalBounds()); + editor->setBoundsConstrained ({ localArea.getWidth(), localArea.getHeight() }); + } + } + + void paint (Graphics& g) override { g.fillAll (Colours::black); } + + uint32_t getOptions (LV2_Options_Option* options) + { + const auto scaleFactorUrid = symap->map (symap->handle, LV2_UI__scaleFactor); + const auto floatUrid = symap->map (symap->handle, LV2_ATOM__Float);; + + for (auto* opt = options; opt->key != 0; ++opt) + { + if (opt->context != LV2_OPTIONS_INSTANCE || opt->subject != 0 || opt->key != scaleFactorUrid) + continue; + + if (scaleFactor.hasValue()) + { + opt->type = floatUrid; + opt->size = sizeof (float); + opt->value = &(*scaleFactor); + } + } + + return LV2_OPTIONS_SUCCESS; + } + + uint32_t setOptions (const LV2_Options_Option* options) + { + const auto scaleFactorUrid = symap->map (symap->handle, LV2_UI__scaleFactor); + const auto floatUrid = symap->map (symap->handle, LV2_ATOM__Float);; + + for (auto* opt = options; opt->key != 0; ++opt) + { + if (opt->context != LV2_OPTIONS_INSTANCE + || opt->subject != 0 + || opt->key != scaleFactorUrid + || opt->type != floatUrid + || opt->size != sizeof (float)) + { + continue; + } + + scaleFactor = *static_cast (opt->value); + updateScale(); + } + + return LV2_OPTIONS_SUCCESS; + } + +private: + void updateScale() + { + editor->setScaleFactor (getScaleFactor()); + requestResize(); + } + + Rectangle getSizeToContainChild() const + { + if (editor != nullptr) + return getLocalArea (editor.get(), editor->getLocalBounds()); + + return {}; + } + + float getScaleFactor() const noexcept + { + return scaleFactor.hasValue() ? *scaleFactor : 1.0f; + } + + void componentMovedOrResized (Component&, bool, bool wasResized) override + { + if (! hostRequestedResize && wasResized) + requestResize(); + } + + void write (uint32_t portIndex, uint32_t bufferSize, uint32_t portProtocol, const void* data) + { + writeFunction (controller, portIndex, bufferSize, portProtocol, data); + } + + void requestResize() + { + if (editor == nullptr) + return; + + const auto bounds = getSizeToContainChild(); + + if (resizeFeature == nullptr) + return; + + if (auto* fn = resizeFeature->ui_resize) + fn (resizeFeature->handle, bounds.getWidth(), bounds.getHeight()); + + setSize (bounds.getWidth(), bounds.getHeight()); + repaint(); + } + + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer messageThread; + #endif + + LV2UI_Write_Function writeFunction; + LV2UI_Controller controller; + LV2PluginInstance* plugin; + LV2UI_Widget parent; + const LV2_URID_Map* symap = nullptr; + const LV2UI_Resize* resizeFeature = nullptr; + Optional scaleFactor; + std::unique_ptr editor; + bool hostRequestedResize = false; + + JUCE_LEAK_DETECTOR (LV2UIInstance) +}; + +LV2_SYMBOL_EXPORT const LV2UI_Descriptor* lv2ui_descriptor (uint32_t index) +{ + if (index != 0) + return nullptr; + + static const LV2UI_Descriptor descriptor + { + JucePluginLV2UriUi.toRawUTF8(), // TODO some constexpr check that this is a valid URI in terms of RFC 3986 + [] (const LV2UI_Descriptor*, + const char* pluginUri, + const char* bundlePath, + LV2UI_Write_Function writeFunction, + LV2UI_Controller controller, + LV2UI_Widget* widget, + const LV2_Feature* const* features) -> LV2UI_Handle + { + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer messageThread; + #endif + + auto* plugin = findMatchingFeatureData (features, LV2_INSTANCE_ACCESS_URI); + + if (plugin == nullptr) + { + // No instance access + jassertfalse; + return nullptr; + } + + auto* parent = findMatchingFeatureData (features, LV2_UI__parent); + + if (parent == nullptr) + { + // No parent access + jassertfalse; + return nullptr; + } + + auto* resizeFeature = findMatchingFeatureData (features, LV2_UI__resize); + + const auto* symap = findMatchingFeatureData (features, LV2_URID__map); + const auto scaleFactor = findScaleFactor (symap, findMatchingFeatureData (features, LV2_OPTIONS__options)); + + return new LV2UIInstance { pluginUri, + bundlePath, + writeFunction, + controller, + widget, + plugin, + parent, + symap, + resizeFeature, + scaleFactor }; + }, + [] (LV2UI_Handle ui) + { + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer messageThread; + #endif + + JUCE_AUTORELEASEPOOL + { + delete static_cast (ui); + } + }, + [] (LV2UI_Handle ui, uint32_t portIndex, uint32_t bufferSize, uint32_t format, const void* buffer) + { + JUCE_ASSERT_MESSAGE_THREAD + static_cast (ui)->portEvent (portIndex, bufferSize, format, buffer); + }, + [] (const char* uri) -> const void* + { + const auto uriMatches = [&] (const LV2_Feature& f) { return std::strcmp (f.URI, uri) == 0; }; + + static LV2UI_Resize resize { nullptr, [] (LV2UI_Feature_Handle handle, int width, int height) -> int + { + JUCE_ASSERT_MESSAGE_THREAD + return static_cast (handle)->resize (width, height); + } }; + + static LV2UI_Idle_Interface idle { [] (LV2UI_Handle handle) + { + static_cast (handle)->idleCallback(); + return 0; + } }; + + static LV2_Options_Interface options + { + [] (LV2_Handle handle, LV2_Options_Option* optionsIn) + { + return static_cast (handle)->getOptions (optionsIn); + }, + [] (LV2_Handle handle, const LV2_Options_Option* optionsIn) + { + return static_cast (handle)->setOptions (optionsIn); + } + }; + + // We'll always define noUserResize and idle in the extension data array, but we'll + // only declare them in the ui.ttl if the UI is actually non-resizable, or requires + // idle callbacks. + // Well-behaved hosts should check the ttl before trying to search the + // extension-data array. + static const LV2_Feature features[] { { LV2_UI__resize, &resize }, + { LV2_UI__noUserResize, nullptr }, + { LV2_UI__idleInterface, &idle }, + { LV2_OPTIONS__interface, &options } }; + + const auto it = std::find_if (std::begin (features), std::end (features), uriMatches); + return it != std::end (features) ? it->data : nullptr; + } + }; + + return &descriptor; +} + +} +} + +#endif diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp deleted file mode 100644 index 63ddd11b..00000000 --- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#pragma once - -#include -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -#include "juce_RTAS_DigiCode_Header.h" - -/* - This file is used to include and build the required digidesign CPP files without your project - needing to reference the files directly. Because these files will be found via your include path, - this means that the project doesn't have to change to cope with people's SDKs being in different - locations. - - Important note on Windows: In your project settings for the three juce_RTAS_DigiCode.cpp files and - the juce_RTAS_Wrapper.cpp file, you need to set the calling convention to "__stdcall". - If you don't do this, you'll get some unresolved externals and will spend a long time wondering what's - going on... All the other files in your project can be set to use the normal __cdecl convention. - - If you get an error building the includes statements below, check your paths - there's a full - list of the necessary Digidesign paths in juce_RTAS_Wrapper.cpp -*/ - -#if WINDOWS_VERSION - #undef _UNICODE - #undef UNICODE -#endif - -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnon-virtual-dtor", - "-Wcomment", - "-Wreorder", - "-Wextra-tokens", - "-Wunused-variable", - "-Wdeprecated") - -#include -#include -#include -#include -#include -#include -#include -#include - -JUCE_END_IGNORE_WARNINGS_GCC_LIKE - -#endif diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp deleted file mode 100644 index 671ee40b..00000000 --- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#pragma once - -#include -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -#include "juce_RTAS_DigiCode_Header.h" - -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wcomment", - "-Wextra-tokens", - "-Wnon-virtual-dtor", - "-Wreorder", - "-Wdeprecated") - -/* - This file is used to include and build the required digidesign CPP files without your project - needing to reference the files directly. Because these files will be found via your include path, - this means that the project doesn't have to change to cope with people's SDKs being in different - locations. - - Important note on Windows: In your project settings for the three juce_RTAS_DigiCode.cpp files and - the juce_RTAS_Wrapper.cpp file, you need to set the calling convention to "__stdcall". - If you don't do this, you'll get some unresolved externals and will spend a long time wondering what's - going on... All the other files in your project can be set to use the normal __cdecl convention. - - If you get an error building the includes statements below, check your paths - there's a full - list of the necessary Digidesign paths in juce_RTAS_Wrapper.cpp -*/ - -#include -#include - -JUCE_END_IGNORE_WARNINGS_GCC_LIKE - -#endif diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp deleted file mode 100644 index cc31b78f..00000000 --- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#pragma once - -#include -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - - #include "../utility/juce_IncludeSystemHeaders.h" - #include "juce_RTAS_DigiCode_Header.h" - - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wnon-virtual-dtor", "-Wextra-tokens", "-Wreorder") - - /* - This file is used to include and build the required digidesign CPP files without your project - needing to reference the files directly. Because these files will be found via your include path, - this means that the project doesn't have to change to cope with people's SDKs being in different - locations. - - Important note on Windows: In your project settings for the three juce_RTAS_DigiCode.cpp files and - the juce_RTAS_Wrapper.cpp file, you need to set the calling convention to "__stdcall". - If you don't do this, you'll get some unresolved externals and will spend a long time wondering what's - going on... All the other files in your project can be set to use the normal __cdecl convention. - - If you get an error building the includes statements below, check your paths - there's a full - list of the necessary Digidesign paths in juce_RTAS_Wrapper.cpp - */ - - #if WINDOWS_VERSION - #undef _UNICODE - #undef UNICODE - #define DllMain DllMainRTAS - #include - #undef DllMain - #include - #else - #include - #include - #endif - - JUCE_END_IGNORE_WARNINGS_GCC_LIKE - -#else - - #if _MSC_VER - short __stdcall NewPlugIn (void*) { return 0; } - short __stdcall _PI_GetRoutineDescriptor (long, void*) { return 0; } - #endif - -#endif diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h deleted file mode 100644 index cb3929e3..00000000 --- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#pragma once - -#if JucePlugin_Build_RTAS -#ifdef _MSC_VER - - #define kCompileAsCodeResource 0 - #define kBuildStandAlone 0 - #define kNoDSP 0 - #define kNoDAE 0 - #define kNoSDS 0 - #define kNoViews 0 - #define kUseDSPCodeDecode 0 - - #define WIN32 1 - #define WINDOWS_VERSION 1 - #define PLUGIN_SDK_BUILD 1 - #define PLUGIN_SDK_DIRECTMIDI 1 - #define _STDINT_H 1 - - // the Digidesign projects all use a struct alignment of 2.. - #pragma pack (2) - #pragma warning (disable: 4267 4996 4311 4312 4103 4121 4100 4127 4189 4245 4389 4512 4701 4703) - - #include - -#else - - #define kCompileAsCodeResource 0 - #define kNoDSP 1 - #define kNoDAE 0 - #define kNoSDS 0 - #define kNoViews 0 - #define kUseDSPCodeDecode 0 - - #define MAC_VERSION 1 - #define PLUGIN_SDK_BUILD 1 - #define PLUGIN_SDK_DIRECTMIDI 1 - #define DIGI_PASCAL - - #include - -#endif -#endif diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm deleted file mode 100644 index 482055f4..00000000 --- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm +++ /dev/null @@ -1,169 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -// Horrible carbon-based fix for a cocoa bug, where an NSWindow that wraps a carbon -// window fails to keep its position updated when the user drags the window around.. -#define WINDOWPOSITION_BODGE 1 -#define JUCE_MAC_WINDOW_VISIBITY_BODGE 1 - -#include "../utility/juce_IncludeSystemHeaders.h" -#include "../utility/juce_IncludeModuleHeaders.h" -#include "../utility/juce_CarbonVisibility.h" - -using namespace juce; - -//============================================================================== -void initialiseMacRTAS(); -void initialiseMacRTAS() -{ - #if ! JUCE_64BIT - NSApplicationLoad(); - #endif -} - -void* attachSubWindow (void*, Component*); -void* attachSubWindow (void* hostWindowRef, Component* comp) -{ - JUCE_AUTORELEASEPOOL - { - #if 0 - // This was suggested as a way to improve passing keypresses to the host, but - // a side-effect seems to be occasional rendering artifacts. - HIWindowChangeClass ((WindowRef) hostWindowRef, kFloatingWindowClass); - #endif - - NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: hostWindowRef]; - [hostWindow retain]; - [hostWindow setCanHide: YES]; - [hostWindow setReleasedWhenClosed: YES]; - NSRect oldWindowFrame = [hostWindow frame]; - - NSView* content = [hostWindow contentView]; - NSRect f = [content frame]; - f.size.width = comp->getWidth(); - f.size.height = comp->getHeight(); - [content setFrame: f]; - - const CGFloat mainScreenHeight = [[[NSScreen screens] objectAtIndex: 0] frame].size.height; - - #if WINDOWPOSITION_BODGE - { - Rect winBounds; - GetWindowBounds ((WindowRef) hostWindowRef, kWindowContentRgn, &winBounds); - NSRect w = [hostWindow frame]; - w.origin.x = winBounds.left; - w.origin.y = mainScreenHeight - winBounds.bottom; - [hostWindow setFrame: w display: NO animate: NO]; - } - #endif - - NSPoint windowPos = [hostWindow convertBaseToScreen: f.origin]; - windowPos.x = windowPos.x + jmax (0.0f, (oldWindowFrame.size.width - f.size.width) / 2.0f); - windowPos.y = mainScreenHeight - (windowPos.y + f.size.height); - - comp->setTopLeftPosition ((int) windowPos.x, (int) windowPos.y); - - #if ! JucePlugin_EditorRequiresKeyboardFocus - comp->addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); - #else - comp->addToDesktop (ComponentPeer::windowIsTemporary); - #endif - - comp->setVisible (true); - - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* pluginWindow = [pluginView window]; - - [hostWindow addChildWindow: pluginWindow - ordered: NSWindowAbove]; - [hostWindow orderFront: nil]; - [pluginWindow orderFront: nil]; - - attachWindowHidingHooks (comp, (WindowRef) hostWindowRef, hostWindow); - - return hostWindow; - } -} - -void removeSubWindow (void*, Component*); -void removeSubWindow (void* nsWindow, Component* comp) -{ - JUCE_AUTORELEASEPOOL - { - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* hostWindow = (NSWindow*) nsWindow; - NSWindow* pluginWindow = [pluginView window]; - - removeWindowHidingHooks (comp); - [hostWindow removeChildWindow: pluginWindow]; - comp->removeFromDesktop(); - [hostWindow release]; - } -} - -namespace -{ - bool isJuceWindow (WindowRef w) - { - for (int i = ComponentPeer::getNumPeers(); --i >= 0;) - { - ComponentPeer* peer = ComponentPeer::getPeer(i); - NSView* view = (NSView*) peer->getNativeHandle(); - - if ([[view window] windowRef] == w) - return true; - } - - return false; - } -} - -void forwardCurrentKeyEventToHostWindow(); -void forwardCurrentKeyEventToHostWindow() -{ - WindowRef w = FrontNonFloatingWindow(); - WindowRef original = w; - - while (IsValidWindowPtr (w) && isJuceWindow (w)) - { - w = GetNextWindowOfClass (w, kDocumentWindowClass, true); - - if (w == original) - break; - } - - if (! isJuceWindow (w)) - { - ActivateWindow (w, true); - repostCurrentNSEvent(); - } -} - -#endif diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def deleted file mode 100644 index fcc8f5e6..00000000 --- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def +++ /dev/null @@ -1,4 +0,0 @@ -EXPORTS - NewPlugIn @1 - _PI_GetRoutineDescriptor @2 - diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinResources.rsr b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinResources.rsr deleted file mode 100644 index d8bfb4a1c8594d8faf551d09f1b3c7a07f875fce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3198 zcmd^BO>7%Q6ngjND65S;QOf{;QW6h$pb6cQS#C@9$Lbdh6Qc7Dhy zD;gxYRN|UTZwNSY$_eNd#SN#3i(|L+=-8I3G+le`;k}t1k9V7-;=qY#@4olG_dm0< zHh=*D&kX^b#>>F#e@9nNy}&vFI^XOc=pXp%^~m5mE$J2Z)4<^1Td!VoP@sP$?1E19661?$Idb2lD*`S_G=+Ndr3JcbIB2Q z4=%OYm1nyh>quB})c%#-OVAeXk3VD(Uw+4PP|XGFx8X_*#4EVP19rJEEo)%Dr}if& zJ90i{P#o*{>MLCFfL+5{67hOFz0Nh@v+KE(gTKDEwG@6a$$Zhf(9)u$a z?PP0JbX>nH+7YR>$mMlKP$Nqd51q#9ytco;@7Czc-Flm*m z;I)H;1Gh$B-aHV!VMCNd5>@jETxG^8n*99(oCpHB(3X#OLwO%nLObzze1R|_NIgzE z;_-!w@RvG)Qs2Pfdxw4NcyLvN(RB8CPpi+e{ir)2Lw2Newe132D&s`{RzDLx6?qWGy zEOv7)3bUb#SDIh`G z1t4yoKOJ1*bV$5DLMR>X@5`rBiNa6hbL#p`kW|;tx|ph2mxqqm-MR}do+9Zl+&FM? ztkkNYie!6F{oS10xtqS3Am#|l9pWfr#Ha5?#_ujl?8@6%t&U)|WIosg82)wrT&H0*YImm^bpQm@( z+0n62r;r<$CqKL_O4_3zj9rit;UslTjeNW!Ajn7rt{D@MFupr^V*H9Q^uPreH*S49 zId#LzvSl-qwNgozinG}WLm-t*tg_{~gcW07n2Rf>nPjsAY%UpNvzPkWM8cfQnrtZ@ zn_D#5YHBINqN((%499<8&A%li7sobxyAe8Tya*v04&^Vsby~KfiMLVz8u=T@Z&}eS z=^MyN{{cCz=P&P%ja)_ktGD8Rcq_g$GCD>0{o$*Vv=ilMJTs5H2Dp<91wl5a$8KE9 z#wS`nbxq41*R}lY=WX)eTJC&F$l})dQ5#NuK+g=->J&M9W+04mPWa%90p&v1#R=#h cUrCx7mNB!qSy8iVIGtuw)`A&h<4cSG0Paa_uK)l5 diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp deleted file mode 100644 index 3f826e5d..00000000 --- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -// (these functions are in their own file because of problems including windows.h -// at the same time as the Digi headers) - -#define _DO_NOT_DECLARE_INTERLOCKED_INTRINSICS_IN_MEMORY // (workaround for a VC build problem) - -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0500 -#undef STRICT -#define STRICT -#include -#include - -#pragma pack (push, 8) -#include "../utility/juce_IncludeModuleHeaders.h" -#pragma pack (pop) - -//============================================================================== -void JUCE_CALLTYPE attachSubWindow (void* hostWindow, - int& titleW, int& titleH, - Component* comp) -{ - using namespace juce; - - RECT clientRect; - GetClientRect ((HWND) hostWindow, &clientRect); - - titleW = clientRect.right - clientRect.left; - titleH = jmax (0, (int) (clientRect.bottom - clientRect.top) - comp->getHeight()); - comp->setTopLeftPosition (0, titleH); - - comp->addToDesktop (0); - - HWND plugWnd = (HWND) comp->getWindowHandle(); - SetParent (plugWnd, (HWND) hostWindow); - - DWORD val = GetWindowLong (plugWnd, GWL_STYLE); - val = (val & ~WS_POPUP) | WS_CHILD; - SetWindowLong (plugWnd, GWL_STYLE, val); - - val = GetWindowLong ((HWND) hostWindow, GWL_STYLE); - SetWindowLong ((HWND) hostWindow, GWL_STYLE, val | WS_CLIPCHILDREN); -} - -void JUCE_CALLTYPE resizeHostWindow (void* hostWindow, - int& titleW, int& titleH, - Component* comp) -{ - using namespace juce; - - RECT clientRect, windowRect; - GetClientRect ((HWND) hostWindow, &clientRect); - GetWindowRect ((HWND) hostWindow, &windowRect); - const int borderW = (windowRect.right - windowRect.left) - (clientRect.right - clientRect.left); - const int borderH = (windowRect.bottom - windowRect.top) - (clientRect.bottom - clientRect.top); - - SetWindowPos ((HWND) hostWindow, 0, 0, 0, - borderW + jmax (titleW, comp->getWidth()), - borderH + comp->getHeight() + titleH, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); -} - -extern "C" BOOL WINAPI DllMainRTAS (HINSTANCE, DWORD, LPVOID); - -extern "C" BOOL WINAPI DllMain (HINSTANCE instance, DWORD reason, LPVOID reserved) -{ - if (reason == DLL_PROCESS_ATTACH) - juce::Process::setCurrentModuleInstanceHandle (instance); - - if (GetModuleHandleA ("DAE.DLL") != 0) - return DllMainRTAS (instance, reason, reserved); - - juce::ignoreUnused (reserved); - return TRUE; -} - -#if ! JucePlugin_EditorRequiresKeyboardFocus - -namespace -{ - HWND findMDIParentOf (HWND w) - { - const int frameThickness = GetSystemMetrics (SM_CYFIXEDFRAME); - - while (w != 0) - { - HWND parent = GetParent (w); - - if (parent == 0) - break; - - TCHAR windowType [32] = { 0 }; - GetClassName (parent, windowType, 31); - - if (juce::String (windowType).equalsIgnoreCase ("MDIClient")) - { - w = parent; - break; - } - - RECT windowPos, parentPos; - GetWindowRect (w, &windowPos); - GetWindowRect (parent, &parentPos); - - int dw = (parentPos.right - parentPos.left) - (windowPos.right - windowPos.left); - int dh = (parentPos.bottom - parentPos.top) - (windowPos.bottom - windowPos.top); - - if (dw > 100 || dh > 100) - break; - - w = parent; - - if (dw == 2 * frameThickness) - break; - } - - return w; - } -} - -void JUCE_CALLTYPE passFocusToHostWindow (void* hostWindow) -{ - SetFocus (findMDIParentOf ((HWND) hostWindow)); -} - -#endif - -#endif diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp deleted file mode 100644 index 91a49867..00000000 --- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp +++ /dev/null @@ -1,1061 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include -#include -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -#ifdef _MSC_VER - // (this is a workaround for a build problem in VC9) - #define _DO_NOT_DECLARE_INTERLOCKED_INTRINSICS_IN_MEMORY - #include - - #ifndef JucePlugin_WinBag_path - #error "You need to define the JucePlugin_WinBag_path value!" - #endif -#endif - -#include "juce_RTAS_DigiCode_Header.h" - -#ifdef _MSC_VER - #include -#endif - -JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Widiomatic-parentheses", - "-Wnon-virtual-dtor", - "-Wcomment") - -/* Note about include paths - ------------------------ - - To be able to include all the Digidesign headers correctly, you'll need to add this - lot to your include path: - - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\EffectClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Utilities - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\RTASP_Adapt - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\CoreClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Controls - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Meters - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ViewClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\DSPClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\common - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\common\Platform - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\SignalProcessing\Public - C:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugIns\DSPManager\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\SADriver\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\DigiPublic\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\Fic\Interfaces\DAEClient - c:\yourdirectory\PT_80_SDK\AlturaPorts\NewFileLibs\Cmn - c:\yourdirectory\PT_80_SDK\AlturaPorts\NewFileLibs\DOA - c:\yourdirectory\PT_80_SDK\AlturaPorts\AlturaSource\PPC_H - c:\yourdirectory\PT_80_SDK\AlturaPorts\AlturaSource\AppSupport - c:\yourdirectory\PT_80_SDK\AlturaPorts\DigiPublic - c:\yourdirectory\PT_80_SDK\AvidCode\AVX2sdk\AVX\avx2\avx2sdk\inc - c:\yourdirectory\PT_80_SDK\xplat\AVX\avx2\avx2sdk\inc - - NB. If you hit a huge pile of bugs around here, make sure that you've not got the - Apple QuickTime headers before the PT headers in your path, because there are - some filename clashes between them. - -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -JUCE_END_IGNORE_WARNINGS_GCC_LIKE - -//============================================================================== -JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4263 4264 4250) - -#include "../utility/juce_IncludeModuleHeaders.h" - -#ifdef _MSC_VER - #pragma pack (pop) - - // This JUCE_RTAS_LINK_TO_DEBUG_LIB setting can be used to force linkage - // against only the release build of the RTAS lib, since in older SDKs there - // can be problems with the debug build. - #if JUCE_DEBUG && ! defined (JUCE_RTAS_LINK_TO_DEBUG_LIB) - #define JUCE_RTAS_LINK_TO_DEBUG_LIB 1 - #endif - - #if JUCE_RTAS_LINK_TO_DEBUG_LIB - #define PT_LIB_PATH JucePlugin_WinBag_path "\\Debug\\lib\\" - #else - #define PT_LIB_PATH JucePlugin_WinBag_path "\\Release\\lib\\" - #endif - - #pragma comment(lib, PT_LIB_PATH "DAE.lib") - #pragma comment(lib, PT_LIB_PATH "DigiExt.lib") - #pragma comment(lib, PT_LIB_PATH "DSI.lib") - #pragma comment(lib, PT_LIB_PATH "PluginLib.lib") - #pragma comment(lib, PT_LIB_PATH "DSPManager.lib") - #pragma comment(lib, PT_LIB_PATH "DSPManagerClientLib.lib") - #pragma comment(lib, PT_LIB_PATH "RTASClientLib.lib") -#endif - -#undef MemoryBlock - -//============================================================================== -#if JUCE_WINDOWS - extern void JUCE_CALLTYPE attachSubWindow (void* hostWindow, int& titleW, int& titleH, Component* comp); - extern void JUCE_CALLTYPE resizeHostWindow (void* hostWindow, int& titleW, int& titleH, Component* comp); - #if ! JucePlugin_EditorRequiresKeyboardFocus - extern void JUCE_CALLTYPE passFocusToHostWindow (void* hostWindow); - #endif -#else - extern void* attachSubWindow (void* hostWindowRef, Component* comp); - extern void removeSubWindow (void* nsWindow, Component* comp); - extern void forwardCurrentKeyEventToHostWindow(); -#endif - -#if ! (JUCE_DEBUG || defined (JUCE_RTAS_PLUGINGESTALT_IS_CACHEABLE)) - #define JUCE_RTAS_PLUGINGESTALT_IS_CACHEABLE 1 -#endif - -const int midiBufferSize = 1024; -const OSType juceChunkType = 'juce'; -static const int bypassControlIndex = 1; - -static int numInstances = 0; - -using namespace juce; - -//============================================================================== -class JucePlugInProcess : public CEffectProcessMIDI, - public CEffectProcessRTAS, - public AudioProcessorListener, - public AudioPlayHead -{ -public: - //============================================================================== - [[deprecated ("RTAS builds will be removed from JUCE in the next release.")]] - JucePlugInProcess() - { - juceFilter.reset (createPluginFilterOfType (AudioProcessor::wrapperType_RTAS)); - - AddChunk (juceChunkType, "Juce Audio Plugin Data"); - - ++numInstances; - } - - ~JucePlugInProcess() - { - JUCE_AUTORELEASEPOOL - { - if (mLoggedIn) - MIDILogOut(); - - midiBufferNode.reset(); - midiTransport.reset(); - - if (juceFilter != nullptr) - { - juceFilter->releaseResources(); - juceFilter.reset(); - } - - if (--numInstances == 0) - { - #if JUCE_MAC - // Hack to allow any NSWindows to clear themselves up before returning to PT.. - for (int i = 20; --i >= 0;) - MessageManager::getInstance()->runDispatchLoopUntil (1); - #endif - - shutdownJuce_GUI(); - } - } - } - - //============================================================================== - class JuceCustomUIView : public CCustomView, - public Timer - { - public: - //============================================================================== - JuceCustomUIView (AudioProcessor* ap, JucePlugInProcess* p) - : filter (ap), process (p) - { - // setting the size in here crashes PT for some reason, so keep it simple.. - } - - ~JuceCustomUIView() - { - deleteEditorComp(); - } - - //============================================================================== - void updateSize() - { - if (editorComp == nullptr) - { - editorComp.reset (filter->createEditorIfNeeded()); - jassert (editorComp != nullptr); - } - - if (editorComp->getWidth() != 0 && editorComp->getHeight() != 0) - { - Rect oldRect; - GetRect (&oldRect); - - Rect r; - r.left = 0; - r.top = 0; - r.right = editorComp->getWidth(); - r.bottom = editorComp->getHeight(); - SetRect (&r); - - if (oldRect.right != r.right || oldRect.bottom != r.bottom) - startTimer (50); - } - } - - void timerCallback() override - { - if (! Component::isMouseButtonDownAnywhere()) - { - stopTimer(); - - // Send a token to the host to tell it about the resize - SSetProcessWindowResizeToken token (process->fRootNameId, process->fRootNameId); - FicSDSDispatchToken (&token); - } - } - - void attachToWindow (GrafPtr port) - { - if (port != 0) - { - JUCE_AUTORELEASEPOOL - { - updateSize(); - - #if JUCE_WINDOWS - auto hostWindow = (void*) ASI_GethWnd ((WindowPtr) port); - #else - auto hostWindow = (void*) GetWindowFromPort (port); - #endif - wrapper.reset(); - wrapper.reset (new EditorCompWrapper (hostWindow, editorComp.get(), this)); - } - } - else - { - deleteEditorComp(); - } - } - - void DrawContents (Rect*) override - { - #if JUCE_WINDOWS - if (wrapper != nullptr) - if (auto peer = wrapper->getPeer()) - peer->repaint (wrapper->getLocalBounds()); // (seems to be required in PT6.4, but not in 7.x) - #endif - } - - void DrawBackground (Rect*) override {} - - //============================================================================== - private: - AudioProcessor* const filter; - JucePlugInProcess* const process; - std::unique_ptr wrapper; - std::unique_ptr editorComp; - - void deleteEditorComp() - { - if (editorComp != nullptr || wrapper != nullptr) - { - JUCE_AUTORELEASEPOOL - { - PopupMenu::dismissAllActiveMenus(); - - if (Component* const modalComponent = Component::getCurrentlyModalComponent()) - modalComponent->exitModalState (0); - - filter->editorBeingDeleted (editorComp.get()); - - editorComp.reset(); - wrapper.reset(); - } - } - } - - //============================================================================== - // A component to hold the AudioProcessorEditor, and cope with some housekeeping - // chores when it changes or repaints. - class EditorCompWrapper : public Component - #if ! JUCE_MAC - , public FocusChangeListener - #endif - { - public: - EditorCompWrapper (void* hostWindow_, - Component* editorComp, - JuceCustomUIView* owner_) - : hostWindow (hostWindow_), - owner (owner_), - titleW (0), - titleH (0) - { - #if ! JucePlugin_EditorRequiresKeyboardFocus - setMouseClickGrabsKeyboardFocus (false); - setWantsKeyboardFocus (false); - #endif - setOpaque (true); - setBroughtToFrontOnMouseClick (true); - setBounds (editorComp->getBounds()); - editorComp->setTopLeftPosition (0, 0); - addAndMakeVisible (*editorComp); - - #if JUCE_WINDOWS - attachSubWindow (hostWindow, titleW, titleH, this); - #else - nsWindow = attachSubWindow (hostWindow, this); - #endif - setVisible (true); - - #if JUCE_WINDOWS && ! JucePlugin_EditorRequiresKeyboardFocus - Desktop::getInstance().addFocusChangeListener (this); - #endif - } - - ~EditorCompWrapper() - { - removeChildComponent (getEditor()); - - #if JUCE_WINDOWS && ! JucePlugin_EditorRequiresKeyboardFocus - Desktop::getInstance().removeFocusChangeListener (this); - #endif - - #if JUCE_MAC - removeSubWindow (nsWindow, this); - #endif - } - - void paint (Graphics&) override {} - - void resized() override - { - if (Component* const ed = getEditor()) - ed->setBounds (getLocalBounds()); - - repaint(); - } - - #if JUCE_WINDOWS - void globalFocusChanged (Component*) override - { - #if ! JucePlugin_EditorRequiresKeyboardFocus - if (hasKeyboardFocus (true)) - passFocusToHostWindow (hostWindow); - #endif - } - #endif - - void childBoundsChanged (Component* child) override - { - setSize (child->getWidth(), child->getHeight()); - child->setTopLeftPosition (0, 0); - - #if JUCE_WINDOWS - resizeHostWindow (hostWindow, titleW, titleH, this); - #endif - owner->updateSize(); - } - - void userTriedToCloseWindow() override {} - - #if JUCE_MAC && JucePlugin_EditorRequiresKeyboardFocus - bool keyPressed (const KeyPress& kp) override - { - owner->updateSize(); - forwardCurrentKeyEventToHostWindow(); - return true; - } - #endif - - private: - //============================================================================== - void* const hostWindow; - void* nsWindow; - JuceCustomUIView* const owner; - int titleW, titleH; - - Component* getEditor() const { return getChildComponent (0); } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EditorCompWrapper) - }; - }; - - JuceCustomUIView* getView() const - { - return dynamic_cast (fOurPlugInView); - } - - void GetViewRect (Rect* size) override - { - if (JuceCustomUIView* const v = getView()) - v->updateSize(); - - CEffectProcessRTAS::GetViewRect (size); - } - - CPlugInView* CreateCPlugInView() override - { - return new JuceCustomUIView (juceFilter.get(), this); - } - - void SetViewPort (GrafPtr port) override - { - CEffectProcessRTAS::SetViewPort (port); - - if (JuceCustomUIView* const v = getView()) - v->attachToWindow (port); - } - - //============================================================================== - ComponentResult GetDelaySamplesLong (long* aNumSamples) override - { - if (aNumSamples != nullptr) - *aNumSamples = juceFilter != nullptr ? juceFilter->getLatencySamples() : 0; - - return noErr; - } - - //============================================================================== - void EffectInit() override - { - sampleRate = (double) GetSampleRate(); - jassert (sampleRate > 0); - const int maxBlockSize = (int) CEffectProcessRTAS::GetMaximumRTASQuantum(); - jassert (maxBlockSize > 0); - - SFicPlugInStemFormats stems; - GetProcessType()->GetStemFormats (&stems); - - juceFilter->setPlayConfigDetails (fNumInputs, fNumOutputs, sampleRate, maxBlockSize); - - AddControl (new CPluginControl_OnOff ('bypa', "Master Bypass\nMastrByp\nMByp\nByp", false, true)); - DefineMasterBypassControlIndex (bypassControlIndex); - - const int numParameters = juceFilter->getNumParameters(); - - #if JUCE_FORCE_USE_LEGACY_PARAM_IDS - const bool usingManagedParameters = false; - #else - const bool usingManagedParameters = (juceFilter->getParameters().size() == numParameters); - #endif - - for (int i = 0; i < numParameters; ++i) - { - OSType rtasParamID = static_cast (usingManagedParameters ? juceFilter->getParameterID (i).hashCode() : i); - AddControl (new JucePluginControl (*juceFilter, i, rtasParamID)); - } - - // we need to do this midi log-in to get timecode, regardless of whether - // the plugin actually uses midi... - if (MIDILogIn() == noErr) - { - #if JucePlugin_WantsMidiInput - if (CEffectType* const type = dynamic_cast (this->GetProcessType())) - { - char nodeName[80] = { 0 }; - type->GetProcessTypeName (63, nodeName); - nodeName[nodeName[0] + 1] = 0; - - midiBufferNode.reset (new CEffectMIDIOtherBufferedNode (&mMIDIWorld, - 8192, - eLocalNode, - nodeName + 1, - midiBuffer)); - - midiBufferNode->Initialize (0xffff, true); - } - #endif - } - - midiTransport.reset (new CEffectMIDITransport (&mMIDIWorld)); - midiEvents.ensureSize (2048); - - channels.calloc (jmax (juceFilter->getTotalNumInputChannels(), - juceFilter->getTotalNumOutputChannels())); - - juceFilter->setPlayHead (this); - juceFilter->addListener (this); - - juceFilter->prepareToPlay (sampleRate, maxBlockSize); - } - - void RenderAudio (float** inputs, float** outputs, long numSamples) override - { - #if JucePlugin_WantsMidiInput - midiEvents.clear(); - - const Cmn_UInt32 bufferSize = mRTGlobals->mHWBufferSizeInSamples; - - if (midiBufferNode != nullptr) - { - if (midiBufferNode->GetAdvanceScheduleTime() != bufferSize) - midiBufferNode->SetAdvanceScheduleTime (bufferSize); - - if (midiBufferNode->FillMIDIBuffer (mRTGlobals->mRunningTime, numSamples) == noErr) - { - jassert (midiBufferNode->GetBufferPtr() != nullptr); - const int numMidiEvents = midiBufferNode->GetBufferSize(); - - for (int i = 0; i < numMidiEvents; ++i) - { - const DirectMidiPacket& m = midiBuffer[i]; - - jassert ((int) m.mTimestamp < numSamples); - - midiEvents.addEvent (m.mData, m.mLength, - jlimit (0, (int) numSamples - 1, (int) m.mTimestamp)); - } - } - } - #endif - - #if JUCE_DEBUG || JUCE_LOG_ASSERTIONS - const int numMidiEventsComingIn = midiEvents.getNumEvents(); - ignoreUnused (numMidiEventsComingIn); - #endif - - { - const ScopedLock sl (juceFilter->getCallbackLock()); - - const int numIn = juceFilter->getTotalNumInputChannels(); - const int numOut = juceFilter->getTotalNumOutputChannels(); - const int totalChans = jmax (numIn, numOut); - - if (juceFilter->isSuspended()) - { - for (int i = 0; i < numOut; ++i) - FloatVectorOperations::clear (outputs [i], numSamples); - } - else - { - { - int i; - for (i = 0; i < numOut; ++i) - { - channels[i] = outputs [i]; - - if (i < numIn && inputs != outputs) - FloatVectorOperations::copy (outputs [i], inputs[i], numSamples); - } - - for (; i < numIn; ++i) - channels [i] = inputs [i]; - } - - AudioBuffer chans (channels, totalChans, numSamples); - - if (mBypassed && juceFilter->getBypassParameter() == nullptr) - juceFilter->processBlockBypassed (chans, midiEvents); - else - juceFilter->processBlock (chans, midiEvents); - } - } - - if (! midiEvents.isEmpty()) - { - #if JucePlugin_ProducesMidiOutput - for (const auto metadata : midiEvents) - { - //jassert (metadata.samplePosition >= 0 && metadata.samplePosition < (int) numSamples); - } - #elif JUCE_DEBUG || JUCE_LOG_ASSERTIONS - // if your plugin creates midi messages, you'll need to set - // the JucePlugin_ProducesMidiOutput macro to 1 in your - // JucePluginCharacteristics.h file - jassert (midiEvents.getNumEvents() <= numMidiEventsComingIn); - #endif - - midiEvents.clear(); - } - } - - //============================================================================== - ComponentResult GetChunkSize (OSType chunkID, long* size) override - { - if (chunkID == juceChunkType) - { - tempFilterData.reset(); - juceFilter->getStateInformation (tempFilterData); - - *size = sizeof (SFicPlugInChunkHeader) + tempFilterData.getSize(); - return noErr; - } - - return CEffectProcessMIDI::GetChunkSize (chunkID, size); - } - - ComponentResult GetChunk (OSType chunkID, SFicPlugInChunk* chunk) override - { - if (chunkID == juceChunkType) - { - if (tempFilterData.getSize() == 0) - juceFilter->getStateInformation (tempFilterData); - - chunk->fSize = sizeof (SFicPlugInChunkHeader) + tempFilterData.getSize(); - tempFilterData.copyTo ((void*) chunk->fData, 0, tempFilterData.getSize()); - - tempFilterData.reset(); - - return noErr; - } - - return CEffectProcessMIDI::GetChunk (chunkID, chunk); - } - - ComponentResult SetChunk (OSType chunkID, SFicPlugInChunk* chunk) override - { - if (chunkID == juceChunkType) - { - tempFilterData.reset(); - - if (chunk->fSize - sizeof (SFicPlugInChunkHeader) > 0) - { - juceFilter->setStateInformation ((void*) chunk->fData, - chunk->fSize - sizeof (SFicPlugInChunkHeader)); - } - - return noErr; - } - - return CEffectProcessMIDI::SetChunk (chunkID, chunk); - } - - //============================================================================== - ComponentResult UpdateControlValue (long controlIndex, long value) override - { - if (controlIndex != bypassControlIndex) - { - auto paramIndex = controlIndex - 2; - auto floatValue = longToFloat (value); - - if (auto* param = juceFilter->getParameters()[paramIndex]) - { - param->setValue (floatValue); - param->sendValueChangedMessageToListeners (floatValue); - } - else - { - juceFilter->setParameter (paramIndex, floatValue); - } - } - else - { - mBypassed = (value > 0); - - if (auto* param = juceFilter->getBypassParameter()) - if (mBypassed != (param->getValue() >= 0.5f)) - param.setValueNotifyingHost (mBypassed ? 1.0f : 0.0f); - } - - return CProcess::UpdateControlValue (controlIndex, value); - } - - #if JUCE_WINDOWS - Boolean HandleKeystroke (EventRecord* e) override - { - if (Component* modalComp = Component::getCurrentlyModalComponent()) - { - if (Component* focused = modalComp->getCurrentlyFocusedComponent()) - { - switch (e->message & charCodeMask) - { - case kReturnCharCode: - case kEnterCharCode: focused->keyPressed (KeyPress (KeyPress::returnKey)); break; - case kEscapeCharCode: focused->keyPressed (KeyPress (KeyPress::escapeKey)); break; - default: break; - } - - return true; - } - } - - return false; - } - #endif - - //============================================================================== - bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) override - { - Cmn_Float64 bpm = 120.0; - Cmn_Int32 num = 4, denom = 4; - Cmn_Int64 ticks = 0; - Cmn_Bool isPlaying = false; - - if (midiTransport != nullptr) - { - midiTransport->GetCurrentTempo (&bpm); - midiTransport->IsTransportPlaying (&isPlaying); - midiTransport->GetCurrentMeter (&num, &denom); - - // (The following is a work-around because GetCurrentTickPosition() doesn't work correctly). - Cmn_Int64 sampleLocation; - - if (isPlaying) - midiTransport->GetCurrentRTASSampleLocation (&sampleLocation); - else - midiTransport->GetCurrentTDMSampleLocation (&sampleLocation); - - midiTransport->GetCustomTickPosition (&ticks, sampleLocation); - - info.timeInSamples = (int64) sampleLocation; - info.timeInSeconds = sampleLocation / sampleRate; - } - else - { - info.timeInSamples = 0; - info.timeInSeconds = 0; - } - - info.bpm = bpm; - info.timeSigNumerator = num; - info.timeSigDenominator = denom; - info.isPlaying = isPlaying; - info.isRecording = false; - info.ppqPosition = ticks / 960000.0; - info.ppqPositionOfLastBarStart = 0; //xxx no idea how to get this correctly.. - info.isLooping = false; - info.ppqLoopStart = 0; - info.ppqLoopEnd = 0; - - info.frameRate = [this] - { - switch (fTimeCodeInfo.mFrameRate) - { - case ficFrameRate_24Frame: return FrameRate().withBaseRate (24); - case ficFrameRate_23976: return FrameRate().withBaseRate (24).withPullDown(); - case ficFrameRate_25Frame: return FrameRate().withBaseRate (25); - case ficFrameRate_30NonDrop: return FrameRate().withBaseRate (30); - case ficFrameRate_30DropFrame: return FrameRate().withBaseRate (30).withDrop(); - case ficFrameRate_2997NonDrop: return FrameRate().withBaseRate (30).withPullDown(); - case ficFrameRate_2997DropFrame: return FrameRate().withBaseRate (30).withPullDown().withDrop(); - } - - return FrameRate(); - }(); - - const auto effectiveRate = info.frameRate.getEffectiveRate(); - info.editOriginTime = effectiveRate != 0.0 ? fTimeCodeInfo.mFrameOffset / effectiveRate : 0.0; - - return true; - } - - void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) override - { - SetControlValue (index + 2, floatToLong (newValue)); - } - - void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) override - { - TouchControl (index + 2); - } - - void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) override - { - ReleaseControl (index + 2); - } - - void audioProcessorChanged (AudioProcessor*, const ChangeDetails&) override - { - // xxx is there an RTAS equivalent? - } - -private: - std::unique_ptr juceFilter; - MidiBuffer midiEvents; - std::unique_ptr midiBufferNode; - std::unique_ptr midiTransport; - DirectMidiPacket midiBuffer [midiBufferSize]; - - juce::MemoryBlock tempFilterData; - HeapBlock channels; - double sampleRate = 44100.0; - - static float longToFloat (const long n) noexcept - { - return (float) ((((double) n) + (double) 0x80000000) / (double) 0xffffffff); - } - - static long floatToLong (const float n) noexcept - { - return roundToInt (jlimit (-(double) 0x80000000, (double) 0x7fffffff, - n * (double) 0xffffffff - (double) 0x80000000)); - } - - void bypassBuffers (float** const inputs, float** const outputs, const long numSamples) const - { - for (int i = fNumOutputs; --i >= 0;) - { - if (i < fNumInputs) - FloatVectorOperations::copy (outputs[i], inputs[i], numSamples); - else - FloatVectorOperations::clear (outputs[i], numSamples); - } - } - - //============================================================================== - class JucePluginControl : public CPluginControl - { - public: - //============================================================================== - JucePluginControl (AudioProcessor& p, const int i, OSType rtasParamID) - : processor (p), index (i), paramID (rtasParamID) - { - CPluginControl::SetValue (GetDefaultValue()); - } - - //============================================================================== - OSType GetID() const { return paramID; } - long GetDefaultValue() const { return floatToLong (processor.getParameterDefaultValue (index)); } - void SetDefaultValue (long) {} - long GetNumSteps() const { return processor.getParameterNumSteps (index); } - - long ConvertStringToValue (const char* valueString) const - { - return floatToLong (String (valueString).getFloatValue()); - } - - Cmn_Bool IsKeyValid (long key) const { return true; } - - void GetNameOfLength (char* name, int maxLength, OSType inControllerType) const - { - // Pro-tools expects all your parameters to have valid names! - jassert (processor.getParameterName (index, maxLength).isNotEmpty()); - - processor.getParameterName (index, maxLength).copyToUTF8 (name, (size_t) maxLength + 1); - } - - long GetPriority() const { return kFicCooperativeTaskPriority; } - - long GetOrientation() const - { - return processor.isParameterOrientationInverted (index) - ? kDAE_RightMinLeftMax | kDAE_TopMinBottomMax | kDAE_RotarySingleDotMode | kDAE_RotaryRightMinLeftMax - : kDAE_LeftMinRightMax | kDAE_BottomMinTopMax | kDAE_RotarySingleDotMode | kDAE_RotaryLeftMinRightMax; - } - - long GetControlType() const { return kDAE_ContinuousValues; } - - void GetValueString (char* valueString, int maxLength, long value) const - { - processor.getParameterText (index, maxLength).copyToUTF8 (valueString, (size_t) maxLength + 1); - } - - Cmn_Bool IsAutomatable() const - { - return processor.isParameterAutomatable (index); - } - - private: - //============================================================================== - AudioProcessor& processor; - const int index; - const OSType paramID; - - JUCE_DECLARE_NON_COPYABLE (JucePluginControl) - }; -}; - -//============================================================================== -class JucePlugInGroup : public CEffectGroupMIDI -{ -public: - //============================================================================== - JucePlugInGroup() - { - DefineManufacturerNamesAndID (JucePlugin_Manufacturer, JucePlugin_RTASManufacturerCode); - DefinePlugInNamesAndVersion (createRTASName().toUTF8(), JucePlugin_VersionCode); - - #if JUCE_RTAS_PLUGINGESTALT_IS_CACHEABLE - AddGestalt (pluginGestalt_IsCacheable); - #endif - } - - ~JucePlugInGroup() - { - shutdownJuce_GUI(); - } - - static AudioChannelSet rtasChannelSet (int numChannels) - { - if (numChannels == 0) return AudioChannelSet::disabled(); - if (numChannels == 1) return AudioChannelSet::mono(); - if (numChannels == 2) return AudioChannelSet::stereo(); - if (numChannels == 3) return AudioChannelSet::createLCR(); - if (numChannels == 4) return AudioChannelSet::quadraphonic(); - if (numChannels == 5) return AudioChannelSet::create5point0(); - if (numChannels == 6) return AudioChannelSet::create5point1(); - - #if PT_VERS_MAJOR >= 9 - if (numChannels == 7) return AudioChannelSet::create7point0(); - if (numChannels == 8) return AudioChannelSet::create7point1(); - #else - if (numChannels == 7) return AudioChannelSet::create7point0SDDS(); - if (numChannels == 8) return AudioChannelSet::create7point1SDDS(); - #endif - - jassertfalse; - - return AudioChannelSet::discreteChannels (numChannels); - } - - //============================================================================== - void CreateEffectTypes() - { - std::unique_ptr plugin (createPluginFilterOfType (AudioProcessor::wrapperType_RTAS)); - - #ifndef JucePlugin_PreferredChannelConfigurations - #error You need to set the "Plugin Channel Configurations" field in the Projucer to build RTAS plug-ins - #endif - - const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; - const int numConfigs = numElementsInArray (channelConfigs); - - // You need to actually add some configurations to the JucePlugin_PreferredChannelConfigurations - // value in your JucePluginCharacteristics.h file.. - jassert (numConfigs > 0); - - for (int i = 0; i < numConfigs; ++i) - { - if (channelConfigs[i][0] <= 8 && channelConfigs[i][1] <= 8) - { - const AudioChannelSet inputLayout (rtasChannelSet (channelConfigs[i][0])); - const AudioChannelSet outputLayout (rtasChannelSet (channelConfigs[i][1])); - - const int32 pluginId = plugin->getAAXPluginIDForMainBusConfig (inputLayout, outputLayout, false); - - CEffectType* const type - = new CEffectTypeRTAS (pluginId, - JucePlugin_RTASProductId, - JucePlugin_RTASCategory); - - type->DefineTypeNames (createRTASName().toRawUTF8()); - type->DefineSampleRateSupport (eSupports48kAnd96kAnd192k); - - type->DefineStemFormats (getFormatForChans (channelConfigs [i][0] != 0 ? channelConfigs [i][0] : channelConfigs [i][1]), - getFormatForChans (channelConfigs [i][1] != 0 ? channelConfigs [i][1] : channelConfigs [i][0])); - - #if ! JucePlugin_RTASDisableBypass - type->AddGestalt (pluginGestalt_CanBypass); - #endif - - #if JucePlugin_RTASDisableMultiMono - type->AddGestalt (pluginGestalt_DoesntSupportMultiMono); - #endif - - type->AddGestalt (pluginGestalt_SupportsVariableQuanta); - type->AttachEffectProcessCreator (createNewProcess); - - AddEffectType (type); - } - } - } - - void Initialize() - { - CEffectGroupMIDI::Initialize(); - } - - //============================================================================== -private: - static CEffectProcess* createNewProcess() - { - #if JUCE_WINDOWS - Process::setCurrentModuleInstanceHandle (gThisModule); - #endif - PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_RTAS; - initialiseJuce_GUI(); - - return new JucePlugInProcess(); - } - - static String createRTASName() - { - return String (JucePlugin_Name) + "\n" - + String (JucePlugin_Desc); - } - - static EPlugIn_StemFormat getFormatForChans (const int numChans) noexcept - { - switch (numChans) - { - case 0: return ePlugIn_StemFormat_Generic; - case 1: return ePlugIn_StemFormat_Mono; - case 2: return ePlugIn_StemFormat_Stereo; - case 3: return ePlugIn_StemFormat_LCR; - case 4: return ePlugIn_StemFormat_Quad; - case 5: return ePlugIn_StemFormat_5dot0; - case 6: return ePlugIn_StemFormat_5dot1; - - #if PT_VERS_MAJOR >= 9 - case 7: return ePlugIn_StemFormat_7dot0DTS; - case 8: return ePlugIn_StemFormat_7dot1DTS; - #else - case 7: return ePlugIn_StemFormat_7dot0; - case 8: return ePlugIn_StemFormat_7dot1; - #endif - - default: jassertfalse; break; // hmm - not a valid number of chans for RTAS.. - } - - return ePlugIn_StemFormat_Generic; - } -}; - -void initialiseMacRTAS(); - -CProcessGroupInterface* CProcessGroup::CreateProcessGroup() -{ - #if JUCE_MAC - initialiseMacRTAS(); - #endif - - return new JucePlugInGroup(); -} - -JUCE_END_IGNORE_WARNINGS_MSVC - -#endif diff --git a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp index 8d65094b..009707ec 100644 --- a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp +++ b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -139,6 +139,8 @@ protected: #if JucePlugin_Build_Standalone && JUCE_IOS +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") + using namespace juce; bool JUCE_CALLTYPE juce_isInterAppAudioConnected() @@ -162,6 +164,9 @@ Image JUCE_CALLTYPE juce_getIAAHostIcon (int size) return Image(); } + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + #endif #endif diff --git a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h index 85ffae7d..05842cc5 100644 --- a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h +++ b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -448,11 +448,12 @@ private: inner.audioDeviceAboutToStart (device); } - void audioDeviceIOCallback (const float** inputChannelData, - int numInputChannels, - float** outputChannelData, - int numOutputChannels, - int numSamples) override + void audioDeviceIOCallbackWithContext (const float** inputChannelData, + int numInputChannels, + float** outputChannelData, + int numOutputChannels, + int numSamples, + const AudioIODeviceCallbackContext& context) override { jassertquiet ((int) storedInputChannels.size() == numInputChannels); jassertquiet ((int) storedOutputChannels.size() == numOutputChannels); @@ -466,11 +467,12 @@ private: initChannelPointers (inputChannelData, storedInputChannels, position); initChannelPointers (outputChannelData, storedOutputChannels, position); - inner.audioDeviceIOCallback (storedInputChannels.data(), - (int) storedInputChannels.size(), - storedOutputChannels.data(), - (int) storedOutputChannels.size(), - blockLength); + inner.audioDeviceIOCallbackWithContext (storedInputChannels.data(), + (int) storedInputChannels.size(), + storedOutputChannels.data(), + (int) storedOutputChannels.size(), + blockLength, + context); position += blockLength; } @@ -598,11 +600,12 @@ private: }; //============================================================================== - void audioDeviceIOCallback (const float** inputChannelData, - int numInputChannels, - float** outputChannelData, - int numOutputChannels, - int numSamples) override + void audioDeviceIOCallbackWithContext (const float** inputChannelData, + int numInputChannels, + float** outputChannelData, + int numOutputChannels, + int numSamples, + const AudioIODeviceCallbackContext& context) override { if (muteInput) { @@ -610,8 +613,12 @@ private: inputChannelData = emptyBuffer.getArrayOfReadPointers(); } - player.audioDeviceIOCallback (inputChannelData, numInputChannels, - outputChannelData, numOutputChannels, numSamples); + player.audioDeviceIOCallbackWithContext (inputChannelData, + numInputChannels, + outputChannelData, + numOutputChannels, + numSamples, + context); } void audioDeviceAboutToStart (AudioIODevice* device) override @@ -940,11 +947,17 @@ private: BorderSize computeBorder() const { - const auto outer = owner.getContentComponentBorder(); - return { outer.getTop() + (shouldShowNotification ? NotificationArea::height : 0), - outer.getLeft(), - outer.getBottom(), - outer.getRight() }; + const auto nativeFrame = [&]() -> BorderSize + { + if (auto* peer = owner.getPeer()) + if (const auto frameSize = peer->getFrameSizeIfPresent()) + return *frameSize; + + return {}; + }(); + + return nativeFrame.addedTo (owner.getContentComponentBorder()) + .addedTo (BorderSize { shouldShowNotification ? NotificationArea::height : 0, 0, 0, 0 }); } private: diff --git a/modules/juce_audio_plugin_client/Unity/juce_UnityPluginInterface.h b/modules/juce_audio_plugin_client/Unity/juce_UnityPluginInterface.h index be2c9ecc..6bdcdcbe 100644 --- a/modules/juce_audio_plugin_client/Unity/juce_UnityPluginInterface.h +++ b/modules/juce_audio_plugin_client/Unity/juce_UnityPluginInterface.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp b/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp index 7aae5b91..47dfef29 100644 --- a/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -286,7 +286,7 @@ private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UnityPeer) }; -ComponentPeer* createUnityPeer (Component& c) { return new UnityPeer (c); } +static ComponentPeer* createUnityPeer (Component& c) { return new UnityPeer (c); } //============================================================================== class AudioProcessorUnityWrapper @@ -493,7 +493,7 @@ private: }; //============================================================================== -HashMap& getWrapperMap() +static HashMap& getWrapperMap() { static HashMap wrapperMap; return wrapperMap; @@ -512,7 +512,7 @@ static void onWrapperDeletion (AudioProcessorUnityWrapper* wrapperToRemove) //============================================================================== namespace UnityCallbacks { - int UNITY_INTERFACE_API createCallback (UnityAudioEffectState* state) + static int UNITY_INTERFACE_API createCallback (UnityAudioEffectState* state) { auto* pluginInstance = new AudioProcessorUnityWrapper (false); pluginInstance->create (state); @@ -524,7 +524,7 @@ namespace UnityCallbacks return 0; } - int UNITY_INTERFACE_API releaseCallback (UnityAudioEffectState* state) + static int UNITY_INTERFACE_API releaseCallback (UnityAudioEffectState* state) { auto* pluginInstance = state->getEffectData(); pluginInstance->release(); @@ -538,7 +538,7 @@ namespace UnityCallbacks return 0; } - int UNITY_INTERFACE_API resetCallback (UnityAudioEffectState* state) + static int UNITY_INTERFACE_API resetCallback (UnityAudioEffectState* state) { auto* pluginInstance = state->getEffectData(); pluginInstance->reset(); @@ -546,14 +546,14 @@ namespace UnityCallbacks return 0; } - int UNITY_INTERFACE_API setPositionCallback (UnityAudioEffectState* state, unsigned int pos) + static int UNITY_INTERFACE_API setPositionCallback (UnityAudioEffectState* state, unsigned int pos) { ignoreUnused (state, pos); return 0; } - int UNITY_INTERFACE_API setFloatParameterCallback (UnityAudioEffectState* state, int index, float value) + static int UNITY_INTERFACE_API setFloatParameterCallback (UnityAudioEffectState* state, int index, float value) { auto* pluginInstance = state->getEffectData(); pluginInstance->setParameter (index, value); @@ -561,7 +561,7 @@ namespace UnityCallbacks return 0; } - int UNITY_INTERFACE_API getFloatParameterCallback (UnityAudioEffectState* state, int index, float* value, char* valueStr) + static int UNITY_INTERFACE_API getFloatParameterCallback (UnityAudioEffectState* state, int index, float* value, char* valueStr) { auto* pluginInstance = state->getEffectData(); *value = pluginInstance->getParameter (index); @@ -571,7 +571,7 @@ namespace UnityCallbacks return 0; } - int UNITY_INTERFACE_API getFloatBufferCallback (UnityAudioEffectState* state, const char* name, float* buffer, int numSamples) + static int UNITY_INTERFACE_API getFloatBufferCallback (UnityAudioEffectState* state, const char* name, float* buffer, int numSamples) { ignoreUnused (numSamples); @@ -615,8 +615,8 @@ namespace UnityCallbacks return 0; } - int UNITY_INTERFACE_API processCallback (UnityAudioEffectState* state, float* inBuffer, float* outBuffer, - unsigned int bufferSize, int numInChannels, int numOutChannels) + static int UNITY_INTERFACE_API processCallback (UnityAudioEffectState* state, float* inBuffer, float* outBuffer, + unsigned int bufferSize, int numInChannels, int numOutChannels) { auto* pluginInstance = state->getEffectData(); @@ -776,6 +776,8 @@ UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unitySetScreenBounds (int id, fl //============================================================================== #if JUCE_WINDOWS + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") + extern "C" BOOL WINAPI DllMain (HINSTANCE instance, DWORD reason, LPVOID) { if (reason == DLL_PROCESS_ATTACH) @@ -783,6 +785,8 @@ UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API unitySetScreenBounds (int id, fl return true; } + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif #endif diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp index bca6cd74..1127dd25 100644 --- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -361,7 +361,7 @@ public: jassert (isProcessing); // (tragically, some hosts actually need this, although it's stupid to have - // to do it here..) + // to do it here.) if (! isProcessing) resume(); @@ -396,6 +396,8 @@ public: } else { + updateCallbackContextInfo(); + int i; for (i = 0; i < numOut; ++i) { @@ -596,49 +598,41 @@ public: } } - //============================================================================== - bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) override + void updateCallbackContextInfo() { const Vst2::VstTimeInfo* ti = nullptr; if (hostCallback != nullptr) { int32 flags = Vst2::kVstPpqPosValid | Vst2::kVstTempoValid - | Vst2::kVstBarsValid | Vst2::kVstCyclePosValid - | Vst2::kVstTimeSigValid | Vst2::kVstSmpteValid - | Vst2::kVstClockValid; + | Vst2::kVstBarsValid | Vst2::kVstCyclePosValid + | Vst2::kVstTimeSigValid | Vst2::kVstSmpteValid + | Vst2::kVstClockValid | Vst2::kVstNanosValid; auto result = hostCallback (&vstEffect, Vst2::audioMasterGetTime, 0, flags, nullptr, 0); ti = reinterpret_cast (result); } if (ti == nullptr || ti->sampleRate <= 0) - return false; - - info.bpm = (ti->flags & Vst2::kVstTempoValid) != 0 ? ti->tempo : 0.0; - - if ((ti->flags & Vst2::kVstTimeSigValid) != 0) { - info.timeSigNumerator = ti->timeSigNumerator; - info.timeSigDenominator = ti->timeSigDenominator; - } - else - { - info.timeSigNumerator = 4; - info.timeSigDenominator = 4; + currentPosition.reset(); + return; } - info.timeInSamples = (int64) (ti->samplePos + 0.5); - info.timeInSeconds = ti->samplePos / ti->sampleRate; - info.ppqPosition = (ti->flags & Vst2::kVstPpqPosValid) != 0 ? ti->ppqPos : 0.0; - info.ppqPositionOfLastBarStart = (ti->flags & Vst2::kVstBarsValid) != 0 ? ti->barStartPos : 0.0; + auto& info = currentPosition.emplace(); + info.setBpm ((ti->flags & Vst2::kVstTempoValid) != 0 ? makeOptional (ti->tempo) : nullopt); - std::tie (info.frameRate, info.editOriginTime) = [ti] - { - if ((ti->flags & Vst2::kVstSmpteValid) == 0) - return std::make_tuple (FrameRate(), 0.0); + info.setTimeSignature ((ti->flags & Vst2::kVstTimeSigValid) != 0 ? makeOptional (TimeSignature { ti->timeSigNumerator, ti->timeSigDenominator }) + : nullopt); - const auto rate = [&] + info.setTimeInSamples ((int64) (ti->samplePos + 0.5)); + info.setTimeInSeconds (ti->samplePos / ti->sampleRate); + info.setPpqPosition ((ti->flags & Vst2::kVstPpqPosValid) != 0 ? makeOptional (ti->ppqPos) : nullopt); + info.setPpqPositionOfLastBarStart ((ti->flags & Vst2::kVstBarsValid) != 0 ? makeOptional (ti->barStartPos) : nullopt); + + if ((ti->flags & Vst2::kVstSmpteValid) != 0) + { + info.setFrameRate ([&]() -> Optional { switch (ti->smpteFrameRate) { @@ -660,29 +654,27 @@ public: case Vst2::kVstSmpteFilm35mm: return FrameRate().withBaseRate (24); } - return FrameRate(); - }(); + return nullopt; + }()); + + const auto effectiveRate = info.getFrameRate().hasValue() ? info.getFrameRate()->getEffectiveRate() : 0.0; + info.setEditOriginTime (effectiveRate != 0.0 ? makeOptional (ti->smpteOffset / (80.0 * effectiveRate)) : nullopt); + } - const auto effectiveRate = rate.getEffectiveRate(); - return std::make_tuple (rate, effectiveRate != 0.0 ? ti->smpteOffset / (80.0 * effectiveRate) : 0.0); - }(); + info.setIsRecording ((ti->flags & Vst2::kVstTransportRecording) != 0); + info.setIsPlaying ((ti->flags & (Vst2::kVstTransportRecording | Vst2::kVstTransportPlaying)) != 0); + info.setIsLooping ((ti->flags & Vst2::kVstTransportCycleActive) != 0); - info.isRecording = (ti->flags & Vst2::kVstTransportRecording) != 0; - info.isPlaying = (ti->flags & (Vst2::kVstTransportRecording | Vst2::kVstTransportPlaying)) != 0; - info.isLooping = (ti->flags & Vst2::kVstTransportCycleActive) != 0; + info.setLoopPoints ((ti->flags & Vst2::kVstCyclePosValid) != 0 ? makeOptional (LoopPoints { ti->cycleStartPos, ti->cycleEndPos }) + : nullopt); - if ((ti->flags & Vst2::kVstCyclePosValid) != 0) - { - info.ppqLoopStart = ti->cycleStartPos; - info.ppqLoopEnd = ti->cycleEndPos; - } - else - { - info.ppqLoopStart = 0; - info.ppqLoopEnd = 0; - } + info.setHostTimeNs ((ti->flags & Vst2::kVstNanosValid) != 0 ? makeOptional ((uint64_t) ti->nanoSeconds) : nullopt); + } - return true; + //============================================================================== + Optional getPosition() const override + { + return currentPosition; } //============================================================================== @@ -940,6 +932,7 @@ public: case Vst2::effSetProcessPrecision: return handleSetSampleFloatType (args); case Vst2::effGetNumMidiInputChannels: return handleGetNumMidiInputChannels(); case Vst2::effGetNumMidiOutputChannels: return handleGetNumMidiOutputChannels(); + case Vst2::effEditIdle: return handleEditIdle(); default: return 0; } } @@ -1020,6 +1013,10 @@ public: (Window) getWindowHandle(), (HostWindowType) hostWindow, 0, 0); + // The host is likely to attempt to move/resize the window directly after this call, + // and we need to ensure that the X server knows that our window has been attached + // before that happens. + X11Symbols::getInstance()->xFlush (display); #elif JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE checkHostWindowScaleFactor(); startTimer (500); @@ -1082,6 +1079,7 @@ public: void parentSizeChanged() override { updateWindowSize(); + repaint(); } void childBoundsChanged (Component*) override @@ -1106,41 +1104,11 @@ public: return {}; } - void updateWindowSize() - { - if (! resizingParent - && getEditorComp() != nullptr - && hostWindow != HostWindowType{}) - { - auto editorBounds = getSizeToContainChild(); - - resizeHostWindow (editorBounds.getWidth(), editorBounds.getHeight()); - - { - const ScopedValueSetter resizingParentSetter (resizingParent, true); - - #if JUCE_LINUX || JUCE_BSD // setSize() on linux causes renoise and energyxt to fail. - auto rect = convertToHostBounds ({ 0, 0, (int16) editorBounds.getHeight(), (int16) editorBounds.getWidth() }); - - X11Symbols::getInstance()->xResizeWindow (display, (Window) getWindowHandle(), - static_cast (rect.right - rect.left), - static_cast (rect.bottom - rect.top)); - #else - setSize (editorBounds.getWidth(), editorBounds.getHeight()); - #endif - } - - #if JUCE_MAC - resizeHostWindow (editorBounds.getWidth(), editorBounds.getHeight()); // (doing this a second time seems to be necessary in tracktion) - #endif - } - } - - void resizeHostWindow (int newWidth, int newHeight) + void resizeHostWindow (juce::Rectangle bounds) { - auto rect = convertToHostBounds ({ 0, 0, (int16) newHeight, (int16) newWidth }); - newWidth = rect.right - rect.left; - newHeight = rect.bottom - rect.top; + auto rect = convertToHostBounds ({ 0, 0, (int16) bounds.getHeight(), (int16) bounds.getWidth() }); + const auto newWidth = rect.right - rect.left; + const auto newHeight = rect.bottom - rect.top; bool sizeWasSuccessful = false; @@ -1212,6 +1180,12 @@ public: SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); #endif } + + #if JUCE_LINUX || JUCE_BSD + X11Symbols::getInstance()->xResizeWindow (display, (Window) getWindowHandle(), + static_cast (rect.right - rect.left), + static_cast (rect.bottom - rect.top)); + #endif } void setContentScaleFactor (float scale) @@ -1273,6 +1247,34 @@ public: #endif private: + void updateWindowSize() + { + if (! resizingParent + && getEditorComp() != nullptr + && hostWindow != HostWindowType{}) + { + const auto editorBounds = getSizeToContainChild(); + resizeHostWindow (editorBounds); + + { + const ScopedValueSetter resizingParentSetter (resizingParent, true); + + // setSize() on linux causes renoise and energyxt to fail. + // We'll resize our peer during resizeHostWindow() instead. + #if ! (JUCE_LINUX || JUCE_BSD) + setSize (editorBounds.getWidth(), editorBounds.getHeight()); + #endif + + if (auto* p = getPeer()) + p->updateBounds(); + } + + #if JUCE_MAC + resizeHostWindow (editorBounds); // (doing this a second time seems to be necessary in tracktion) + #endif + } + } + //============================================================================== static Vst2::ERect convertToHostBounds (const Vst2::ERect& rect) { @@ -1287,6 +1289,11 @@ public: (int16) roundToInt (rect.right * desktopScale) }; } + //============================================================================== + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer hostEventLoop; + #endif + //============================================================================== JuceVSTWrapper& wrapper; bool resizingChild = false, resizingParent = false; @@ -1595,7 +1602,11 @@ private: pointer_sized_int handleGetEditorBounds (VstOpCodeArguments args) { checkWhetherMessageThreadIsCorrect(); + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer hostDrivenEventLoop; + #else const MessageManagerLock mmLock; + #endif createEditorComp(); if (editorComp != nullptr) @@ -1611,7 +1622,11 @@ private: pointer_sized_int handleOpenEditor (VstOpCodeArguments args) { checkWhetherMessageThreadIsCorrect(); + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer hostDrivenEventLoop; + #else const MessageManagerLock mmLock; + #endif jassert (! recursionCheck); startTimerHz (4); // performs misc housekeeping chores @@ -1631,8 +1646,15 @@ private: pointer_sized_int handleCloseEditor (VstOpCodeArguments) { checkWhetherMessageThreadIsCorrect(); + + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer hostDrivenEventLoop; + #else const MessageManagerLock mmLock; + #endif + deleteEditor (true); + return 0; } @@ -1644,14 +1666,17 @@ private: auto data = (void**) args.ptr; bool onlyStoreCurrentProgramData = (args.index != 0); - ScopedLock lock (stateInformationLock); - chunkMemory.reset(); + MemoryBlock block; if (onlyStoreCurrentProgramData) - processor->getCurrentProgramStateInformation (chunkMemory); + processor->getCurrentProgramStateInformation (block); else - processor->getStateInformation (chunkMemory); + processor->getStateInformation (block); + + // IMPORTANT! Don't call getStateInfo while holding this lock! + const ScopedLock lock (stateInformationLock); + chunkMemory = std::move (block); *data = (void*) chunkMemory.getData(); // because the chunk is only needed temporarily by the host (or at least you'd @@ -1670,18 +1695,18 @@ private: bool onlyRestoreCurrentProgramData = (args.index != 0); { - ScopedLock lock (stateInformationLock); + const ScopedLock lock (stateInformationLock); chunkMemory.reset(); chunkMemoryTime = 0; + } - if (byteSize > 0 && data != nullptr) - { - if (onlyRestoreCurrentProgramData) - processor->setCurrentProgramStateInformation (data, byteSize); - else - processor->setStateInformation (data, byteSize); - } + if (byteSize > 0 && data != nullptr) + { + if (onlyRestoreCurrentProgramData) + processor->setCurrentProgramStateInformation (data, byteSize); + else + processor->setStateInformation (data, byteSize); } } @@ -1990,7 +2015,11 @@ private: pointer_sized_int handleSetContentScaleFactor (float scale) { checkWhetherMessageThreadIsCorrect(); + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer hostDrivenEventLoop; + #else const MessageManagerLock mmLock; + #endif #if ! JUCE_MAC if (! approximatelyEqual (scale, editorScaleFactor)) @@ -2055,6 +2084,16 @@ private: #endif } + pointer_sized_int handleEditIdle() + { + #if JUCE_LINUX || JUCE_BSD + SharedResourcePointer hostDrivenEventLoop; + hostDrivenEventLoop->processPendingEvents(); + #endif + + return 0; + } + //============================================================================== ScopedJuceInitialiser_GUI libraryInitialiser; @@ -2075,6 +2114,7 @@ private: Vst2::ERect editorRect; MidiBuffer midiEvents; VSTMidiEventList outgoingEvents; + Optional currentPosition; LegacyAudioParametersWrapper juceParameters; @@ -2114,17 +2154,13 @@ namespace ScopedJuceInitialiser_GUI libraryInitialiser; #if JUCE_LINUX || JUCE_BSD - SharedResourcePointer messageThread; + SharedResourcePointer hostDrivenEventLoop; #endif try { if (audioMaster (nullptr, Vst2::audioMasterVersion, 0, 0, nullptr, 0) != 0) { - #if JUCE_LINUX || JUCE_BSD - MessageManagerLock mmLock; - #endif - std::unique_ptr processor { createPluginFilterOfType (AudioProcessor::wrapperType_VST) }; auto* processorPtr = processor.get(); auto* wrapper = new JuceVSTWrapper (audioMaster, std::move (processor)); @@ -2153,6 +2189,8 @@ namespace #define JUCE_EXPORTED_FUNCTION extern "C" __attribute__ ((visibility("default"))) #endif +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") + //============================================================================== // Mac startup code.. #if JUCE_MAC @@ -2228,6 +2266,8 @@ namespace } #endif +JUCE_END_IGNORE_WARNINGS_GCC_LIKE + JUCE_END_IGNORE_WARNINGS_MSVC #endif diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm index d943e8be..8e3fab41 100644 --- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm +++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -31,11 +31,8 @@ #if JucePlugin_Build_VST || JucePlugin_Build_VST3 -#define JUCE_MAC_WINDOW_VISIBITY_BODGE 1 - #include "../utility/juce_IncludeSystemHeaders.h" #include "../utility/juce_IncludeModuleHeaders.h" -#include "../utility/juce_CarbonVisibility.h" //============================================================================== namespace juce @@ -160,8 +157,6 @@ void* attachComponentToWindowRefVST (Component* comp, void* parentWindowOrView, [hostWindow orderFront: nil]; [pluginWindow orderFront: nil]; - attachWindowHidingHooks (comp, (WindowRef) parentWindowOrView, hostWindow); - return hostWindow; } #endif @@ -199,8 +194,6 @@ void detachComponentFromWindowRefVST (Component* comp, void* window, bool isNSVi comp->getProperties() ["boundsEventRef"].toString().getHexValue64(); RemoveEventHandler (ref); - removeWindowHidingHooks (comp); - CFUniquePtr dummyView ((HIViewRef) (void*) (pointer_sized_int) comp->getProperties() ["dummyViewRef"].toString().getHexValue64()); diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp index 623ca9ae..83e6e6f1 100644 --- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -50,6 +50,7 @@ JUCE_BEGIN_NO_SANITIZE ("vptr") #include "../utility/juce_WindowsHooks.h" #include "../utility/juce_LinuxMessageThread.h" #include +#include #include #ifndef JUCE_VST3_CAN_REPLACE_VST2 @@ -77,15 +78,29 @@ JUCE_BEGIN_NO_SANITIZE ("vptr") #endif #if JUCE_LINUX || JUCE_BSD + #include "juce_events/native/juce_linux_EventLoopInternal.h" #include - - std::vector>> getFdReadCallbacks(); #endif #if JUCE_MAC #include #endif +//============================================================================== +#if JucePlugin_Enable_ARA + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE("-Wpragma-pack") + #include + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + + #if ARA_SUPPORT_VERSION_1 + #error "Unsupported ARA version - only ARA version 2 and onward are supported by the current implementation" + #endif + + DEF_CLASS_IID(ARA::IPlugInEntryPoint) + DEF_CLASS_IID(ARA::IPlugInEntryPoint2) + DEF_CLASS_IID(ARA::IMainFactory) +#endif + namespace juce { @@ -104,20 +119,26 @@ using namespace Steinberg; #endif #if JUCE_WINDOWS && JUCE_WIN_PER_MONITOR_DPI_AWARE - extern JUCE_API double getScaleFactorForWindow (HWND); + double getScaleFactorForWindow (HWND); #endif //============================================================================== #if JUCE_LINUX || JUCE_BSD -class EventHandler final : public Steinberg::Linux::IEventHandler +class EventHandler final : public Steinberg::Linux::IEventHandler, + private LinuxEventLoopInternal::Listener { public: - EventHandler() = default; + EventHandler() + { + LinuxEventLoopInternal::registerLinuxEventLoopListener (*this); + } - ~EventHandler() + ~EventHandler() override { - jassert (hostRunLoops.size() == 0); + jassert (hostRunLoops.empty()); + + LinuxEventLoopInternal::deregisterLinuxEventLoopListener (*this); if (! messageThread->isRunning()) messageThread->start(); @@ -133,11 +154,7 @@ public: void PLUGIN_API onFDIsSet (Steinberg::Linux::FileDescriptor fd) override { updateCurrentMessageThread(); - - auto it = fdCallbackMap.find (fd); - - if (it != fdCallbackMap.end()) - it->second (fd); + LinuxEventLoopInternal::invokeEventLoopCallbackForFd (fd); } //============================================================================== @@ -145,19 +162,7 @@ public: { if (auto* runLoop = getRunLoopFromFrame (plugFrame)) { - if (hostRunLoops.contains (runLoop)) - runLoop->unregisterEventHandler (this); - - hostRunLoops.add (runLoop); - - fdCallbackMap.clear(); - - for (auto& cb : getFdReadCallbacks()) - { - fdCallbackMap[cb.first] = cb.second; - runLoop->registerEventHandler (this, cb.first); - } - + refreshAttachedEventLoop ([this, runLoop] { hostRunLoops.insert (runLoop); }); updateCurrentMessageThread(); } } @@ -165,67 +170,58 @@ public: void unregisterHandlerForFrame (IPlugFrame* plugFrame) { if (auto* runLoop = getRunLoopFromFrame (plugFrame)) - { - hostRunLoops.remove (runLoop); - - if (! hostRunLoops.contains (runLoop)) - runLoop->unregisterEventHandler (this); - } + refreshAttachedEventLoop ([this, runLoop] { hostRunLoops.erase (runLoop); }); } private: - //============================================================================= - class HostRunLoopInterfaces + //============================================================================== + /* Connects all known FDs to a single host event loop instance. */ + class AttachedEventLoop { public: - HostRunLoopInterfaces() = default; + AttachedEventLoop() = default; - void add (Steinberg::Linux::IRunLoop* runLoop) + AttachedEventLoop (Steinberg::Linux::IRunLoop* loopIn, Steinberg::Linux::IEventHandler* handlerIn) + : loop (loopIn), handler (handlerIn) { - if (auto* refCountedRunLoop = find (runLoop)) - { - ++(refCountedRunLoop->refCount); - return; - } - - runLoops.push_back ({ runLoop, 1 }); + for (auto& fd : LinuxEventLoopInternal::getRegisteredFds()) + loop->registerEventHandler (handler, fd); } - void remove (Steinberg::Linux::IRunLoop* runLoop) + AttachedEventLoop (AttachedEventLoop&& other) noexcept { - if (auto* refCountedRunLoop = find (runLoop)) - if (--(refCountedRunLoop->refCount) == 0) - runLoops.erase (std::find (runLoops.begin(), runLoops.end(), runLoop)); + swap (other); } - size_t size() const noexcept { return runLoops.size(); } - bool contains (Steinberg::Linux::IRunLoop* runLoop) { return find (runLoop) != nullptr; } - - private: - struct RefCountedRunLoop + AttachedEventLoop& operator= (AttachedEventLoop&& other) noexcept { - Steinberg::Linux::IRunLoop* runLoop = nullptr; - int refCount = 0; + swap (other); + return *this; + } - bool operator== (const Steinberg::Linux::IRunLoop* other) const noexcept { return runLoop == other; } - }; + AttachedEventLoop (const AttachedEventLoop&) = delete; + AttachedEventLoop& operator= (const AttachedEventLoop&) = delete; - RefCountedRunLoop* find (const Steinberg::Linux::IRunLoop* runLoop) + ~AttachedEventLoop() { - auto iter = std::find (runLoops.begin(), runLoops.end(), runLoop); - - if (iter != runLoops.end()) - return &(*iter); + if (loop == nullptr) + return; - return nullptr; + loop->unregisterEventHandler (handler); } - std::vector runLoops; + private: + void swap (AttachedEventLoop& other) + { + std::swap (other.loop, loop); + std::swap (other.handler, handler); + } - JUCE_DECLARE_NON_MOVEABLE (HostRunLoopInterfaces) - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HostRunLoopInterfaces) + Steinberg::Linux::IRunLoop* loop = nullptr; + Steinberg::Linux::IEventHandler* handler = nullptr; }; + //============================================================================== static Steinberg::Linux::IRunLoop* getRunLoopFromFrame (IPlugFrame* plugFrame) { Steinberg::Linux::IRunLoop* runLoop = nullptr; @@ -248,12 +244,44 @@ private: } } + void fdCallbacksChanged() override + { + // The set of active FDs has changed, so deregister from the current event loop and then + // re-register the current set of FDs. + refreshAttachedEventLoop ([]{}); + } + + /* Deregisters from any attached event loop, updates the set of known event loops, and then + attaches all FDs to the first known event loop. + + The same event loop instance is shared between all plugin instances. Every time an event + loop is added or removed, this function should be called to register all FDs with a + suitable event loop. + + Note that there's no API to deregister a single FD for a given event loop. Instead, we must + deregister all FDs, and then register all known FDs again. + */ + template + void refreshAttachedEventLoop (Callback&& modifyKnownRunLoops) + { + // Deregister the old event loop. + // It's important to call the destructor from the old attached loop before calling the + // constructor of the new attached loop. + attachedEventLoop = AttachedEventLoop(); + + modifyKnownRunLoops(); + + // If we still know about an extant event loop, attach to it. + if (hostRunLoops.begin() != hostRunLoops.end()) + attachedEventLoop = AttachedEventLoop (*hostRunLoops.begin(), this); + } + SharedResourcePointer messageThread; std::atomic refCount { 1 }; - HostRunLoopInterfaces hostRunLoops; - std::unordered_map> fdCallbackMap; + std::multiset hostRunLoops; + AttachedEventLoop attachedEventLoop; //============================================================================== JUCE_DECLARE_NON_MOVEABLE (EventHandler) @@ -292,9 +320,9 @@ static QueryInterfaceResult queryAdditionalInterfaces (AudioProcessor* processor return {}; } -tresult extractResult (const QueryInterfaceResult& userInterface, - const InterfaceResultWithDeferredAddRef& juceInterface, - void** obj) +static tresult extractResult (const QueryInterfaceResult& userInterface, + const InterfaceResultWithDeferredAddRef& juceInterface, + void** obj) { if (userInterface.isOk() && juceInterface.isOk()) { @@ -526,7 +554,7 @@ private: if (bypassParameter == nullptr) { vst3WrapperProvidedBypassParam = true; - ownedBypassParameter.reset (new AudioParameterBool ("byps", "Bypass", false, {}, {}, {})); + ownedBypassParameter.reset (new AudioParameterBool ("byps", "Bypass", false)); bypassParameter = ownedBypassParameter.get(); } @@ -638,14 +666,19 @@ class JuceVST3EditController : public Vst::EditController, public Vst::IMidiMapping, public Vst::IUnitInfo, public Vst::ChannelContext::IInfoListener, + #if JucePlugin_Enable_ARA + public Presonus::IPlugInViewEmbedding, + #endif public AudioProcessorListener, private ComponentRestarter::Listener { public: - JuceVST3EditController (Vst::IHostApplication* host) + explicit JuceVST3EditController (Vst::IHostApplication* host) { if (host != nullptr) host->queryInterface (FUnknown::iid, (void**) &hostContext); + + blueCatPatchwork |= isBlueCatHost (host); } //============================================================================== @@ -675,6 +708,8 @@ public: if (hostContext != context) hostContext = context; + blueCatPatchwork |= isBlueCatHost (context); + return kResultTrue; } @@ -915,6 +950,21 @@ public: return kResultOk; } + //============================================================================== + #if JucePlugin_Enable_ARA + Steinberg::TBool PLUGIN_API isViewEmbeddingSupported() override + { + if (auto* pluginInstance = getPluginInstance()) + return (Steinberg::TBool) dynamic_cast (pluginInstance)->isEditorView(); + return (Steinberg::TBool) false; + } + + Steinberg::tresult PLUGIN_API setViewIsEmbedded (Steinberg::IPlugView* /*view*/, Steinberg::TBool /*embedded*/) override + { + return kResultOk; + } + #endif + //============================================================================== tresult PLUGIN_API setComponentState (IBStream* stream) override { @@ -1256,6 +1306,10 @@ public: auto latencySamples = pluginInstance->getLatencySamples(); + #if JucePlugin_Enable_ARA + jassert (latencySamples == 0 || ! dynamic_cast (pluginInstance)->isBoundToARA()); + #endif + if (details.latencyChanged && latencySamples != lastLatencySamples) { flags |= Vst::kLatencyChanged; @@ -1284,6 +1338,27 @@ public: static constexpr auto pluginShouldBeMarkedDirtyFlag = 1 << 16; private: + bool isBlueCatHost (FUnknown* context) const + { + // We can't use the normal PluginHostType mechanism here because that will give us the name + // of the host process. However, this plugin instance might be loaded in an instance of + // the BlueCat PatchWork host, which might itself be a plugin. + + VSTComSmartPtr host; + host.loadFrom (context); + + if (host == nullptr) + return false; + + Vst::String128 name; + + if (host->getName (name) != kResultOk) + return false; + + const auto hostName = toString (name); + return hostName.contains ("Blue Cat's VST3 Host"); + } + friend class JuceVST3Component; friend struct Param; @@ -1359,6 +1434,7 @@ private: inSetupProcessing { false }; int lastLatencySamples = 0; + bool blueCatPatchwork = isBlueCatHost (hostContext.get()); #if ! JUCE_MAC float lastScaleFactorReceived = 1.0f; @@ -1378,6 +1454,9 @@ private: UniqueBase{}, SharedBase{}, UniqueBase{}, + #if JucePlugin_Enable_ARA + UniqueBase{}, + #endif SharedBase{}); if (result.isOk()) @@ -1780,7 +1859,20 @@ private: { if (auto* editor = component->pluginEditor.get()) { - if (auto* constrainer = editor->getConstrainer()) + if (canResize() == kResultFalse) + { + // Ableton Live will call checkSizeConstraint even if the view returns false + // from canResize. Set the out param to an appropriate size for the editor + // and return. + auto constrainedRect = component->getLocalArea (editor, editor->getLocalBounds()) + .getSmallestIntegerContainer(); + + *rectToCheck = convertFromHostBounds (*rectToCheck); + rectToCheck->right = rectToCheck->left + roundToInt (constrainedRect.getWidth()); + rectToCheck->bottom = rectToCheck->top + roundToInt (constrainedRect.getHeight()); + *rectToCheck = convertToHostBounds (*rectToCheck); + } + else if (auto* constrainer = editor->getConstrainer()) { *rectToCheck = convertFromHostBounds (*rectToCheck); @@ -1944,6 +2036,12 @@ private: { pluginEditor.reset (plugin.createEditorIfNeeded()); + #if JucePlugin_Enable_ARA + jassert (dynamic_cast (pluginEditor.get()) != nullptr); + // for proper view embedding, ARA plug-ins must be resizable + jassert (pluginEditor->isResizable()); + #endif + if (pluginEditor != nullptr) { editorHostContext = std::make_unique (*owner.owner->audioProcessor, @@ -2052,9 +2150,9 @@ private: auto host = getHostType(); #if JUCE_MAC - if (host.isWavelab() || host.isReaper()) + if (host.isWavelab() || host.isReaper() || owner.owner->blueCatPatchwork) #else - if (host.isWavelab() || host.isAbletonLive() || host.isBitwigStudio()) + if (host.isWavelab() || host.isAbletonLive() || host.isBitwigStudio() || owner.owner->blueCatPatchwork) #endif setBounds (editorBounds.withPosition (0, 0)); } @@ -2186,17 +2284,50 @@ private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3EditController) }; -namespace -{ - template struct AudioBusPointerHelper {}; - template <> struct AudioBusPointerHelper { static float** impl (Vst::AudioBusBuffers& data) noexcept { return data.channelBuffers32; } }; - template <> struct AudioBusPointerHelper { static double** impl (Vst::AudioBusBuffers& data) noexcept { return data.channelBuffers64; } }; - template struct ChooseBufferHelper {}; - template <> struct ChooseBufferHelper { static AudioBuffer& impl (AudioBuffer& f, AudioBuffer& ) noexcept { return f; } }; - template <> struct ChooseBufferHelper { static AudioBuffer& impl (AudioBuffer& , AudioBuffer& d) noexcept { return d; } }; -} +//============================================================================== +#if JucePlugin_Enable_ARA + class JuceARAFactory : public ARA::IMainFactory + { + public: + JuceARAFactory() = default; + virtual ~JuceARAFactory() = default; + + JUCE_DECLARE_VST3_COM_REF_METHODS + + tresult PLUGIN_API queryInterface (const ::Steinberg::TUID targetIID, void** obj) override + { + const auto result = testForMultiple (*this, + targetIID, + UniqueBase{}, + UniqueBase{}); + + if (result.isOk()) + return result.extract (obj); + + if (doUIDsMatch (targetIID, JuceARAFactory::iid)) + { + addRef(); + *obj = this; + return kResultOk; + } + + *obj = nullptr; + return kNoInterface; + } + //---from ARA::IMainFactory------- + const ARA::ARAFactory* PLUGIN_API getFactory() SMTG_OVERRIDE + { + return createARAFactory(); + } + static const FUID iid; + + private: + //============================================================================== + std::atomic refCount { 1 }; + }; +#endif //============================================================================== class JuceVST3Component : public Vst::IComponent, @@ -2204,6 +2335,10 @@ class JuceVST3Component : public Vst::IComponent, public Vst::IUnitInfo, public Vst::IConnectionPoint, public Vst::IProcessContextRequirements, + #if JucePlugin_Enable_ARA + public ARA::IPlugInEntryPoint, + public ARA::IPlugInEntryPoint2, + #endif public AudioPlayHead { public: @@ -2273,6 +2408,8 @@ public: return extractResult (userProvidedInterface, juceProvidedInterface, obj); } + enum class CallPrepareToPlay { no, yes }; + //============================================================================== tresult PLUGIN_API initialize (FUnknown* hostContext) override { @@ -2280,7 +2417,7 @@ public: host.loadFrom (hostContext); processContext.sampleRate = processSetup.sampleRate; - preparePlugin (processSetup.sampleRate, (int) processSetup.maxSamplesPerBlock); + preparePlugin (processSetup.sampleRate, (int) processSetup.maxSamplesPerBlock, CallPrepareToPlay::no); return kResultTrue; } @@ -2338,12 +2475,11 @@ public: //============================================================================== tresult PLUGIN_API setActive (TBool state) override { + active = (state != 0); + if (! state) { getPluginInstance().releaseResources(); - - deallocateChannelListAndBuffers (channelListFloat, emptyBufferFloat); - deallocateChannelListAndBuffers (channelListDouble, emptyBufferDouble); } else { @@ -2358,10 +2494,7 @@ public: ? (int) processSetup.maxSamplesPerBlock : bufferSize; - allocateChannelListAndBuffers (channelListFloat, emptyBufferFloat); - allocateChannelListAndBuffers (channelListDouble, emptyBufferDouble); - - preparePlugin (sampleRate, bufferSize); + preparePlugin (sampleRate, bufferSize, CallPrepareToPlay::yes); } return kResultOk; @@ -2735,34 +2868,50 @@ public: Steinberg::int32 channel, Vst::UnitID& unitId) override { return comPluginInstance->getUnitByBus (type, dir, busIndex, channel, unitId); } //============================================================================== - bool getCurrentPosition (CurrentPositionInfo& info) override - { - info.timeInSamples = jmax ((juce::int64) 0, processContext.projectTimeSamples); - info.timeInSeconds = static_cast (info.timeInSamples) / processContext.sampleRate; - info.bpm = jmax (1.0, processContext.tempo); - info.timeSigNumerator = jmax (1, (int) processContext.timeSigNumerator); - info.timeSigDenominator = jmax (1, (int) processContext.timeSigDenominator); - info.ppqPositionOfLastBarStart = processContext.barPositionMusic; - info.ppqPosition = processContext.projectTimeMusic; - info.ppqLoopStart = processContext.cycleStartMusic; - info.ppqLoopEnd = processContext.cycleEndMusic; - info.isRecording = (processContext.state & Vst::ProcessContext::kRecording) != 0; - info.isPlaying = (processContext.state & Vst::ProcessContext::kPlaying) != 0; - info.isLooping = (processContext.state & Vst::ProcessContext::kCycleActive) != 0; - - info.frameRate = [&] - { - if ((processContext.state & Vst::ProcessContext::kSmpteValid) == 0) - return FrameRate(); - - return FrameRate().withBaseRate ((int) processContext.frameRate.framesPerSecond) - .withDrop ((processContext.frameRate.flags & Vst::FrameRate::kDropRate) != 0) - .withPullDown ((processContext.frameRate.flags & Vst::FrameRate::kPullDownRate) != 0); - }(); - - info.editOriginTime = (double) processContext.smpteOffsetSubframes / (80.0 * info.frameRate.getEffectiveRate()); - - return true; + Optional getPosition() const override + { + PositionInfo info; + info.setTimeInSamples (jmax ((juce::int64) 0, processContext.projectTimeSamples)); + info.setTimeInSeconds (static_cast (*info.getTimeInSamples()) / processContext.sampleRate); + info.setIsRecording ((processContext.state & Vst::ProcessContext::kRecording) != 0); + info.setIsPlaying ((processContext.state & Vst::ProcessContext::kPlaying) != 0); + info.setIsLooping ((processContext.state & Vst::ProcessContext::kCycleActive) != 0); + + info.setBpm ((processContext.state & Vst::ProcessContext::kTempoValid) != 0 + ? makeOptional (processContext.tempo) + : nullopt); + + info.setTimeSignature ((processContext.state & Vst::ProcessContext::kTimeSigValid) != 0 + ? makeOptional (TimeSignature { processContext.timeSigNumerator, processContext.timeSigDenominator }) + : nullopt); + + info.setLoopPoints ((processContext.state & Vst::ProcessContext::kCycleValid) != 0 + ? makeOptional (LoopPoints { processContext.cycleStartMusic, processContext.cycleEndMusic }) + : nullopt); + + info.setPpqPosition ((processContext.state & Vst::ProcessContext::kProjectTimeMusicValid) != 0 + ? makeOptional (processContext.projectTimeMusic) + : nullopt); + + info.setPpqPositionOfLastBarStart ((processContext.state & Vst::ProcessContext::kBarPositionValid) != 0 + ? makeOptional (processContext.barPositionMusic) + : nullopt); + + info.setFrameRate ((processContext.state & Vst::ProcessContext::kSmpteValid) != 0 + ? makeOptional (FrameRate().withBaseRate ((int) processContext.frameRate.framesPerSecond) + .withDrop ((processContext.frameRate.flags & Vst::FrameRate::kDropRate) != 0) + .withPullDown ((processContext.frameRate.flags & Vst::FrameRate::kPullDownRate) != 0)) + : nullopt); + + info.setEditOriginTime (info.getFrameRate().hasValue() + ? makeOptional ((double) processContext.smpteOffsetSubframes / (80.0 * info.getFrameRate()->getEffectiveRate())) + : nullopt); + + info.setHostTimeNs ((processContext.state & Vst::ProcessContext::kSystemTimeValid) != 0 + ? makeOptional ((uint64_t) processContext.systemTime) + : nullopt); + + return info; } //============================================================================== @@ -2821,6 +2970,7 @@ public: info.mediaType = Vst::kAudio; info.direction = dir; info.channelCount = bus->getLastEnabledLayout().size(); + jassert (info.channelCount == Steinberg::Vst::SpeakerArr::getChannelCount (getVst3SpeakerArrangement (bus->getLastEnabledLayout()))); toString128 (info.name, bus->getName()); info.busType = [&] @@ -2902,8 +3052,14 @@ public: return kResultFalse; } - tresult PLUGIN_API activateBus (Vst::MediaType type, Vst::BusDirection dir, Steinberg::int32 index, TBool state) override + tresult PLUGIN_API activateBus (Vst::MediaType type, + Vst::BusDirection dir, + Steinberg::int32 index, + TBool state) override { + // The host is misbehaving! The plugin must be deactivated before setting new arrangements. + jassert (! active); + if (type == Vst::kEvent) { #if JucePlugin_WantsMidiInput @@ -2927,26 +3083,76 @@ public: if (type == Vst::kAudio) { - if (index < 0 || index >= getNumAudioBuses (dir == Vst::kInput)) + const auto numInputBuses = getNumAudioBuses (true); + const auto numOutputBuses = getNumAudioBuses (false); + + if (! isPositiveAndBelow (index, dir == Vst::kInput ? numInputBuses : numOutputBuses)) return kResultFalse; - if (auto* bus = pluginInstance->getBus (dir == Vst::kInput, index)) + // The host is allowed to enable/disable buses as it sees fit, so the plugin needs to be + // able to handle any set of enabled/disabled buses, including layouts for which + // AudioProcessor::isBusesLayoutSupported would return false. + // Our strategy is to keep track of the layout that the host last requested, and to + // attempt to apply that layout directly. + // If the layout isn't supported by the processor, we'll try enabling all the buses + // instead. + // If the host enables a bus that the processor refused to enable, then we'll ignore + // that bus (and return silence for output buses). If the host disables a bus that the + // processor refuses to disable, the wrapper will provide the processor with silence for + // input buses, and ignore the contents of output buses. + // Note that some hosts (old bitwig and cakewalk) may incorrectly call this function + // when the plugin is in an activated state. + if (dir == Vst::kInput) + bufferMapper.setInputBusHostActive ((size_t) index, state != 0); + else + bufferMapper.setOutputBusHostActive ((size_t) index, state != 0); + + AudioProcessor::BusesLayout desiredLayout; + + for (auto i = 0; i < numInputBuses; ++i) + desiredLayout.inputBuses.add (bufferMapper.getRequestedLayoutForInputBus ((size_t) i)); + + for (auto i = 0; i < numOutputBuses; ++i) + desiredLayout.outputBuses.add (bufferMapper.getRequestedLayoutForOutputBus ((size_t) i)); + + const auto prev = pluginInstance->getBusesLayout(); + + const auto busesLayoutSupported = [&] { #ifdef JucePlugin_PreferredChannelConfigurations - auto newLayout = pluginInstance->getBusesLayout(); - auto targetLayout = (state != 0 ? bus->getLastEnabledLayout() : AudioChannelSet::disabled()); - - (dir == Vst::kInput ? newLayout.inputBuses : newLayout.outputBuses).getReference (index) = targetLayout; + struct ChannelPair + { + short ins, outs; - short configs[][2] = { JucePlugin_PreferredChannelConfigurations }; - auto compLayout = pluginInstance->getNextBestLayoutInLayoutList (newLayout, configs); + auto tie() const { return std::tie (ins, outs); } + bool operator== (ChannelPair x) const { return tie() == x.tie(); } + }; - if ((dir == Vst::kInput ? compLayout.inputBuses : compLayout.outputBuses).getReference (index) != targetLayout) - return kResultFalse; + const auto countChannels = [] (auto& range) + { + return std::accumulate (range.begin(), range.end(), (short) 0, [] (auto acc, auto set) + { + return acc + set.size(); + }); + }; + + const ChannelPair requested { countChannels (desiredLayout.inputBuses), + countChannels (desiredLayout.outputBuses) }; + const ChannelPair configs[] = { JucePlugin_PreferredChannelConfigurations }; + return std::find (std::begin (configs), std::end (configs), requested) != std::end (configs); + #else + return pluginInstance->checkBusesLayoutSupported (desiredLayout); #endif + }(); - return bus->enable (state != 0) ? kResultTrue : kResultFalse; - } + if (busesLayoutSupported) + pluginInstance->setBusesLayout (desiredLayout); + else + pluginInstance->enableAllBuses(); + + bufferMapper.updateActiveClientBuses (pluginInstance->getBusesLayout()); + + return kResultTrue; } return kResultFalse; @@ -2979,6 +3185,13 @@ public: tresult PLUGIN_API setBusArrangements (Vst::SpeakerArrangement* inputs, Steinberg::int32 numIns, Vst::SpeakerArrangement* outputs, Steinberg::int32 numOuts) override { + if (active) + { + // The host is misbehaving! The plugin must be deactivated before setting new arrangements. + jassertfalse; + return kResultFalse; + } + auto numInputBuses = pluginInstance->getBusCount (true); auto numOutputBuses = pluginInstance->getBusCount (false); @@ -2999,7 +3212,11 @@ public: return kResultFalse; #endif - return pluginInstance->setBusesLayoutWithoutEnabling (requested) ? kResultTrue : kResultFalse; + if (! pluginInstance->setBusesLayoutWithoutEnabling (requested)) + return kResultFalse; + + bufferMapper.updateFromProcessor (*pluginInstance); + return kResultTrue; } tresult PLUGIN_API getBusArrangement (Vst::BusDirection dir, Steinberg::int32 index, Vst::SpeakerArrangement& arr) override @@ -3041,7 +3258,7 @@ public: : AudioProcessor::singlePrecision); getPluginInstance().setNonRealtime (newSetup.processMode == Vst::kOffline); - preparePlugin (processSetup.sampleRate, processSetup.maxSamplesPerBlock); + preparePlugin (processSetup.sampleRate, processSetup.maxSamplesPerBlock, CallPrepareToPlay::no); return kResultTrue; } @@ -3167,8 +3384,8 @@ public: // If all of these are zero, the host is attempting to flush parameters without processing audio. if (data.numSamples != 0 || data.numInputs != 0 || data.numOutputs != 0) { - if (processSetup.symbolicSampleSize == Vst::kSample32) processAudio (data, channelListFloat); - else if (processSetup.symbolicSampleSize == Vst::kSample64) processAudio (data, channelListDouble); + if (processSetup.symbolicSampleSize == Vst::kSample32) processAudio (data); + else if (processSetup.symbolicSampleSize == Vst::kSample64) processAudio (data); else jassertfalse; } @@ -3206,6 +3423,10 @@ private: UniqueBase{}, UniqueBase{}, UniqueBase{}, + #if JucePlugin_Enable_ARA + UniqueBase{}, + UniqueBase{}, + #endif SharedBase{}); if (result.isOk()) @@ -3239,131 +3460,13 @@ private: //============================================================================== template - void processAudio (Vst::ProcessData& data, Array& channelList) + void processAudio (Vst::ProcessData& data) { - int totalInputChans = 0, totalOutputChans = 0; - bool tmpBufferNeedsClearing = false; - - auto plugInInputChannels = pluginInstance->getTotalNumInputChannels(); - auto plugInOutputChannels = pluginInstance->getTotalNumOutputChannels(); - - // Wavelab workaround: wave-lab lies on the number of inputs/outputs so re-count here - const auto countValidChannels = [] (Vst::AudioBusBuffers* buffers, int32 num) - { - return int (std::distance (buffers, std::find_if (buffers, buffers + num, [] (Vst::AudioBusBuffers& buf) - { - return getPointerForAudioBus (buf) == nullptr && buf.numChannels > 0; - }))); - }; - - const auto vstInputs = countValidChannels (data.inputs, data.numInputs); - const auto vstOutputs = countValidChannels (data.outputs, data.numOutputs); - - { - auto n = jmax (vstOutputs, getNumAudioBuses (false)); - - for (int bus = 0; bus < n && totalOutputChans < plugInOutputChannels; ++bus) - { - if (auto* busObject = pluginInstance->getBus (false, bus)) - if (! busObject->isEnabled()) - continue; - - if (bus < vstOutputs) - { - if (auto** const busChannels = getPointerForAudioBus (data.outputs[bus])) - { - auto numChans = jmin ((int) data.outputs[bus].numChannels, plugInOutputChannels - totalOutputChans); - - for (int i = 0; i < numChans; ++i) - { - if (auto dst = busChannels[i]) - { - if (totalOutputChans >= plugInInputChannels) - FloatVectorOperations::clear (dst, (int) data.numSamples); - - channelList.set (totalOutputChans++, busChannels[i]); - } - } - } - } - else - { - const int numChans = jmin (pluginInstance->getChannelCountOfBus (false, bus), plugInOutputChannels - totalOutputChans); + ClientRemappedBuffer remappedBuffer { bufferMapper, data }; + auto& buffer = remappedBuffer.buffer; - for (int i = 0; i < numChans; ++i) - { - if (auto* tmpBuffer = getTmpBufferForChannel (totalOutputChans, data.numSamples))\ - { - tmpBufferNeedsClearing = true; - channelList.set (totalOutputChans++, tmpBuffer); - } - else - return; - } - } - } - } - - { - auto n = jmax (vstInputs, getNumAudioBuses (true)); - - for (int bus = 0; bus < n && totalInputChans < plugInInputChannels; ++bus) - { - if (auto* busObject = pluginInstance->getBus (true, bus)) - if (! busObject->isEnabled()) - continue; - - if (bus < vstInputs) - { - if (auto** const busChannels = getPointerForAudioBus (data.inputs[bus])) - { - const int numChans = jmin ((int) data.inputs[bus].numChannels, plugInInputChannels - totalInputChans); - - for (int i = 0; i < numChans; ++i) - { - if (busChannels[i] != nullptr) - { - if (totalInputChans >= totalOutputChans) - channelList.set (totalInputChans, busChannels[i]); - else - { - auto* dst = channelList.getReference (totalInputChans); - auto* src = busChannels[i]; - - if (dst != src) - FloatVectorOperations::copy (dst, src, (int) data.numSamples); - } - } - - ++totalInputChans; - } - } - } - else - { - auto numChans = jmin (pluginInstance->getChannelCountOfBus (true, bus), plugInInputChannels - totalInputChans); - - for (int i = 0; i < numChans; ++i) - { - if (auto* tmpBuffer = getTmpBufferForChannel (totalInputChans, data.numSamples)) - { - tmpBufferNeedsClearing = true; - channelList.set (totalInputChans++, tmpBuffer); - } - else - return; - } - } - } - } - - if (tmpBufferNeedsClearing) - ChooseBufferHelper::impl (emptyBufferFloat, emptyBufferDouble).clear(); - - AudioBuffer buffer; - - if (int totalChans = jmax (totalOutputChans, totalInputChans)) - buffer.setDataToReferTo (channelList.getRawDataPointer(), totalChans, (int) data.numSamples); + jassert ((int) buffer.getNumChannels() == jmax (pluginInstance->getTotalNumInputChannels(), + pluginInstance->getTotalNumOutputChannels())); { const ScopedLock sl (pluginInstance->getCallbackLock()); @@ -3380,16 +3483,12 @@ private: } else { - if (totalInputChans == pluginInstance->getTotalNumInputChannels() - && totalOutputChans == pluginInstance->getTotalNumOutputChannels()) - { - // processBlockBypassed should only ever be called if the AudioProcessor doesn't - // return a valid parameter from getBypassParameter - if (pluginInstance->getBypassParameter() == nullptr && comPluginInstance->getBypassParameter()->getValue() >= 0.5f) - pluginInstance->processBlockBypassed (buffer, midiBuffer); - else - pluginInstance->processBlock (buffer, midiBuffer); - } + // processBlockBypassed should only ever be called if the AudioProcessor doesn't + // return a valid parameter from getBypassParameter + if (pluginInstance->getBypassParameter() == nullptr && comPluginInstance->getBypassParameter()->getValue() >= 0.5f) + pluginInstance->processBlockBypassed (buffer, midiBuffer); + else + pluginInstance->processBlock (buffer, midiBuffer); } #if JUCE_DEBUG && (! JucePlugin_ProducesMidiOutput) @@ -3413,44 +3512,6 @@ private: } //============================================================================== - template - void allocateChannelListAndBuffers (Array& channelList, AudioBuffer& buffer) - { - channelList.clearQuick(); - channelList.insertMultiple (0, nullptr, 128); - - auto& p = getPluginInstance(); - buffer.setSize (jmax (p.getTotalNumInputChannels(), p.getTotalNumOutputChannels()), p.getBlockSize() * 4); - buffer.clear(); - } - - template - void deallocateChannelListAndBuffers (Array& channelList, AudioBuffer& buffer) - { - channelList.clearQuick(); - channelList.resize (0); - buffer.setSize (0, 0); - } - - template - static FloatType** getPointerForAudioBus (Vst::AudioBusBuffers& data) noexcept - { - return AudioBusPointerHelper::impl (data); - } - - template - FloatType* getTmpBufferForChannel (int channel, int numSamples) noexcept - { - auto& buffer = ChooseBufferHelper::impl (emptyBufferFloat, emptyBufferDouble); - - // we can't do anything if the host requests to render many more samples than the - // block size, we need to bail out - if (numSamples > buffer.getNumSamples() || channel >= buffer.getNumChannels()) - return nullptr; - - return buffer.getWritePointer (channel); - } - Steinberg::uint32 PLUGIN_API getProcessContextRequirements() override { return kNeedSystemTime @@ -3466,17 +3527,43 @@ private: | kNeedTransportState; } - void preparePlugin (double sampleRate, int bufferSize) + void preparePlugin (double sampleRate, int bufferSize, CallPrepareToPlay callPrepareToPlay) { auto& p = getPluginInstance(); p.setRateAndBufferSizeDetails (sampleRate, bufferSize); - p.prepareToPlay (sampleRate, bufferSize); + + if (callPrepareToPlay == CallPrepareToPlay::yes) + p.prepareToPlay (sampleRate, bufferSize); midiBuffer.ensureSize (2048); midiBuffer.clear(); + + bufferMapper.updateFromProcessor (p); + bufferMapper.prepare (bufferSize); } + //============================================================================== + #if JucePlugin_Enable_ARA + const ARA::ARAFactory* PLUGIN_API getFactory() SMTG_OVERRIDE + { + return createARAFactory(); + } + + const ARA::ARAPlugInExtensionInstance* PLUGIN_API bindToDocumentController (ARA::ARADocumentControllerRef /*controllerRef*/) SMTG_OVERRIDE + { + ARA_VALIDATE_API_STATE (false && "call is deprecated in ARA 2, host must not call this"); + return nullptr; + } + + const ARA::ARAPlugInExtensionInstance* PLUGIN_API bindToDocumentControllerWithRoles (ARA::ARADocumentControllerRef documentControllerRef, + ARA::ARAPlugInInstanceRoleFlags knownRoles, ARA::ARAPlugInInstanceRoleFlags assignedRoles) SMTG_OVERRIDE + { + AudioProcessorARAExtension* araAudioProcessorExtension = dynamic_cast (pluginInstance); + return araAudioProcessorExtension->bindToARA (documentControllerRef, knownRoles, assignedRoles); + } + #endif + //============================================================================== ScopedJuceInitialiser_GUI libraryInitialiser; @@ -3492,7 +3579,9 @@ private: struct LockedVSTComSmartPtr { LockedVSTComSmartPtr() = default; - LockedVSTComSmartPtr (const VSTComSmartPtr& ptrIn) : ptr (ptrIn) {} + LockedVSTComSmartPtr (const VSTComSmartPtr& ptrIn) : ptr (ptrIn) {} + LockedVSTComSmartPtr (const LockedVSTComSmartPtr&) = default; + LockedVSTComSmartPtr& operator= (const LockedVSTComSmartPtr&) = default; ~LockedVSTComSmartPtr() { @@ -3528,11 +3617,9 @@ private: Vst::ProcessSetup processSetup; MidiBuffer midiBuffer; - Array channelListFloat; - Array channelListDouble; + ClientBufferMapper bufferMapper; - AudioBuffer emptyBufferFloat; - AudioBuffer emptyBufferDouble; + bool active = false; #if JucePlugin_WantsMidiInput std::atomic isMidiInputBusEnabled { true }; @@ -3575,6 +3662,11 @@ DEF_CLASS_IID (JuceAudioProcessor) DEF_CLASS_IID (JuceVST3Component) #endif +#if JucePlugin_Enable_ARA + DECLARE_CLASS_IID (JuceARAFactory, 0xABCDEF01, 0xA1B2C3D4, JucePlugin_ManufacturerCode, JucePlugin_PluginCode) + DEF_CLASS_IID (JuceARAFactory) +#endif + JUCE_END_IGNORE_WARNINGS_MSVC JUCE_END_IGNORE_WARNINGS_GCC_LIKE @@ -3604,8 +3696,12 @@ bool shutdownModule() #endif #if JUCE_WINDOWS + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") + extern "C" __declspec (dllexport) bool InitDll() { return initModule(); } extern "C" __declspec (dllexport) bool ExitDll() { return shutdownModule(); } + + JUCE_END_IGNORE_WARNINGS_GCC_LIKE #elif JUCE_LINUX || JUCE_BSD void* moduleHandle = nullptr; int moduleEntryCounter = 0; @@ -3699,6 +3795,13 @@ static FUnknown* createControllerInstance (Vst::IHostApplication* host) return static_cast (new JuceVST3EditController (host)); } +#if JucePlugin_Enable_ARA + static FUnknown* createARAFactoryInstance (Vst::IHostApplication* /*host*/) + { + return static_cast (new JuceARAFactory()); + } +#endif + //============================================================================== struct JucePluginFactory; static JucePluginFactory* globalFactory = nullptr; @@ -3971,6 +4074,20 @@ extern "C" SMTG_EXPORT_SYMBOL IPluginFactory* PLUGIN_API GetPluginFactory() kVstVersionString); globalFactory->registerClass (controllerClass, createControllerInstance); + + #if JucePlugin_Enable_ARA + static const PClassInfo2 araFactoryClass (JuceARAFactory::iid, + PClassInfo::kManyInstances, + kARAMainFactoryClass, + JucePlugin_Name, + JucePlugin_Vst3ComponentFlags, + JucePlugin_Vst3Category, + JucePlugin_Manufacturer, + JucePlugin_VersionString, + kVstVersionString); + + globalFactory->registerClass (araFactoryClass, createARAFactoryInstance); + #endif } else { @@ -3982,7 +4099,11 @@ extern "C" SMTG_EXPORT_SYMBOL IPluginFactory* PLUGIN_API GetPluginFactory() //============================================================================== #if JUCE_WINDOWS +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") + extern "C" BOOL WINAPI DllMain (HINSTANCE instance, DWORD reason, LPVOID) { if (reason == DLL_PROCESS_ATTACH) Process::setCurrentModuleInstanceHandle (instance); return true; } + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif JUCE_END_NO_SANITIZE diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client.h b/modules/juce_audio_plugin_client/juce_audio_plugin_client.h index 1171fdae..8927823f 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client.h +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,9 +35,9 @@ ID: juce_audio_plugin_client vendor: juce - version: 6.1.6 + version: 7.0.0 name: JUCE audio plugin wrapper classes - description: Classes for building VST, VST3, AudioUnit, AAX and RTAS plugins. + description: Classes for building VST, VST3, AU, AUv3 and AAX plugins. website: http://www.juce.com/juce license: GPL/Commercial minimumCppStandard: 14 @@ -128,3 +128,7 @@ #endif #include "utility/juce_CreatePluginFilter.h" + +#if JucePlugin_Enable_ARA + #include "ARA/juce_ARA_Wrapper.h" +#endif diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.cpp index 872da717..dab46ad5 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.cpp +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.mm b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.mm index e7b5d34d..58f3b0d9 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.mm +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_3.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_ARA.cpp similarity index 66% rename from modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_3.cpp rename to modules/juce_audio_plugin_client/juce_audio_plugin_client_ARA.cpp index 42477b9b..ec83d19a 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_3.cpp +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_ARA.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,4 +23,4 @@ ============================================================================== */ -#include "RTAS/juce_RTAS_DigiCode2.cpp" +#include "ARA/juce_ARA_Wrapper.cpp" diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r index c8cfc385..06eb4cd5 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -48,23 +48,3 @@ #define ENTRY_POINT JucePlugin_AUExportPrefixQuoted "Entry" #include "AUResources.r" - -//============================================================================== -// component resources for Audio Unit Carbon View - -#ifndef BUILD_AU_CARBON_UI - #define BUILD_AU_CARBON_UI 1 -#endif - -#if BUILD_AU_CARBON_UI - #define RES_ID 2000 - #define COMP_TYPE kAudioUnitCarbonViewComponentType - #define COMP_SUBTYPE JucePlugin_AUSubType - #define COMP_MANUF JucePlugin_AUManufacturerCode - #define VERSION JucePlugin_VersionCode - #define NAME JucePlugin_Manufacturer ": " JucePlugin_Name " View" - #define DESCRIPTION NAME - #define ENTRY_POINT JucePlugin_AUExportPrefixQuoted "ViewEntry" - - #include "AUResources.r" -#endif diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm index c7217f94..edb490a8 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_2.mm b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_2.mm index 1b5be02f..d36d18b2 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_2.mm +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_2.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -62,9 +62,6 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wparentheses", #include "AU/CoreAudioUtilityClasses/AUBase.cpp" #include "AU/CoreAudioUtilityClasses/AUBuffer.cpp" -#include "AU/CoreAudioUtilityClasses/AUCarbonViewBase.cpp" -#include "AU/CoreAudioUtilityClasses/AUCarbonViewControl.cpp" -#include "AU/CoreAudioUtilityClasses/AUCarbonViewDispatch.cpp" #include "AU/CoreAudioUtilityClasses/AUDispatch.cpp" #include "AU/CoreAudioUtilityClasses/AUInputElement.cpp" #include "AU/CoreAudioUtilityClasses/AUMIDIBase.cpp" @@ -76,7 +73,6 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wparentheses", #include "AU/CoreAudioUtilityClasses/CAMutex.cpp" #include "AU/CoreAudioUtilityClasses/CAStreamBasicDescription.cpp" #include "AU/CoreAudioUtilityClasses/CAVectorUnit.cpp" -#include "AU/CoreAudioUtilityClasses/CarbonEventHandler.cpp" #include "AU/CoreAudioUtilityClasses/ComponentBase.cpp" #include "AU/CoreAudioUtilityClasses/MusicDeviceBase.cpp" diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm index 11cd7352..ec742fff 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_2.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp similarity index 66% rename from modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_2.cpp rename to modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp index f1bcd904..717bb795 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_2.cpp +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,4 +23,4 @@ ============================================================================== */ -#include "RTAS/juce_RTAS_DigiCode1.cpp" +#include "LV2/juce_LV2_Client.cpp" diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_4.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.mm similarity index 66% rename from modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_4.cpp rename to modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.mm index 6fa1d7dc..a5e66939 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_4.cpp +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_LV2.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -23,4 +23,4 @@ ============================================================================== */ -#include "RTAS/juce_RTAS_DigiCode3.cpp" +#include "juce_audio_plugin_client_LV2.cpp" diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r b/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r deleted file mode 100644 index ad01d4d5..00000000 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r +++ /dev/null @@ -1,7 +0,0 @@ - -/* - This dummy file is added to the resources section of the project to - force Xcode to create some resources for the dpm. If there aren't any - resources, PT will refuse to load the plugin.. -*/ - diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.cpp deleted file mode 100644 index d424fcc4..00000000 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include "RTAS/juce_RTAS_WinUtilities.cpp" diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.mm b/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.mm deleted file mode 100644 index 57ad81f3..00000000 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.mm +++ /dev/null @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -#include "RTAS/juce_RTAS_MacUtilities.mm" diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp index 98bac498..0eaf4685 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_Unity.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_Unity.cpp index 04c59622..06675451 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_Unity.cpp +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_Unity.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST2.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST2.cpp index 2d8015ea..befb88f1 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST2.cpp +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST2.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp index a22bbb49..100cc0cf 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST_utils.mm b/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST_utils.mm index ab1a4c86..bff23507 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST_utils.mm +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST_utils.mm @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_utils.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_utils.cpp index ea11fdbe..520c8bb8 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_utils.cpp +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_utils.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h b/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h deleted file mode 100644 index f52c4e75..00000000 --- a/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited - - JUCE is an open source library subject to commercial or open-source - licensing. - - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). - - End User License Agreement: www.juce.com/juce-6-licence - Privacy Policy: www.juce.com/juce-privacy-policy - - Or: You may also use this code under the terms of the GPL v3 (see - www.gnu.org/licenses). - - JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER - EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE - DISCLAIMED. - - ============================================================================== -*/ - -namespace juce -{ - -//============================================================================== -#if JUCE_SUPPORT_CARBON && JUCE_MAC_WINDOW_VISIBITY_BODGE - -/* When you wrap a WindowRef as an NSWindow, it seems to bugger up the HideWindow - function, so when the host tries (and fails) to hide the window, this stuff catches - the event and forces it to update. -*/ -static pascal OSStatus windowVisibilityBodge (EventHandlerCallRef, EventRef e, void* user) -{ - NSWindow* hostWindow = (NSWindow*) user; - - switch (GetEventKind (e)) - { - case kEventWindowInit: [hostWindow display]; break; - case kEventWindowShown: [hostWindow orderFront: nil]; break; - case kEventWindowHidden: [hostWindow orderOut: nil]; break; - } - - return eventNotHandledErr; -} - -inline void attachWindowHidingHooks (Component* comp, void* hostWindowRef, NSWindow* nsWindow) -{ - const EventTypeSpec eventsToCatch[] = - { - { kEventClassWindow, kEventWindowInit }, - { kEventClassWindow, kEventWindowShown }, - { kEventClassWindow, kEventWindowHidden } - }; - - EventHandlerRef ref; - InstallWindowEventHandler ((WindowRef) hostWindowRef, - NewEventHandlerUPP (windowVisibilityBodge), - GetEventTypeCount (eventsToCatch), eventsToCatch, - (void*) nsWindow, &ref); - - comp->getProperties().set ("carbonEventRef", String::toHexString ((pointer_sized_int) (void*) ref)); -} - -inline void removeWindowHidingHooks (Component* comp) -{ - if (comp != nullptr) - RemoveEventHandler ((EventHandlerRef) (void*) (pointer_sized_int) - comp->getProperties() ["carbonEventRef"].toString().getHexValue64()); -} - -#elif JUCE_MAC - inline void attachWindowHidingHooks (void*, void*, void*) {} - inline void removeWindowHidingHooks (void*) {} -#endif - -} // namespace juce diff --git a/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h b/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h index baaa59f0..43808746 100644 --- a/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h +++ b/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -27,10 +27,9 @@ // define all your plugin settings properly.. #if ! (JucePlugin_Build_VST || JucePlugin_Build_VST3 \ - || JucePlugin_Build_AU || JucePlugin_Build_AUv3 \ - ||JucePlugin_Build_RTAS || JucePlugin_Build_AAX \ - || JucePlugin_Build_Standalone || JucePlugin_Build_LV2 \ - || JucePlugin_Build_Unity) + || JucePlugin_Build_AU || JucePlugin_Build_AUv3 \ + || JucePlugin_Build_AAX || JucePlugin_Build_Standalone \ + || JucePlugin_Build_LV2 || JucePlugin_Build_Unity) #error "You need to enable at least one plugin format!" #endif @@ -68,16 +67,6 @@ #endif //============================================================================== -#if _WIN64 || (__LP64__ && (defined (__APPLE_CPP__) || defined (__APPLE_CC__))) - #undef JucePlugin_Build_RTAS - #define JucePlugin_Build_RTAS 0 -#endif - -//============================================================================== -#if JucePlugin_Build_LV2 && ! defined (JucePlugin_LV2URI) - #error "You need to define the JucePlugin_LV2URI value!" -#endif - #if JucePlugin_Build_AAX && ! defined (JucePlugin_AAXIdentifier) #error "You need to define the JucePlugin_AAXIdentifier value!" #endif diff --git a/modules/juce_audio_plugin_client/utility/juce_CreatePluginFilter.h b/modules/juce_audio_plugin_client/utility/juce_CreatePluginFilter.h index 0722f52d..a5b7a1f5 100644 --- a/modules/juce_audio_plugin_client/utility/juce_CreatePluginFilter.h +++ b/modules/juce_audio_plugin_client/utility/juce_CreatePluginFilter.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -25,11 +25,6 @@ #pragma once -/** Somewhere in the codebase of your plugin, you need to implement this function - and make it return a new instance of the filter subclass that you're building. -*/ -juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter(); - namespace juce { @@ -42,6 +37,10 @@ inline AudioProcessor* JUCE_API JUCE_CALLTYPE createPluginFilterOfType (AudioPro // your createPluginFilter() method must return an object! jassert (pluginInstance != nullptr && pluginInstance->wrapperType == type); + #if JucePlugin_Enable_ARA + jassert (dynamic_cast (pluginInstance) != nullptr); + #endif + return pluginInstance; } diff --git a/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h b/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h index 4b36f6d6..70547cbe 100644 --- a/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h +++ b/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h b/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h index dbc57db4..6878aafa 100644 --- a/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h +++ b/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -41,10 +41,6 @@ #include #include #elif JUCE_MAC || JUCE_IOS - #if ! (defined (JUCE_SUPPORT_CARBON) || defined (__LP64__)) - #define JUCE_SUPPORT_CARBON 1 - #endif - #ifdef __OBJC__ #if JUCE_MAC #include @@ -55,10 +51,6 @@ #endif #endif - #if JUCE_SUPPORT_CARBON && (! JUCE_IOS) - #include - #endif - #include #include #include diff --git a/modules/juce_audio_plugin_client/utility/juce_LinuxMessageThread.h b/modules/juce_audio_plugin_client/utility/juce_LinuxMessageThread.h index 289ffeae..646d0728 100644 --- a/modules/juce_audio_plugin_client/utility/juce_LinuxMessageThread.h +++ b/modules/juce_audio_plugin_client/utility/juce_LinuxMessageThread.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -99,6 +99,35 @@ private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MessageThread) }; +//============================================================================== +/** @internal */ +class HostDrivenEventLoop +{ +public: + HostDrivenEventLoop() + { + messageThread->stop(); + MessageManager::getInstance()->setCurrentThreadAsMessageThread(); + } + + void processPendingEvents() + { + MessageManager::getInstance()->setCurrentThreadAsMessageThread(); + + for (;;) + if (! dispatchNextMessageOnSystemQueue (true)) + return; + } + + ~HostDrivenEventLoop() + { + messageThread->start(); + } + +private: + SharedResourcePointer messageThread; +}; + } // namespace juce #endif diff --git a/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp b/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp index 23236a69..d2a885fa 100644 --- a/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp +++ b/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -35,6 +35,7 @@ namespace juce { #if JucePlugin_Build_Unity + bool juce_isRunningInUnity(); bool juce_isRunningInUnity() { return PluginHostType::getPluginLoadedAs() == AudioProcessor::wrapperType_Unity; } #endif @@ -131,6 +132,7 @@ namespace juce #endif #if JucePlugin_Build_VST + bool JUCE_API handleManufacturerSpecificVST2Opcode (int32 index, pointer_sized_int value, void* ptr, float); bool JUCE_API handleManufacturerSpecificVST2Opcode (int32 index, pointer_sized_int value, void* ptr, float) { #if VST3_REPLACEMENT_AVAILABLE diff --git a/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h b/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h index 58322b92..4e947569 100644 --- a/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h +++ b/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp b/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp index 6d728a34..75fce26a 100644 --- a/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp +++ b/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see diff --git a/modules/juce_audio_processors/format/juce_AudioPluginFormat.h b/modules/juce_audio_processors/format/juce_AudioPluginFormat.h index 8ada0200..0782294f 100644 --- a/modules/juce_audio_processors/format/juce_AudioPluginFormat.h +++ b/modules/juce_audio_processors/format/juce_AudioPluginFormat.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -140,6 +140,18 @@ public: /** Returns true if instantiation of this plugin type must be done from a non-message thread. */ virtual bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const = 0; + /** A callback lambda that is passed to getARAFactory() */ + using ARAFactoryCreationCallback = std::function; + + /** Tries to create an ::ARAFactoryWrapper for this description. + + The result of the operation will be wrapped into an ARAFactoryResult, + which will be passed to a callback object supplied by the caller. + + @see AudioPluginFormatManager::createARAFactoryAsync + */ + virtual void createARAFactoryAsync (const PluginDescription&, ARAFactoryCreationCallback callback) { callback ({}); } + protected: //============================================================================== friend class AudioPluginFormatManager; diff --git a/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp b/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp index 3da34840..9ba57bea 100644 --- a/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp +++ b/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -32,45 +32,83 @@ AudioPluginFormatManager::~AudioPluginFormatManager() {} //============================================================================== void AudioPluginFormatManager::addDefaultFormats() { + #if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD || JUCE_IOS) + #define HAS_VST 1 + #else + #define HAS_VST 0 + #endif + + #if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD) + #define HAS_VST3 1 + #else + #define HAS_VST3 0 + #endif + + #if JUCE_PLUGINHOST_AU && (JUCE_MAC || JUCE_IOS) + #define HAS_AU 1 + #else + #define HAS_AU 0 + #endif + + #if JUCE_PLUGINHOST_LADSPA && (JUCE_LINUX || JUCE_BSD) + #define HAS_LADSPA 1 + #else + #define HAS_LADSPA 0 + #endif + + #if JUCE_PLUGINHOST_LV2 && (JUCE_MAC || JUCE_LINUX || JUCE_BSD || JUCE_WINDOWS) + #define HAS_LV2 1 + #else + #define HAS_LV2 0 + #endif + #if JUCE_DEBUG // you should only call this method once! for (auto* format : formats) { ignoreUnused (format); - #if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD || JUCE_IOS) + #if HAS_VST jassert (dynamic_cast (format) == nullptr); #endif - #if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD) + #if HAS_VST3 jassert (dynamic_cast (format) == nullptr); #endif - #if JUCE_PLUGINHOST_AU && (JUCE_MAC || JUCE_IOS) + #if HAS_AU jassert (dynamic_cast (format) == nullptr); #endif - #if JUCE_PLUGINHOST_LADSPA && (JUCE_LINUX || JUCE_BSD) + #if HAS_LADSPA jassert (dynamic_cast (format) == nullptr); #endif + + #if HAS_LV2 + jassert (dynamic_cast (format) == nullptr); + #endif } #endif - #if JUCE_PLUGINHOST_AU && (JUCE_MAC || JUCE_IOS) + #if HAS_AU formats.add (new AudioUnitPluginFormat()); #endif - #if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD || JUCE_IOS) + #if HAS_VST formats.add (new VSTPluginFormat()); #endif - #if JUCE_PLUGINHOST_VST3 && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD) + #if HAS_VST3 formats.add (new VST3PluginFormat()); #endif - #if JUCE_PLUGINHOST_LADSPA && (JUCE_LINUX || JUCE_BSD) + #if HAS_LADSPA formats.add (new LADSPAPluginFormat()); #endif + + #if HAS_LV2 + formats.add (new LV2PluginFormat()); + #endif } int AudioPluginFormatManager::getNumFormats() const { return formats.size(); } @@ -98,6 +136,22 @@ std::unique_ptr AudioPluginFormatManager::createPluginInsta return {}; } +void AudioPluginFormatManager::createARAFactoryAsync (const PluginDescription& description, + AudioPluginFormat::ARAFactoryCreationCallback callback) const +{ + String errorMessage; + + if (auto* format = findFormatForDescription (description, errorMessage)) + { + format->createARAFactoryAsync (description, callback); + } + else + { + errorMessage = NEEDS_TRANS ("Couldn't find format for the provided description"); + callback ({ {}, std::move (errorMessage) }); + } +} + void AudioPluginFormatManager::createPluginInstanceAsync (const PluginDescription& description, double initialSampleRate, int initialBufferSize, AudioPluginFormat::PluginCreationCallback callback) diff --git a/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h b/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h index 65c12320..5be95d14 100644 --- a/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h +++ b/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h @@ -2,15 +2,15 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2020 - Raw Material Software Limited + Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. - By using JUCE, you agree to the terms of both the JUCE 6 End-User License - Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. - End User License Agreement: www.juce.com/juce-6-licence + End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see @@ -109,6 +109,22 @@ public: double initialSampleRate, int initialBufferSize, AudioPluginFormat::PluginCreationCallback callback); + /** Tries to create an ::ARAFactoryWrapper for this description. + + The result of the operation will be wrapped into an ARAFactoryResult, + which will be passed to a callback object supplied by the caller. + + The operation may fail, in which case the callback will be called with + with a result object where ARAFactoryResult::araFactory.get() will return + a nullptr. + + In case of success the returned ::ARAFactoryWrapper will ensure that + modules required for the correct functioning of the ARAFactory will remain + loaded for the lifetime of the object. + */ + void createARAFactoryAsync (const PluginDescription& description, + AudioPluginFormat::ARAFactoryCreationCallback callback) const; + /** Checks that the file or component for this plugin actually still exists. (This won't try to load the plugin) */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/README.md b/modules/juce_audio_processors/format_types/LV2_SDK/README.md new file mode 100644 index 00000000..133356c9 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/README.md @@ -0,0 +1,11 @@ +The source code for lilv and its dependent libraries have been copied into this +directory. The following modifications were made: + +- Removed files not strictly required to build the lilv library, + including generated config headers +- Added handwritten config headers +- Removed the include of dlfcn.h in world.c + +Remember to update the versions in the config headers if you ever update +the library versions! + diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/generate_lv2_bundle_sources.py b/modules/juce_audio_processors/format_types/LV2_SDK/generate_lv2_bundle_sources.py new file mode 100644 index 00000000..299361a4 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/generate_lv2_bundle_sources.py @@ -0,0 +1,157 @@ +# ============================================================================== +# +# This file is part of the JUCE library. +# Copyright (c) 2020 - Raw Material Software Limited +# +# JUCE is an open source library subject to commercial or open-source +# licensing. +# +# By using JUCE, you agree to the terms of both the JUCE 7 End-User License +# Agreement and JUCE Privacy Policy. +# +# End User License Agreement: www.juce.com/juce-7-licence +# Privacy Policy: www.juce.com/juce-privacy-policy +# +# Or: You may also use this code under the terms of the GPL v3 (see +# www.gnu.org/licenses). +# +# JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER +# EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE +# DISCLAIMED. +# +# ============================================================================== + +# This script is used to convert the data files from the LV2 distribution into +# a form suitable for inclusion in a C++ project. An LV2 host would normally +# expect these files to be installed on disk, but this places a burden on host +# developers to include these files in their product installers, and to install +# them to sensible locations. Instead of forcing host developers to handle this +# case, JUCE hosts will use the embedded copy of this data to write all of the +# files to a temporary location at runtime. + +import argparse +import os + +BUNDLE_TEMPLATE = """juce::lv2::Bundle +{{ +"{}", +{{ +{} +}} +}} +""" + +BUNDLE_RESOURCE_TEMPLATE = """juce::lv2::BundleResource +{{ +"{}", +{} +}} +""" + +FUNCTION_TEMPLATE = """/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +/* + This file is auto-generated by generate_lv2_bundle_sources.py. +*/ + +#pragma once + +#ifndef DOXYGEN + +#include + +namespace juce +{{ +namespace lv2 +{{ + +struct BundleResource +{{ + const char* name; + const char* contents; +}}; + +struct Bundle +{{ + const char* name; + std::vector contents; + + static std::vector getAllBundles(); +}}; + +}} +}} + +std::vector juce::lv2::Bundle::getAllBundles() +{{ + return {{ +{} +}}; +}} + +#endif""" + + +def chunks(lst, n): + for i in range(0, len(lst), n): + yield lst[i:i + n] + + +def get_chunked_string_literal(s): + return ' '.join(map(lambda x: 'R"lv2ttl({})lv2ttl"'.format(''.join(x)), chunks(s, 8000))) + + +def get_file_source_string(ttl): + with open(ttl) as f: + return BUNDLE_RESOURCE_TEMPLATE.format(os.path.basename(ttl), + get_chunked_string_literal(f.read())) + + +def generate_bundle_source(root, files): + if len(files) == 0: + return "" + + return BUNDLE_TEMPLATE.format(os.path.basename(root), + ", ".join(get_file_source_string(os.path.join(root, ttl)) for ttl in files)) + +def filter_turtle(files): + return [f for f in files if f.endswith(".ttl")] + + +def filter_ttl_files(lv2_dir): + for root, _, files in os.walk(args.lv2_dir): + yield root, filter_turtle(files) + + +parser = argparse.ArgumentParser() +parser.add_argument("lv2_dir") +args = parser.parse_args() + +print(FUNCTION_TEMPLATE.format(", ".join(generate_bundle_source(root, files) + for root, files in filter_ttl_files(args.lv2_dir) + if len(files) != 0)) + .replace("\t", " "), + end = "\r\n") diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h b/modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h new file mode 100644 index 00000000..8f2260d0 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/juce_lv2_config.h @@ -0,0 +1,78 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +/* + This header contains preprocessor config flags that would normally be + generated by the build systems of the various LV2 libraries. + + Rather than using the generated platform-dependent headers, we use JUCE's + platform detection macros to pick the right config values at build time. +*/ + +#pragma once + +#define LILV_DYN_MANIFEST +#define LILV_STATIC +#define LV2_STATIC +#define SERD_STATIC +#define SORD_STATIC +#define SRATOM_STATIC +#define ZIX_STATIC + +#define LILV_VERSION "0.24.12" +#define SERD_VERSION "0.30.10" +#define SORD_VERSION "0.16.9" + +#define LILV_CXX 1 + +#if JUCE_WINDOWS + #define LILV_DIR_SEP "\\" + #define LILV_PATH_SEP ";" +#else + #define LILV_DIR_SEP "/" + #define LILV_PATH_SEP ":" +#endif + +#ifndef LILV_DEFAULT_LV2_PATH + #if JUCE_MAC || JUCE_IOS + #define LILV_DEFAULT_LV2_PATH \ + "~/Library/Audio/Plug-Ins/LV2" LILV_PATH_SEP \ + "~/.lv2" LILV_PATH_SEP \ + "/usr/local/lib/lv2" LILV_PATH_SEP \ + "/usr/lib/lv2" LILV_PATH_SEP \ + "/Library/Audio/Plug-Ins/LV2" + #elif JUCE_WINDOWS + #define LILV_DEFAULT_LV2_PATH \ + "%APPDATA%\\LV2" LILV_PATH_SEP \ + "%COMMONPROGRAMFILES%\\LV2" + #elif JUCE_LINUX || JUCE_ANDROID + #define LILV_DEFAULT_LV2_PATH \ + "~/.lv2" LILV_PATH_SEP \ + "/usr/lib/lv2" LILV_PATH_SEP \ + "/usr/local/lib/lv2" + #else + #error "Unsupported platform" + #endif +#endif diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/COPYING b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/COPYING new file mode 100644 index 00000000..9748bb93 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/COPYING @@ -0,0 +1,13 @@ +Copyright 2011-2021 David Robillard + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h new file mode 100644 index 00000000..5fd7a9f2 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilv.h @@ -0,0 +1,2117 @@ +/* + Copyright 2007-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/// @file lilv.h API for Lilv, a lightweight LV2 host library. + +#ifndef LILV_LILV_H +#define LILV_LILV_H + +#include "lv2/core/lv2.h" +#include "lv2/urid/urid.h" + +#include +#include +#include +#include + +#if defined(_WIN32) && !defined(LILV_STATIC) && defined(LILV_INTERNAL) +# define LILV_API __declspec(dllexport) +#elif defined(_WIN32) && !defined(LILV_STATIC) +# define LILV_API __declspec(dllimport) +#elif defined(__GNUC__) +# define LILV_API __attribute__((visibility("default"))) +#else +# define LILV_API +#endif + +#if defined(__GNUC__) && \ + (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +# define LILV_DEPRECATED __attribute__((__deprecated__)) +#else +# define LILV_DEPRECATED +#endif + +#ifdef __cplusplus +extern "C" { +# if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +# endif +#endif + +#define LILV_NS_DOAP "http://usefulinc.com/ns/doap#" +#define LILV_NS_FOAF "http://xmlns.com/foaf/0.1/" +#define LILV_NS_LILV "http://drobilla.net/ns/lilv#" +#define LILV_NS_LV2 "http://lv2plug.in/ns/lv2core#" +#define LILV_NS_OWL "http://www.w3.org/2002/07/owl#" +#define LILV_NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#" +#define LILV_NS_RDFS "http://www.w3.org/2000/01/rdf-schema#" +#define LILV_NS_XSD "http://www.w3.org/2001/XMLSchema#" + +#define LILV_URI_ATOM_PORT "http://lv2plug.in/ns/ext/atom#AtomPort" +#define LILV_URI_AUDIO_PORT "http://lv2plug.in/ns/lv2core#AudioPort" +#define LILV_URI_CONTROL_PORT "http://lv2plug.in/ns/lv2core#ControlPort" +#define LILV_URI_CV_PORT "http://lv2plug.in/ns/lv2core#CVPort" +#define LILV_URI_EVENT_PORT "http://lv2plug.in/ns/ext/event#EventPort" +#define LILV_URI_INPUT_PORT "http://lv2plug.in/ns/lv2core#InputPort" +#define LILV_URI_MIDI_EVENT "http://lv2plug.in/ns/ext/midi#MidiEvent" +#define LILV_URI_OUTPUT_PORT "http://lv2plug.in/ns/lv2core#OutputPort" +#define LILV_URI_PORT "http://lv2plug.in/ns/lv2core#Port" + +struct LilvInstanceImpl; + +/** + @defgroup lilv Lilv C API + This is the complete public C API of lilv. + @{ +*/ + +typedef struct LilvPluginImpl LilvPlugin; /**< LV2 Plugin. */ +typedef struct LilvPluginClassImpl LilvPluginClass; /**< Plugin Class. */ +typedef struct LilvPortImpl LilvPort; /**< Port. */ +typedef struct LilvScalePointImpl LilvScalePoint; /**< Scale Point. */ +typedef struct LilvUIImpl LilvUI; /**< Plugin UI. */ +typedef struct LilvNodeImpl LilvNode; /**< Typed Value. */ +typedef struct LilvWorldImpl LilvWorld; /**< Lilv World. */ +typedef struct LilvInstanceImpl LilvInstance; /**< Plugin instance. */ +typedef struct LilvStateImpl LilvState; /**< Plugin state. */ + +typedef void LilvIter; /**< Collection iterator */ +typedef void LilvPluginClasses; /**< A set of #LilvPluginClass. */ +typedef void LilvPlugins; /**< A set of #LilvPlugin. */ +typedef void LilvScalePoints; /**< A set of #LilvScalePoint. */ +typedef void LilvUIs; /**< A set of #LilvUI. */ +typedef void LilvNodes; /**< A set of #LilvNode. */ + +/** + Free memory allocated by Lilv. + + This function exists because some systems require memory allocated by a + library to be freed by code in the same library. It is otherwise equivalent + to the standard C free() function. +*/ +LILV_API +void +lilv_free(void* ptr); + +/** + @defgroup lilv_node Nodes + @{ +*/ + +/** + Convert a file URI string to a local path string. + + For example, "file://foo/bar/baz.ttl" returns "/foo/bar/baz.ttl". + Return value is shared and must not be deleted by caller. + This function does not handle escaping correctly and should not be used for + general file URIs. Use lilv_file_uri_parse() instead. + + @return `uri` converted to a path, or NULL on failure (URI is not local). +*/ +LILV_API +LILV_DEPRECATED +const char* +lilv_uri_to_path(const char* uri); + +/** + Convert a file URI string to a local path string. + + For example, "file://foo/bar%20one/baz.ttl" returns "/foo/bar one/baz.ttl". + Return value must be freed by caller with lilv_free(). + + @param uri The file URI to parse. + @param hostname If non-NULL, set to the hostname in the URI, if any. + @return `uri` converted to a path, or NULL on failure (URI is not local). +*/ +LILV_API +char* +lilv_file_uri_parse(const char* uri, char** hostname); + +/** + Create a new URI value. + + Returned value must be freed by caller with lilv_node_free(). +*/ +LILV_API +LilvNode* +lilv_new_uri(LilvWorld* world, const char* uri); + +/** + Create a new file URI value. + + Relative paths are resolved against the current working directory. Note + that this may yield unexpected results if `host` is another machine. + + @param world The world. + @param host Host name, or NULL. + @param path Path on host. + @return A new node that must be freed by caller. +*/ +LILV_API +LilvNode* +lilv_new_file_uri(LilvWorld* world, const char* host, const char* path); + +/** + Create a new string value (with no language). + + Returned value must be freed by caller with lilv_node_free(). +*/ +LILV_API +LilvNode* +lilv_new_string(LilvWorld* world, const char* str); + +/** + Create a new integer value. + + Returned value must be freed by caller with lilv_node_free(). +*/ +LILV_API +LilvNode* +lilv_new_int(LilvWorld* world, int val); + +/** + Create a new floating point value. + + Returned value must be freed by caller with lilv_node_free(). +*/ +LILV_API +LilvNode* +lilv_new_float(LilvWorld* world, float val); + +/** + Create a new boolean value. + + Returned value must be freed by caller with lilv_node_free(). +*/ +LILV_API +LilvNode* +lilv_new_bool(LilvWorld* world, bool val); + +/** + Free a LilvNode. + + It is safe to call this function on NULL. +*/ +LILV_API +void +lilv_node_free(LilvNode* val); + +/** + Duplicate a LilvNode. +*/ +LILV_API +LilvNode* +lilv_node_duplicate(const LilvNode* val); + +/** + Return whether two values are equivalent. +*/ +LILV_API +bool +lilv_node_equals(const LilvNode* value, const LilvNode* other); + +/** + Return this value as a Turtle/SPARQL token. + + Returned value must be freed by caller with lilv_free(). + + Example tokens: + + - URI: <http://example.org/foo> + - QName: doap:name + - String: "this is a string" + - Float: 1.0 + - Integer: 1 + - Boolean: true +*/ +LILV_API +char* +lilv_node_get_turtle_token(const LilvNode* value); + +/** + Return whether the value is a URI (resource). +*/ +LILV_API +bool +lilv_node_is_uri(const LilvNode* value); + +/** + Return this value as a URI string, like "http://example.org/foo". + + Valid to call only if `lilv_node_is_uri(value)` returns true. + Returned value is owned by `value` and must not be freed by caller. +*/ +LILV_API +const char* +lilv_node_as_uri(const LilvNode* value); + +/** + Return whether the value is a blank node (resource with no URI). +*/ +LILV_API +bool +lilv_node_is_blank(const LilvNode* value); + +/** + Return this value as a blank node identifier, like "genid03". + + Valid to call only if `lilv_node_is_blank(value)` returns true. + Returned value is owned by `value` and must not be freed by caller. +*/ +LILV_API +const char* +lilv_node_as_blank(const LilvNode* value); + +/** + Return whether this value is a literal (that is, not a URI). + + Returns true if `value` is a string or numeric value. +*/ +LILV_API +bool +lilv_node_is_literal(const LilvNode* value); + +/** + Return whether this value is a string literal. + + Returns true if `value` is a string value (and not numeric). +*/ +LILV_API +bool +lilv_node_is_string(const LilvNode* value); + +/** + Return `value` as a string. +*/ +LILV_API +const char* +lilv_node_as_string(const LilvNode* value); + +/** + Return the path of a file URI node. + + Returns NULL if `value` is not a file URI. + Returned value must be freed by caller with lilv_free(). +*/ +LILV_API +char* +lilv_node_get_path(const LilvNode* value, char** hostname); + +/** + Return whether this value is a decimal literal. +*/ +LILV_API +bool +lilv_node_is_float(const LilvNode* value); + +/** + Return `value` as a float. + + Valid to call only if `lilv_node_is_float(value)` or + `lilv_node_is_int(value)` returns true. +*/ +LILV_API +float +lilv_node_as_float(const LilvNode* value); + +/** + Return whether this value is an integer literal. +*/ +LILV_API +bool +lilv_node_is_int(const LilvNode* value); + +/** + Return `value` as an integer. + + Valid to call only if `lilv_node_is_int(value)` returns true. +*/ +LILV_API +int +lilv_node_as_int(const LilvNode* value); + +/** + Return whether this value is a boolean. +*/ +LILV_API +bool +lilv_node_is_bool(const LilvNode* value); + +/** + Return `value` as a bool. + + Valid to call only if `lilv_node_is_bool(value)` returns true. +*/ +LILV_API +bool +lilv_node_as_bool(const LilvNode* value); + +/** + @} + @defgroup lilv_collections Collections + + Lilv has several collection types for holding various types of value. + Each collection type supports a similar basic API, except #LilvPlugins which + is internal and thus lacks a free function: + + - void PREFIX_free (coll) + - unsigned PREFIX_size (coll) + - LilvIter* PREFIX_begin (coll) + + The types of collection are: + + - LilvPlugins, with function prefix `lilv_plugins_`. + - LilvPluginClasses, with function prefix `lilv_plugin_classes_`. + - LilvScalePoints, with function prefix `lilv_scale_points_`. + - LilvNodes, with function prefix `lilv_nodes_`. + - LilvUIs, with function prefix `lilv_uis_`. + + @{ +*/ + +/* Collections */ + +/** + Iterate over each element of a collection. + + @code + LILV_FOREACH(plugin_classes, i, classes) { + LilvPluginClass c = lilv_plugin_classes_get(classes, i); + // ... + } + @endcode +*/ +#define LILV_FOREACH(colltype, iter, collection) \ + for (LilvIter* iter = lilv_##colltype##_begin(collection); \ + !lilv_##colltype##_is_end(collection, iter); \ + (iter) = lilv_##colltype##_next(collection, iter)) + +/* LilvPluginClasses */ + +LILV_API +void +lilv_plugin_classes_free(LilvPluginClasses* collection); + +LILV_API +unsigned +lilv_plugin_classes_size(const LilvPluginClasses* collection); + +LILV_API +LilvIter* +lilv_plugin_classes_begin(const LilvPluginClasses* collection); + +LILV_API +const LilvPluginClass* +lilv_plugin_classes_get(const LilvPluginClasses* collection, LilvIter* i); + +LILV_API +LilvIter* +lilv_plugin_classes_next(const LilvPluginClasses* collection, LilvIter* i); + +LILV_API +bool +lilv_plugin_classes_is_end(const LilvPluginClasses* collection, LilvIter* i); + +/** + Get a plugin class from `classes` by URI. + + Return value is shared (stored in `classes`) and must not be freed or + modified by the caller in any way. + + @return NULL if no plugin class with `uri` is found in `classes`. +*/ +LILV_API +const LilvPluginClass* +lilv_plugin_classes_get_by_uri(const LilvPluginClasses* classes, + const LilvNode* uri); + +/* ScalePoints */ + +LILV_API +void +lilv_scale_points_free(LilvScalePoints* collection); + +LILV_API +unsigned +lilv_scale_points_size(const LilvScalePoints* collection); + +LILV_API +LilvIter* +lilv_scale_points_begin(const LilvScalePoints* collection); + +LILV_API +const LilvScalePoint* +lilv_scale_points_get(const LilvScalePoints* collection, LilvIter* i); + +LILV_API +LilvIter* +lilv_scale_points_next(const LilvScalePoints* collection, LilvIter* i); + +LILV_API +bool +lilv_scale_points_is_end(const LilvScalePoints* collection, LilvIter* i); + +/* UIs */ + +LILV_API +void +lilv_uis_free(LilvUIs* collection); + +LILV_API +unsigned +lilv_uis_size(const LilvUIs* collection); + +LILV_API +LilvIter* +lilv_uis_begin(const LilvUIs* collection); + +LILV_API +const LilvUI* +lilv_uis_get(const LilvUIs* collection, LilvIter* i); + +LILV_API +LilvIter* +lilv_uis_next(const LilvUIs* collection, LilvIter* i); + +LILV_API +bool +lilv_uis_is_end(const LilvUIs* collection, LilvIter* i); + +/** + Get a UI from `uis` by URI. + + Return value is shared (stored in `uis`) and must not be freed or + modified by the caller in any way. + + @return NULL if no UI with `uri` is found in `list`. +*/ +LILV_API +const LilvUI* +lilv_uis_get_by_uri(const LilvUIs* uis, const LilvNode* uri); + +/* Nodes */ + +LILV_API +void +lilv_nodes_free(LilvNodes* collection); + +LILV_API +unsigned +lilv_nodes_size(const LilvNodes* collection); + +LILV_API +LilvIter* +lilv_nodes_begin(const LilvNodes* collection); + +LILV_API +const LilvNode* +lilv_nodes_get(const LilvNodes* collection, LilvIter* i); + +LILV_API +LilvIter* +lilv_nodes_next(const LilvNodes* collection, LilvIter* i); + +LILV_API +bool +lilv_nodes_is_end(const LilvNodes* collection, LilvIter* i); + +LILV_API +LilvNode* +lilv_nodes_get_first(const LilvNodes* collection); + +/** + Return whether `values` contains `value`. +*/ +LILV_API +bool +lilv_nodes_contains(const LilvNodes* nodes, const LilvNode* value); + +/** + Return a new LilvNodes that contains all nodes from both `a` and `b`. +*/ +LILV_API +LilvNodes* +lilv_nodes_merge(const LilvNodes* a, const LilvNodes* b); + +/* Plugins */ + +LILV_API +unsigned +lilv_plugins_size(const LilvPlugins* collection); + +LILV_API +LilvIter* +lilv_plugins_begin(const LilvPlugins* collection); + +LILV_API +const LilvPlugin* +lilv_plugins_get(const LilvPlugins* collection, LilvIter* i); + +LILV_API +LilvIter* +lilv_plugins_next(const LilvPlugins* collection, LilvIter* i); + +LILV_API +bool +lilv_plugins_is_end(const LilvPlugins* collection, LilvIter* i); + +/** + Get a plugin from `plugins` by URI. + + Return value is shared (stored in `plugins`) and must not be freed or + modified by the caller in any way. + + @return NULL if no plugin with `uri` is found in `plugins`. +*/ +LILV_API +const LilvPlugin* +lilv_plugins_get_by_uri(const LilvPlugins* plugins, const LilvNode* uri); + +/** + @} + @defgroup lilv_world World + + The "world" represents all Lilv state, and is used to discover/load/cache + LV2 data (plugins, UIs, and extensions). + Normal hosts which just need to load plugins by URI should simply use + lilv_world_load_all() to discover/load the system's LV2 resources. + + @{ +*/ + +/** + Initialize a new, empty world. + + If initialization fails, NULL is returned. +*/ +LILV_API +LilvWorld* +lilv_world_new(void); + +/** + Enable/disable language filtering. + + Language filtering applies to any functions that return (a) value(s). + With filtering enabled, Lilv will automatically return the best value(s) + for the current LANG. With filtering disabled, all matching values will + be returned regardless of language tag. Filtering is enabled by default. +*/ +#define LILV_OPTION_FILTER_LANG "http://drobilla.net/ns/lilv#filter-lang" + +/** + Enable/disable dynamic manifest support. + + Dynamic manifest data will only be loaded if this option is true. +*/ +#define LILV_OPTION_DYN_MANIFEST "http://drobilla.net/ns/lilv#dyn-manifest" + +/** + Set application-specific LV2_PATH. + + This overrides the LV2_PATH from the environment, so that lilv will only + look inside the given path. This can be used to make self-contained + applications. +*/ +#define LILV_OPTION_LV2_PATH "http://drobilla.net/ns/lilv#lv2-path" + +/** + Set an option for `world`. + + Currently recognized options: + + - #LILV_OPTION_FILTER_LANG + - #LILV_OPTION_DYN_MANIFEST + - #LILV_OPTION_LV2_PATH +*/ +LILV_API +void +lilv_world_set_option(LilvWorld* world, const char* uri, const LilvNode* value); + +/** + Destroy the world. + + It is safe to call this function on NULL. Note that destroying `world` will + destroy all the objects it contains. Do not destroy the world until you are + finished with all objects that came from it. +*/ +LILV_API +void +lilv_world_free(LilvWorld* world); + +/** + Load all installed LV2 bundles on the system. + + This is the recommended way for hosts to load LV2 data. It implements the + established/standard best practice for discovering all LV2 data on the + system. The environment variable LV2_PATH may be used to control where + this function will look for bundles. + + Hosts should use this function rather than explicitly load bundles, except + in special circumstances such as development utilities, or hosts that ship + with special plugin bundles which are installed to a known location. +*/ +LILV_API +void +lilv_world_load_all(LilvWorld* world); + +/** + Load a specific bundle. + + `bundle_uri` must be a fully qualified URI to the bundle directory, + with the trailing slash, eg. file:///usr/lib/lv2/foo.lv2/ + + Normal hosts should not need this function (use lilv_world_load_all()). + + Hosts MUST NOT attach any long-term significance to bundle paths + (for example in save files), since there are no guarantees they will remain + unchanged between (or even during) program invocations. Plugins (among + other things) MUST be identified by URIs (not paths) in save files. +*/ +LILV_API +void +lilv_world_load_bundle(LilvWorld* world, const LilvNode* bundle_uri); + +/** + Load all specifications from currently loaded bundles. + + This is for hosts that explicitly load specific bundles, its use is not + necessary when using lilv_world_load_all(). This function parses the + specifications and adds them to the model. +*/ +LILV_API +void +lilv_world_load_specifications(LilvWorld* world); + +/** + Load all plugin classes from currently loaded specifications. + + Must be called after lilv_world_load_specifications(). This is for hosts + that explicitly load specific bundles, its use is not necessary when using + lilv_world_load_all(). +*/ +LILV_API +void +lilv_world_load_plugin_classes(LilvWorld* world); + +/** + Unload a specific bundle. + + This unloads statements loaded by lilv_world_load_bundle(). Note that this + is not necessarily all information loaded from the bundle. If any resources + have been separately loaded with lilv_world_load_resource(), they must be + separately unloaded with lilv_world_unload_resource(). +*/ +LILV_API +int +lilv_world_unload_bundle(LilvWorld* world, const LilvNode* bundle_uri); + +/** + Load all the data associated with the given `resource`. + + All accessible data files linked to `resource` with rdfs:seeAlso will be + loaded into the world model. + + @param world The world. + @param resource Must be a subject (a URI or a blank node). + @return The number of files parsed, or -1 on error +*/ +LILV_API +int +lilv_world_load_resource(LilvWorld* world, const LilvNode* resource); + +/** + Unload all the data associated with the given `resource`. + + This unloads all data loaded by a previous call to + lilv_world_load_resource() with the given `resource`. + + @param world The world. + @param resource Must be a subject (a URI or a blank node). +*/ +LILV_API +int +lilv_world_unload_resource(LilvWorld* world, const LilvNode* resource); + +/** + Get the parent of all other plugin classes, lv2:Plugin. +*/ +LILV_API +const LilvPluginClass* +lilv_world_get_plugin_class(const LilvWorld* world); + +/** + Return a list of all found plugin classes. + + Returned list is owned by world and must not be freed by the caller. +*/ +LILV_API +const LilvPluginClasses* +lilv_world_get_plugin_classes(const LilvWorld* world); + +/** + Return a list of all found plugins. + + The returned list contains just enough references to query + or instantiate plugins. The data for a particular plugin will not be + loaded into memory until a call to an lilv_plugin_* function results in + a query (at which time the data is cached with the LilvPlugin so future + queries are very fast). + + The returned list and the plugins it contains are owned by `world` + and must not be freed by caller. +*/ +LILV_API +const LilvPlugins* +lilv_world_get_all_plugins(const LilvWorld* world); + +/** + Find nodes matching a triple pattern. + + Either `subject` or `object` may be NULL (a wildcard), but not both. + + @return All matches for the wildcard field, or NULL. +*/ +LILV_API +LilvNodes* +lilv_world_find_nodes(LilvWorld* world, + const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object); + +/** + Find a single node that matches a pattern. + + Exactly one of `subject`, `predicate`, `object` must be NULL. + This function is equivalent to + lilv_nodes_get_first(lilv_world_find_nodes(...)) but simplifies the common + case of only wanting a single value. + + @return The first matching node, or NULL if no matches are found. +*/ +LILV_API +LilvNode* +lilv_world_get(LilvWorld* world, + const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object); + +/** + Return true iff a statement matching a certain pattern exists. + + This is useful for checking if particular statement exists without having to + bother with collections and memory management. + + @param world The world. + @param subject Subject of statement, or NULL for anything. + @param predicate Predicate (key) of statement, or NULL for anything. + @param object Object (value) of statement, or NULL for anything. +*/ +LILV_API +bool +lilv_world_ask(LilvWorld* world, + const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object); + +/** + Get an LV2 symbol for some subject. + + This will return the lv2:symbol property of the subject if it is given + explicitly, and otherwise will attempt to derive a symbol from the URI. + + @return A string node that is a valid LV2 symbol, or NULL on error. +*/ +LILV_API +LilvNode* +lilv_world_get_symbol(LilvWorld* world, const LilvNode* subject); + +/** + @} + @defgroup lilv_plugin Plugins + @{ +*/ + +/** + Check if `plugin` is valid. + + This is not a rigorous validator, but can be used to reject some malformed + plugins that could cause bugs (for example, plugins with missing required + fields). + + Note that normal hosts do NOT need to use this - lilv does not + load invalid plugins into plugin lists. This is included for plugin + testing utilities, etc. + + @return True iff `plugin` is valid. +*/ +LILV_API +bool +lilv_plugin_verify(const LilvPlugin* plugin); + +/** + Get the URI of `plugin`. + + Any serialization that refers to plugins should refer to them by this. + Hosts SHOULD NOT save any filesystem paths, plugin indexes, etc. in saved + files; save only the URI. + + The URI is a globally unique identifier for one specific plugin. Two + plugins with the same URI are compatible in port signature, and should + be guaranteed to work in a compatible and consistent way. If a plugin + is upgraded in an incompatible way (eg if it has different ports), it + MUST have a different URI than it's predecessor. + + @return A shared URI value which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_plugin_get_uri(const LilvPlugin* plugin); + +/** + Get the (resolvable) URI of the plugin's "main" bundle. + + This returns the URI of the bundle where the plugin itself was found. Note + that the data for a plugin may be spread over many bundles, that is, + lilv_plugin_get_data_uris() may return URIs which are not within this + bundle. + + Typical hosts should not need to use this function. + Note this always returns a fully qualified URI. If you want a local + filesystem path, use lilv_file_uri_parse(). + + @return A shared string which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_plugin_get_bundle_uri(const LilvPlugin* plugin); + +/** + Get the (resolvable) URIs of the RDF data files that define a plugin. + + Typical hosts should not need to use this function. + Note this always returns fully qualified URIs. If you want local + filesystem paths, use lilv_file_uri_parse(). + + @return A list of complete URLs eg. "file:///foo/ABundle.lv2/aplug.ttl", + which is shared and must not be modified or freed. +*/ +LILV_API +const LilvNodes* +lilv_plugin_get_data_uris(const LilvPlugin* plugin); + +/** + Get the (resolvable) URI of the shared library for `plugin`. + + Note this always returns a fully qualified URI. If you want a local + filesystem path, use lilv_file_uri_parse(). + + @return A shared string which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_plugin_get_library_uri(const LilvPlugin* plugin); + +/** + Get the name of `plugin`. + + This returns the name (doap:name) of the plugin. The name may be + translated according to the current locale, this value MUST NOT be used + as a plugin identifier (use the URI for that). + + Returned value must be freed by the caller. +*/ +LILV_API +LilvNode* +lilv_plugin_get_name(const LilvPlugin* plugin); + +/** + Get the class this plugin belongs to (like "Filters" or "Effects"). +*/ +LILV_API +const LilvPluginClass* +lilv_plugin_get_class(const LilvPlugin* plugin); + +/** + Get a value associated with the plugin in a plugin's data files. + + `predicate` must be either a URI or a QName. + + Returns the ?object of all triples found of the form: + + <plugin-uri> predicate ?object + + May return NULL if the property was not found, or if object(s) is not + sensibly represented as a LilvNodes. + + Return value must be freed by caller with lilv_nodes_free(). +*/ +LILV_API +LilvNodes* +lilv_plugin_get_value(const LilvPlugin* plugin, const LilvNode* predicate); + +/** + Return whether a feature is supported by a plugin. + + This will return true if the feature is an optional or required feature + of the plugin. +*/ +LILV_API +bool +lilv_plugin_has_feature(const LilvPlugin* plugin, const LilvNode* feature); + +/** + Get the LV2 Features supported (required or optionally) by a plugin. + + A feature is "supported" by a plugin if it is required OR optional. + + Since required features have special rules the host must obey, this function + probably shouldn't be used by normal hosts. Using + lilv_plugin_get_optional_features() and lilv_plugin_get_required_features() + separately is best in most cases. + + Returned value must be freed by caller with lilv_nodes_free(). +*/ +LILV_API +LilvNodes* +lilv_plugin_get_supported_features(const LilvPlugin* plugin); + +/** + Get the LV2 Features required by a plugin. + + If a feature is required by a plugin, hosts MUST NOT use the plugin if they + do not understand (or are unable to support) that feature. + + All values returned here MUST be passed to the plugin's instantiate method + (along with data, if necessary, as defined by the feature specification) + or plugin instantiation will fail. + + Return value must be freed by caller with lilv_nodes_free(). +*/ +LILV_API +LilvNodes* +lilv_plugin_get_required_features(const LilvPlugin* plugin); + +/** + Get the LV2 Features optionally supported by a plugin. + + Hosts MAY ignore optional plugin features for whatever reasons. Plugins + MUST operate (at least somewhat) if they are instantiated without being + passed optional features. + + Return value must be freed by caller with lilv_nodes_free(). +*/ +LILV_API +LilvNodes* +lilv_plugin_get_optional_features(const LilvPlugin* plugin); + +/** + Return whether or not a plugin provides a specific extension data. +*/ +LILV_API +bool +lilv_plugin_has_extension_data(const LilvPlugin* plugin, const LilvNode* uri); + +/** + Get a sequence of all extension data provided by a plugin. + + This can be used to find which URIs lilv_instance_get_extension_data() + will return a value for without instantiating the plugin. +*/ +LILV_API +LilvNodes* +lilv_plugin_get_extension_data(const LilvPlugin* plugin); + +/** + Get the number of ports on this plugin. +*/ +LILV_API +uint32_t +lilv_plugin_get_num_ports(const LilvPlugin* plugin); + +/** + Get the port ranges (minimum, maximum and default values) for all ports. + + `min_values`, `max_values` and `def_values` must either point to an array + of N floats, where N is the value returned by lilv_plugin_get_num_ports() + for this plugin, or NULL. The elements of the array will be set to the + the minimum, maximum and default values of the ports on this plugin, + with array index corresponding to port index. If a port doesn't have a + minimum, maximum or default value, or the port's type is not float, the + corresponding array element will be set to NAN. + + This is a convenience method for the common case of getting the range of + all float ports on a plugin, and may be significantly faster than + repeated calls to lilv_port_get_range(). +*/ +LILV_API +void +lilv_plugin_get_port_ranges_float(const LilvPlugin* plugin, + float* min_values, + float* max_values, + float* def_values); + +/** + Get the number of ports on this plugin that are members of some class(es). + + Note that this is a varargs function so ports fitting any type 'profile' + desired can be found quickly. REMEMBER TO TERMINATE THE PARAMETER LIST + OF THIS FUNCTION WITH NULL OR VERY NASTY THINGS WILL HAPPEN. +*/ +LILV_API +uint32_t +lilv_plugin_get_num_ports_of_class(const LilvPlugin* plugin, + const LilvNode* class_1, + ...); + +/** + Variant of lilv_plugin_get_num_ports_of_class() that takes a va_list. + + This function calls va_arg() on `args` but does not call va_end(). +*/ +LILV_API +uint32_t +lilv_plugin_get_num_ports_of_class_va(const LilvPlugin* plugin, + const LilvNode* class_1, + va_list args); + +/** + Return whether or not the plugin introduces (and reports) latency. + + The index of the latency port can be found with + lilv_plugin_get_latency_port() ONLY if this function returns true. +*/ +LILV_API +bool +lilv_plugin_has_latency(const LilvPlugin* plugin); + +/** + Return the index of the plugin's latency port. + + It is a fatal error to call this on a plugin without checking if the port + exists by first calling lilv_plugin_has_latency(). + + Any plugin that introduces unwanted latency that should be compensated for + (by hosts with the ability/need) MUST provide this port, which is a control + rate output port that reports the latency for each cycle in frames. +*/ +LILV_API +uint32_t +lilv_plugin_get_latency_port_index(const LilvPlugin* plugin); + +/** + Get a port on `plugin` by `index`. +*/ +LILV_API +const LilvPort* +lilv_plugin_get_port_by_index(const LilvPlugin* plugin, uint32_t index); + +/** + Get a port on `plugin` by `symbol`. + + Note this function is slower than lilv_plugin_get_port_by_index(), + especially on plugins with a very large number of ports. +*/ +LILV_API +const LilvPort* +lilv_plugin_get_port_by_symbol(const LilvPlugin* plugin, + const LilvNode* symbol); + +/** + Get a port on `plugin` by its lv2:designation. + + The designation of a port describes the meaning, assignment, allocation or + role of the port, like "left channel" or "gain". If found, the port with + matching `port_class` and `designation` is be returned, otherwise NULL is + returned. The `port_class` can be used to distinguish the input and output + ports for a particular designation. If `port_class` is NULL, any port with + the given designation will be returned. +*/ +LILV_API +const LilvPort* +lilv_plugin_get_port_by_designation(const LilvPlugin* plugin, + const LilvNode* port_class, + const LilvNode* designation); + +/** + Get the project the plugin is a part of. + + More information about the project can be read via lilv_world_find_nodes(), + typically using properties from DOAP (such as doap:name). +*/ +LILV_API +LilvNode* +lilv_plugin_get_project(const LilvPlugin* plugin); + +/** + Get the full name of the plugin's author. + + Returns NULL if author name is not present. + Returned value must be freed by caller. +*/ +LILV_API +LilvNode* +lilv_plugin_get_author_name(const LilvPlugin* plugin); + +/** + Get the email address of the plugin's author. + + Returns NULL if author email address is not present. + Returned value must be freed by caller. +*/ +LILV_API +LilvNode* +lilv_plugin_get_author_email(const LilvPlugin* plugin); + +/** + Get the address of the plugin author's home page. + + Returns NULL if author homepage is not present. + Returned value must be freed by caller. +*/ +LILV_API +LilvNode* +lilv_plugin_get_author_homepage(const LilvPlugin* plugin); + +/** + Return true iff `plugin` has been replaced by another plugin. + + The plugin will still be usable, but hosts should hide them from their + user interfaces to prevent users from using deprecated plugins. +*/ +LILV_API +bool +lilv_plugin_is_replaced(const LilvPlugin* plugin); + +/** + Write the Turtle description of `plugin` to `plugin_file`. + + This function is particularly useful for porting plugins in conjunction with + an LV2 bridge such as NASPRO. +*/ +LILV_API +void +lilv_plugin_write_description(LilvWorld* world, + const LilvPlugin* plugin, + const LilvNode* base_uri, + FILE* plugin_file); + +/** + Write a manifest entry for `plugin` to `manifest_file`. + + This function is intended for use with lilv_plugin_write_description() to + write a complete description of a plugin to a bundle. +*/ +LILV_API +void +lilv_plugin_write_manifest_entry(LilvWorld* world, + const LilvPlugin* plugin, + const LilvNode* base_uri, + FILE* manifest_file, + const char* plugin_file_path); + +/** + Get the resources related to `plugin` with lv2:appliesTo. + + Some plugin-related resources are not linked directly to the plugin with + rdfs:seeAlso and thus will not be automatically loaded along with the plugin + data (usually for performance reasons). All such resources of the given @c + type related to `plugin` can be accessed with this function. + + If `type` is NULL, all such resources will be returned, regardless of type. + + To actually load the data for each returned resource, use + lilv_world_load_resource(). +*/ +LILV_API +LilvNodes* +lilv_plugin_get_related(const LilvPlugin* plugin, const LilvNode* type); + +/** + @} + @defgroup lilv_port Ports + @{ +*/ + +/** + Get the RDF node of `port`. + + Ports nodes may be may be URIs or blank nodes. + + @return A shared node which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_port_get_node(const LilvPlugin* plugin, const LilvPort* port); + +/** + Port analog of lilv_plugin_get_value(). +*/ +LILV_API +LilvNodes* +lilv_port_get_value(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* predicate); + +/** + Get a single property value of a port. + + This is equivalent to lilv_nodes_get_first(lilv_port_get_value(...)) but is + simpler to use in the common case of only caring about one value. The + caller is responsible for freeing the returned node. +*/ +LILV_API +LilvNode* +lilv_port_get(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* predicate); + +/** + Return the LV2 port properties of a port. +*/ +LILV_API +LilvNodes* +lilv_port_get_properties(const LilvPlugin* plugin, const LilvPort* port); + +/** + Return whether a port has a certain property. +*/ +LILV_API +bool +lilv_port_has_property(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* property); + +/** + Return whether a port supports a certain event type. + + More precisely, this returns true iff the port has an atom:supports or an + ev:supportsEvent property with `event_type` as the value. +*/ +LILV_API +bool +lilv_port_supports_event(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* event_type); + +/** + Get the index of a port. + + The index is only valid for the life of the plugin and may change between + versions. For a stable identifier, use the symbol. +*/ +LILV_API +uint32_t +lilv_port_get_index(const LilvPlugin* plugin, const LilvPort* port); + +/** + Get the symbol of a port. + + The 'symbol' is a short string, a valid C identifier. + Returned value is owned by `port` and must not be freed. +*/ +LILV_API +const LilvNode* +lilv_port_get_symbol(const LilvPlugin* plugin, const LilvPort* port); + +/** + Get the name of a port. + + This is guaranteed to return the untranslated name (the doap:name in the + data file without a language tag). Returned value must be freed by + the caller. +*/ +LILV_API +LilvNode* +lilv_port_get_name(const LilvPlugin* plugin, const LilvPort* port); + +/** + Get all the classes of a port. + + This can be used to determine if a port is an input, output, audio, + control, midi, etc, etc, though it's simpler to use lilv_port_is_a(). + The returned list does not include lv2:Port, which is implied. + Returned value is shared and must not be destroyed by caller. +*/ +LILV_API +const LilvNodes* +lilv_port_get_classes(const LilvPlugin* plugin, const LilvPort* port); + +/** + Determine if a port is of a given class (input, output, audio, etc). + + For convenience/performance/extensibility reasons, hosts are expected to + create a LilvNode for each port class they "care about". Well-known type + URI strings like `LILV_URI_INPUT_PORT` are defined for convenience, but + this function is designed so that Lilv is usable with any port types + without requiring explicit support in Lilv. +*/ +LILV_API +bool +lilv_port_is_a(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* port_class); + +/** + Get the default, minimum, and maximum values of a port. + + `def`, `min`, and `max` are outputs, pass pointers to uninitialized + LilvNode* variables. These will be set to point at new values (which must + be freed by the caller using lilv_node_free()), or NULL if the value does + not exist. +*/ +LILV_API +void +lilv_port_get_range(const LilvPlugin* plugin, + const LilvPort* port, + LilvNode** def, + LilvNode** min, + LilvNode** max); + +/** + Get the scale points (enumeration values) of a port. + + This returns a collection of 'interesting' named values of a port, which for + example might be appropriate entries for a value selector in a UI. + + Returned value may be NULL if `port` has no scale points, otherwise it + must be freed by caller with lilv_scale_points_free(). +*/ +LILV_API +LilvScalePoints* +lilv_port_get_scale_points(const LilvPlugin* plugin, const LilvPort* port); + +/** + @} + @defgroup lilv_state Plugin State + @{ +*/ + +/** + Load a state snapshot from the world RDF model. + + This function can be used to load the default state of a plugin by passing + the plugin URI as the `subject` parameter. + + @param world The world. + @param map URID mapper. + @param node The subject of the state description (such as a preset URI). + @return A new LilvState which must be freed with lilv_state_free(), or NULL. +*/ +LILV_API +LilvState* +lilv_state_new_from_world(LilvWorld* world, + LV2_URID_Map* map, + const LilvNode* node); + +/** + Load a state snapshot from a file. + + If `subject` is NULL, it is taken to be the URI of the file (`<>` in + Turtle). + + This function parses the file separately to create the state, it does not + parse the file into the world model, that is, the returned state is the only + new memory consumed once this function returns. + + @param world The world. + @param map URID mapper. + @param subject The subject of the state description (such as a preset URI). + @param path The path of the file containing the state description. + @return A new LilvState which must be freed with lilv_state_free(). +*/ +LILV_API +LilvState* +lilv_state_new_from_file(LilvWorld* world, + LV2_URID_Map* map, + const LilvNode* subject, + const char* path); + +/** + Load a state snapshot from a string made by lilv_state_to_string(). +*/ +LILV_API +LilvState* +lilv_state_new_from_string(LilvWorld* world, + LV2_URID_Map* map, + const char* str); + +/** + Function to get a port value. + + This function MUST set `size` and `type` appropriately. + + @param port_symbol The symbol of the port. + @param user_data The user_data passed to lilv_state_new_from_instance(). + @param size (Output) The size of the returned value. + @param type (Output) The URID of the type of the returned value. + @return A pointer to the port value. +*/ +typedef const void* (*LilvGetPortValueFunc)(const char* port_symbol, + void* user_data, + uint32_t* size, + uint32_t* type); + +/** + Create a new state snapshot from a plugin instance. + + + This function may be called simultaneously with any instance function + (except discovery functions) unless the threading class of that function + explicitly disallows this. + + To support advanced file functionality, there are several directory + parameters. The multiple parameters are necessary to support saving an + instance's state many times, or saving states from multiple instances, while + avoiding any duplication of data. For example, a host could pass the same + `copy_dir` and `link_dir` for all plugins in a session (for example + `session/shared/copy/` `session/shared/link/`), while the `save_dir` would + be unique to each plugin instance (for example `session/states/state1.lv2` + for one instance and `session/states/state2.lv2` for another instance). + Simple hosts that only wish to save a single plugin's state once may simply + use the same directory for all of them, or pass NULL to not support files at + all. + + If supported (via state:makePath passed to LV2_Descriptor::instantiate()), + `scratch_dir` should be the directory where any files created by the plugin + (for example during instantiation or while running) are stored. Any files + here that are referred to in the state will be copied to preserve their + contents at the time of the save. Lilv will assume any files within this + directory (recursively) are created by the plugin and that all other files + are immutable. Note that this function does not completely save the state, + use lilv_state_save() for that. + + See state.h from the + LV2 State extension for details on the `flags` and `features` parameters. + + @param plugin The plugin this state applies to. + + @param instance An instance of `plugin`. + + @param map The map to use for mapping URIs in state. + + @param scratch_dir Directory of files created by the plugin earlier, or + NULL. This is for hosts that support file creation at any time with state + state:makePath. These files will be copied as necessary to `copy_dir` and + not be referred to directly in state (a temporary directory is appropriate). + + @param copy_dir Directory of copies of files in `scratch_dir`, or NULL. + This directory will have the same structure as `scratch_dir` but with + possibly modified file names to distinguish revisions. This allows the + saved state to contain the exact contents of the scratch file at save time, + so that the state is not ruined if the file is later modified (for example, + by the plugin continuing to record). This can be the same as `save_dir` to + create a copy in the state bundle, but can also be a separate directory + which allows multiple state snapshots to share a single copy if the file has + not changed. + + @param link_dir Directory of links to external files, or NULL. A link will + be made in this directory to any external files referred to in plugin state. + In turn, links will be created in the save directory to these links (like + save_dir/file => link_dir/file => /foo/bar/file). This allows many state + snapshots to share a single link to an external file, so archival (for + example, with `tar -h`) will not create several copies of the file. If this + is not required, it can be the same as `save_dir`. + + @param save_dir Directory of files created by plugin during save (or NULL). + This is typically the bundle directory later passed to lilv_state_save(). + + @param get_value Function to get port values (or NULL). If NULL, the + returned state will not represent port values. This should only be NULL in + hosts that save and restore port values via some other mechanism. + + @param user_data User data to pass to `get_value`. + + @param flags Bitwise OR of LV2_State_Flags values. + + @param features Features to pass LV2_State_Interface.save(). + + @return A new LilvState which must be freed with lilv_state_free(). +*/ +LILV_API +LilvState* +lilv_state_new_from_instance(const LilvPlugin* plugin, + LilvInstance* instance, + LV2_URID_Map* map, + const char* scratch_dir, + const char* copy_dir, + const char* link_dir, + const char* save_dir, + LilvGetPortValueFunc get_value, + void* user_data, + uint32_t flags, + const LV2_Feature* const* features); + +/** + Free `state`. +*/ +LILV_API +void +lilv_state_free(LilvState* state); + +/** + Return true iff `a` is equivalent to `b`. +*/ +LILV_API +bool +lilv_state_equals(const LilvState* a, const LilvState* b); + +/** + Return the number of properties in `state`. +*/ +LILV_API +unsigned +lilv_state_get_num_properties(const LilvState* state); + +/** + Get the URI of the plugin `state` applies to. +*/ +LILV_API +const LilvNode* +lilv_state_get_plugin_uri(const LilvState* state); + +/** + Get the URI of `state`. + + This may return NULL if the state has not been saved and has no URI. +*/ +LILV_API +const LilvNode* +lilv_state_get_uri(const LilvState* state); + +/** + Get the label of `state`. +*/ +LILV_API +const char* +lilv_state_get_label(const LilvState* state); + +/** + Set the label of `state`. +*/ +LILV_API +void +lilv_state_set_label(LilvState* state, const char* label); + +/** + Set a metadata property on `state`. + + This is a generic version of lilv_state_set_label(), which sets metadata + properties visible to hosts, but not plugins. This allows storing useful + information such as comments or preset banks. + + @param state The state to set the metadata for. + @param key The key to store `value` under (URID). + @param value Pointer to the value to be stored. + @param size The size of `value` in bytes. + @param type The type of `value` (URID). + @param flags LV2_State_Flags for `value`. + @return Zero on success. +*/ +LILV_API +int +lilv_state_set_metadata(LilvState* state, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags); + +/** + Function to set a port value. + + @param port_symbol The symbol of the port. + @param user_data The user_data passed to lilv_state_restore(). + @param size The size of `value`. + @param type The URID of the type of `value`. + @param value A pointer to the port value. +*/ +typedef void (*LilvSetPortValueFunc)(const char* port_symbol, + void* user_data, + const void* value, + uint32_t size, + uint32_t type); + +/** + Enumerate the port values in a state snapshot. + + This function is a subset of lilv_state_restore() that only fires the + `set_value` callback and does not directly affect a plugin instance. This + is useful in hosts that need to retrieve the port values in a state snapshot + for special handling. + + @param state The state to retrieve port values from. + @param set_value A function to receive port values. + @param user_data User data to pass to `set_value`. +*/ +LILV_API +void +lilv_state_emit_port_values(const LilvState* state, + LilvSetPortValueFunc set_value, + void* user_data); + +/** + Restore a plugin instance from a state snapshot. + + This will set all the properties of `instance`, if given, to the values + stored in `state`. If `set_value` is provided, it will be called (with the + given `user_data`) to restore each port value, otherwise the host must + restore the port values itself (using lilv_state_get_port_value()) in order + to completely restore `state`. + + If the state has properties and `instance` is given, this function is in + the "instantiation" threading class, so it MUST NOT be called + simultaneously with any function on the same plugin instance. If the state + has no properties, only port values are set via `set_value`. + + See state.h from the + LV2 State extension for details on the `flags` and `features` parameters. + + @param state The state to restore, which must apply to the correct plugin. + @param instance An instance of the plugin `state` applies to, or NULL. + @param set_value A function to set a port value (may be NULL). + @param user_data User data to pass to `set_value`. + @param flags Bitwise OR of LV2_State_Flags values. + @param features Features to pass LV2_State_Interface.restore(). +*/ +LILV_API +void +lilv_state_restore(const LilvState* state, + LilvInstance* instance, + LilvSetPortValueFunc set_value, + void* user_data, + uint32_t flags, + const LV2_Feature* const* features); + +/** + Save state to a file. + + The format of state on disk is compatible with that defined in the LV2 + preset extension, so this function may be used to save presets which can + be loaded by any host. + + If `uri` is NULL, the preset URI will be a file URI, but the bundle + can safely be moved (the state file will use `<>` as the subject). + + @param world The world. + @param map URID mapper. + @param unmap URID unmapper. + @param state State to save. + @param uri URI of state, may be NULL. + @param dir Path of the bundle directory to save into. + @param filename Path of the state file relative to `dir`. +*/ +LILV_API +int +lilv_state_save(LilvWorld* world, + LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + const LilvState* state, + const char* uri, + const char* dir, + const char* filename); + +/** + Save state to a string. + + This function does not use the filesystem. + + @param world The world. + + @param map URID mapper. + + @param unmap URID unmapper. + + @param state The state to serialize. + + @param uri URI for the state description (mandatory). + + @param base_uri Base URI for serialisation. Unless you know what you are + doing, pass NULL for this, otherwise the state may not be restorable via + lilv_state_new_from_string(). +*/ +LILV_API +char* +lilv_state_to_string(LilvWorld* world, + LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + const LilvState* state, + const char* uri, + const char* base_uri); + +/** + Unload a state from the world and delete all associated files. + + This function DELETES FILES/DIRECTORIES FROM THE FILESYSTEM! It is intended + for removing user-saved presets, but can delete any state the user has + permission to delete, including presets shipped with plugins. + + The rdfs:seeAlso file for the state will be removed. The entry in the + bundle's manifest.ttl is removed, and if this results in an empty manifest, + then the manifest file is removed. If this results in an empty bundle, then + the bundle directory is removed as well. + + @param world The world. + @param state State to remove from the system. +*/ +LILV_API +int +lilv_state_delete(LilvWorld* world, const LilvState* state); + +/** + @} + @defgroup lilv_scalepoint Scale Points + @{ +*/ + +/** + Get the label of this scale point (enumeration value). + + Returned value is owned by `point` and must not be freed. +*/ +LILV_API +const LilvNode* +lilv_scale_point_get_label(const LilvScalePoint* point); + +/** + Get the value of this scale point (enumeration value). + + Returned value is owned by `point` and must not be freed. +*/ +LILV_API +const LilvNode* +lilv_scale_point_get_value(const LilvScalePoint* point); + +/** + @} + @defgroup lilv_class Plugin Classes + @{ +*/ + +/** + Get the URI of this class' superclass. + + Returned value is owned by `plugin_class` and must not be freed by caller. + Returned value may be NULL, if class has no parent. +*/ +LILV_API +const LilvNode* +lilv_plugin_class_get_parent_uri(const LilvPluginClass* plugin_class); + +/** + Get the URI of this plugin class. + + Returned value is owned by `plugin_class` and must not be freed by caller. +*/ +LILV_API +const LilvNode* +lilv_plugin_class_get_uri(const LilvPluginClass* plugin_class); + +/** + Get the label of this plugin class, like "Oscillators". + + Returned value is owned by `plugin_class` and must not be freed by caller. +*/ +LILV_API +const LilvNode* +lilv_plugin_class_get_label(const LilvPluginClass* plugin_class); + +/** + Get the subclasses of this plugin class. + + Returned value must be freed by caller with lilv_plugin_classes_free(). +*/ +LILV_API +LilvPluginClasses* +lilv_plugin_class_get_children(const LilvPluginClass* plugin_class); + +/** + @} + @defgroup lilv_instance Plugin Instances + @{ +*/ + +/** + @cond LILV_DOCUMENT_INSTANCE_IMPL +*/ + +/* Instance of a plugin. + + This is exposed in the ABI to allow inlining of performance critical + functions like lilv_instance_run() (simple wrappers of functions in lv2.h). + This is for performance reasons, user code should not use this definition + in any way (which is why it is not machine documented). + Truly private implementation details are hidden via `pimpl`. +*/ +struct LilvInstanceImpl { + const LV2_Descriptor* lv2_descriptor; + LV2_Handle lv2_handle; + void* pimpl; +}; + +/** + @endcond +*/ + +/** + Instantiate a plugin. + + The returned value is a lightweight handle for an LV2 plugin instance, + it does not refer to `plugin`, or any other Lilv state. The caller must + eventually free it with lilv_instance_free(). + `features` is a NULL-terminated array of features the host supports. + NULL may be passed if the host supports no additional features. + + @return NULL if instantiation failed. +*/ +LILV_API +LilvInstance* +lilv_plugin_instantiate(const LilvPlugin* plugin, + double sample_rate, + const LV2_Feature* const* features); + +/** + Free a plugin instance. + + It is safe to call this function on NULL. + `instance` is invalid after this call. +*/ +LILV_API +void +lilv_instance_free(LilvInstance* instance); + +#ifndef LILV_INTERNAL + +/** + Get the URI of the plugin which `instance` is an instance of. + + Returned string is shared and must not be modified or deleted. +*/ +static inline const char* +lilv_instance_get_uri(const LilvInstance* instance) +{ + return instance->lv2_descriptor->URI; +} + +/** + Connect a port to a data location. + + This may be called regardless of whether the plugin is activated, + activation and deactivation does not destroy port connections. +*/ +static inline void +lilv_instance_connect_port(LilvInstance* instance, + uint32_t port_index, + void* data_location) +{ + instance->lv2_descriptor->connect_port( + instance->lv2_handle, port_index, data_location); +} + +/** + Activate a plugin instance. + + This resets all state information in the plugin, except for port data + locations (as set by lilv_instance_connect_port()). This MUST be called + before calling lilv_instance_run(). +*/ +static inline void +lilv_instance_activate(LilvInstance* instance) +{ + if (instance->lv2_descriptor->activate) { + instance->lv2_descriptor->activate(instance->lv2_handle); + } +} + +/** + Run `instance` for `sample_count` frames. + + If the hint lv2:hardRTCapable is set for this plugin, this function is + guaranteed not to block. +*/ +static inline void +lilv_instance_run(LilvInstance* instance, uint32_t sample_count) +{ + instance->lv2_descriptor->run(instance->lv2_handle, sample_count); +} + +/** + Deactivate a plugin instance. + + Note that to run the plugin after this you must activate it, which will + reset all state information (except port connections). +*/ +static inline void +lilv_instance_deactivate(LilvInstance* instance) +{ + if (instance->lv2_descriptor->deactivate) { + instance->lv2_descriptor->deactivate(instance->lv2_handle); + } +} + +/** + Get extension data from the plugin instance. + + The type and semantics of the data returned is specific to the particular + extension, though in all cases it is shared and must not be deleted. +*/ +static inline const void* +lilv_instance_get_extension_data(const LilvInstance* instance, const char* uri) +{ + if (instance->lv2_descriptor->extension_data) { + return instance->lv2_descriptor->extension_data(uri); + } + + return NULL; +} + +/** + Get the LV2_Descriptor of the plugin instance. + + Normally hosts should not need to access the LV2_Descriptor directly, + use the lilv_instance_* functions. + + The returned descriptor is shared and must not be deleted. +*/ +static inline const LV2_Descriptor* +lilv_instance_get_descriptor(const LilvInstance* instance) +{ + return instance->lv2_descriptor; +} + +/** + Get the LV2_Handle of the plugin instance. + + Normally hosts should not need to access the LV2_Handle directly, + use the lilv_instance_* functions. + + The returned handle is shared and must not be deleted. +*/ +static inline LV2_Handle +lilv_instance_get_handle(const LilvInstance* instance) +{ + return instance->lv2_handle; +} + +#endif /* LILV_INTERNAL */ + +/** + @} + @defgroup lilv_ui Plugin UIs + @{ +*/ + +/** + Get all UIs for `plugin`. + + Returned value must be freed by caller using lilv_uis_free(). +*/ +LILV_API +LilvUIs* +lilv_plugin_get_uis(const LilvPlugin* plugin); + +/** + Get the URI of a Plugin UI. + + @return A shared value which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_ui_get_uri(const LilvUI* ui); + +/** + Get the types (URIs of RDF classes) of a Plugin UI. + + Note that in most cases lilv_ui_is_supported() should be used, which avoids + the need to use this function (and type specific logic). + + @return A shared value which must not be modified or freed. +*/ +LILV_API +const LilvNodes* +lilv_ui_get_classes(const LilvUI* ui); + +/** + Check whether a plugin UI has a given type. + + @param ui The Plugin UI + @param class_uri The URI of the LV2 UI type to check this UI against +*/ +LILV_API +bool +lilv_ui_is_a(const LilvUI* ui, const LilvNode* class_uri); + +/** + Function to determine whether a UI type is supported. + + This is provided by the user and must return non-zero iff using a UI of type + `ui_type_uri` in a container of type `container_type_uri` is supported. +*/ +typedef unsigned (*LilvUISupportedFunc)(const char* container_type_uri, + const char* ui_type_uri); + +/** + Return true iff a Plugin UI is supported as a given widget type. + + @param ui The Plugin UI + + @param supported_func User provided supported predicate. + + @param container_type The widget type to host the UI within. + + @param ui_type (Output) If non-NULL, set to the native type of the UI + which is owned by `ui` and must not be freed by the caller. + + @return The embedding quality level returned by `supported_func`. +*/ +LILV_API +unsigned +lilv_ui_is_supported(const LilvUI* ui, + LilvUISupportedFunc supported_func, + const LilvNode* container_type, + const LilvNode** ui_type); + +/** + Get the URI for a Plugin UI's bundle. + + @return A shared value which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_ui_get_bundle_uri(const LilvUI* ui); + +/** + Get the URI for a Plugin UI's shared library. + + @return A shared value which must not be modified or freed. +*/ +LILV_API +const LilvNode* +lilv_ui_get_binary_uri(const LilvUI* ui); + +/** + @} + @} +*/ + +#ifdef __cplusplus +# if defined(__clang__) +# pragma clang diagnostic pop +# endif +} /* extern "C" */ +#endif + +#endif /* LILV_LILV_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp new file mode 100644 index 00000000..0ac802de --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/lilv/lilvmm.hpp @@ -0,0 +1,440 @@ +/* + Copyright 2007-2017 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LILV_LILVMM_HPP +#define LILV_LILVMM_HPP + +#include "lilv/lilv.h" +#include "lv2/core/lv2.h" + +#include +#include + +namespace Lilv { + +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdeprecated-declarations" +#elif defined(__GNUC__) && __GNUC__ > 4 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + +struct Instance; +struct Node; +struct Nodes; +struct Plugin; +struct PluginClass; +struct PluginClasses; +struct Plugins; +struct Port; +struct ScalePoint; +struct ScalePoints; +struct UI; +struct UIs; +struct World; + +LILV_DEPRECATED +static inline const char* +uri_to_path(const char* uri) +{ + return lilv_uri_to_path(uri); +} + +#if defined(__clang__) +# pragma clang diagnostic pop +#elif defined(__GNUC__) && __GNUC__ > 4 +# pragma GCC diagnostic pop +#endif + +#define LILV_WRAP0(RT, prefix, name) \ + inline RT name() { return lilv_##prefix##_##name(me); } + +#define LILV_WRAP0_VOID(prefix, name) \ + inline void name() { lilv_##prefix##_##name(me); } + +#define LILV_WRAP1(RT, prefix, name, T1, a1) \ + inline RT name(T1 a1) { return lilv_##prefix##_##name(me, a1); } + +#define LILV_WRAP1_VOID(prefix, name, T1, a1) \ + inline void name(T1 a1) { lilv_##prefix##_##name(me, a1); } + +#define LILV_WRAP2(RT, prefix, name, T1, a1, T2, a2) \ + inline RT name(T1 a1, T2 a2) { return lilv_##prefix##_##name(me, a1, a2); } + +#define LILV_WRAP3(RT, prefix, name, T1, a1, T2, a2, T3, a3) \ + inline RT name(T1 a1, T2 a2, T3 a3) \ + { \ + return lilv_##prefix##_##name(me, a1, a2, a3); \ + } + +#define LILV_WRAP2_VOID(prefix, name, T1, a1, T2, a2) \ + inline void name(T1 a1, T2 a2) { lilv_##prefix##_##name(me, a1, a2); } + +#ifndef SWIG +# define LILV_WRAP_CONVERSION(CT) \ + inline operator CT*() const { return me; } +#else +# define LILV_WRAP_CONVERSION(CT) +#endif + +struct Node { + inline Node(const LilvNode* node) + : me(lilv_node_duplicate(node)) + {} + + inline Node(const Node& copy) + : me(lilv_node_duplicate(copy.me)) + {} + + inline Node& operator=(const Node& rhs) + { + if (&rhs != this) { + lilv_node_free(me); + me = lilv_node_duplicate(rhs.me); + } + return *this; + } + + inline Node(Node&& other) noexcept + : me(other.me) + { + other.me = nullptr; + } + + inline Node& operator=(Node&& rhs) noexcept + { + if (&rhs != this) { + me = rhs.me; + rhs.me = nullptr; + } + return *this; + } + + inline ~Node() { lilv_node_free(me); } + + inline bool equals(const Node& other) const + { + return lilv_node_equals(me, other.me); + } + + inline bool operator==(const Node& other) const { return equals(other); } + + LILV_WRAP_CONVERSION(LilvNode); + + LILV_WRAP0(char*, node, get_turtle_token); + LILV_WRAP0(bool, node, is_uri); + LILV_WRAP0(const char*, node, as_uri); + LILV_WRAP0(bool, node, is_blank); + LILV_WRAP0(const char*, node, as_blank); + LILV_WRAP0(bool, node, is_literal); + LILV_WRAP0(bool, node, is_string); + LILV_WRAP0(const char*, node, as_string); + LILV_WRAP0(bool, node, is_float); + LILV_WRAP0(float, node, as_float); + LILV_WRAP0(bool, node, is_int); + LILV_WRAP0(int, node, as_int); + LILV_WRAP0(bool, node, is_bool); + LILV_WRAP0(bool, node, as_bool); + + LilvNode* me; +}; + +struct ScalePoint { + inline ScalePoint(const LilvScalePoint* c_obj) + : me(c_obj) + {} + + LILV_WRAP_CONVERSION(const LilvScalePoint); + + LILV_WRAP0(const LilvNode*, scale_point, get_label); + LILV_WRAP0(const LilvNode*, scale_point, get_value); + + const LilvScalePoint* me; +}; + +struct PluginClass { + inline PluginClass(const LilvPluginClass* c_obj) + : me(c_obj) + {} + + LILV_WRAP_CONVERSION(const LilvPluginClass); + + LILV_WRAP0(Node, plugin_class, get_parent_uri); + LILV_WRAP0(Node, plugin_class, get_uri); + LILV_WRAP0(Node, plugin_class, get_label); + LILV_WRAP0(LilvPluginClasses*, plugin_class, get_children); + + const LilvPluginClass* me; +}; + +#define LILV_WRAP_COLL(CT, ET, prefix) \ + inline CT(const Lilv##CT* c_obj) \ + : me(c_obj) \ + {} \ + LILV_WRAP_CONVERSION(const Lilv##CT); \ + LILV_WRAP0(unsigned, prefix, size); \ + LILV_WRAP1(ET, prefix, get, LilvIter*, i); \ + LILV_WRAP0(LilvIter*, prefix, begin); \ + LILV_WRAP1(LilvIter*, prefix, next, LilvIter*, i); \ + LILV_WRAP1(bool, prefix, is_end, LilvIter*, i); \ + const Lilv##CT* me; + +struct PluginClasses { + LILV_WRAP_COLL(PluginClasses, PluginClass, plugin_classes); + LILV_WRAP1(PluginClass, plugin_classes, get_by_uri, const LilvNode*, uri); +}; + +struct ScalePoints { + LILV_WRAP_COLL(ScalePoints, ScalePoint, scale_points); +}; + +struct Nodes { + LILV_WRAP_COLL(Nodes, Node, nodes); + LILV_WRAP1(bool, nodes, contains, const Node&, node); + LILV_WRAP0(Node, nodes, get_first); +}; + +struct UI { + inline UI(const LilvUI* c_obj) + : me(c_obj) + {} + + LILV_WRAP_CONVERSION(const LilvUI); + + LILV_WRAP0(const LilvNode*, ui, get_uri); + LILV_WRAP0(const LilvNode*, ui, get_bundle_uri); + LILV_WRAP0(const LilvNode*, ui, get_binary_uri); + LILV_WRAP0(const LilvNodes*, ui, get_classes); + /*LILV_WRAP3(bool, ui, is_supported, + LilvUISupportedFunc, supported_func, + const LilvNode*, container_type, + const LilvNode**, ui_type);*/ + LILV_WRAP1(bool, ui, is_a, const LilvNode*, class_uri); + + const LilvUI* me; +}; + +struct UIs { + LILV_WRAP_COLL(UIs, UI, uis); +}; + +struct Port { + inline Port(const LilvPlugin* p, const LilvPort* c_obj) + : parent(p) + , me(c_obj) + {} + + LILV_WRAP_CONVERSION(const LilvPort); + +#define LILV_PORT_WRAP0(RT, name) \ + inline RT name() { return lilv_port_##name(parent, me); } + +#define LILV_PORT_WRAP1(RT, name, T1, a1) \ + inline RT name(T1 a1) { return lilv_port_##name(parent, me, a1); } + + LILV_PORT_WRAP1(LilvNodes*, get_value, LilvNode*, predicate); + LILV_PORT_WRAP0(LilvNodes*, get_properties) + LILV_PORT_WRAP1(bool, has_property, LilvNode*, property_uri); + LILV_PORT_WRAP1(bool, supports_event, LilvNode*, event_uri); + LILV_PORT_WRAP0(const LilvNode*, get_symbol); + LILV_PORT_WRAP0(LilvNode*, get_name); + LILV_PORT_WRAP0(const LilvNodes*, get_classes); + LILV_PORT_WRAP1(bool, is_a, LilvNode*, port_class); + LILV_PORT_WRAP0(LilvScalePoints*, get_scale_points); + + // TODO: get_range (output parameters) + + const LilvPlugin* parent; + const LilvPort* me; +}; + +struct Plugin { + inline Plugin(const LilvPlugin* c_obj) + : me(c_obj) + {} + + LILV_WRAP_CONVERSION(const LilvPlugin); + + LILV_WRAP0(bool, plugin, verify); + LILV_WRAP0(Node, plugin, get_uri); + LILV_WRAP0(Node, plugin, get_bundle_uri); + LILV_WRAP0(Nodes, plugin, get_data_uris); + LILV_WRAP0(Node, plugin, get_library_uri); + LILV_WRAP0(Node, plugin, get_name); + LILV_WRAP0(PluginClass, plugin, get_class); + LILV_WRAP1(Nodes, plugin, get_value, const Node&, pred); + LILV_WRAP1(bool, plugin, has_feature, const Node&, feature_uri); + LILV_WRAP0(Nodes, plugin, get_supported_features); + LILV_WRAP0(Nodes, plugin, get_required_features); + LILV_WRAP0(Nodes, plugin, get_optional_features); + LILV_WRAP0(unsigned, plugin, get_num_ports); + LILV_WRAP0(bool, plugin, has_latency); + LILV_WRAP0(unsigned, plugin, get_latency_port_index); + LILV_WRAP0(Node, plugin, get_author_name); + LILV_WRAP0(Node, plugin, get_author_email); + LILV_WRAP0(Node, plugin, get_author_homepage); + LILV_WRAP0(bool, plugin, is_replaced); + LILV_WRAP0(Nodes, plugin, get_extension_data); + LILV_WRAP0(UIs, plugin, get_uis); + LILV_WRAP1(Nodes, plugin, get_related, const Node&, type); + + inline Port get_port_by_index(unsigned index) const + { + return Port(me, lilv_plugin_get_port_by_index(me, index)); + } + + inline Port get_port_by_symbol(LilvNode* symbol) const + { + return Port(me, lilv_plugin_get_port_by_symbol(me, symbol)); + } + + inline void get_port_ranges_float(float* min_values, + float* max_values, + float* def_values) const + { + return lilv_plugin_get_port_ranges_float( + me, min_values, max_values, def_values); + } + + inline unsigned get_num_ports_of_class(LilvNode* class_1, ...) const + { + va_list args; + va_start(args, class_1); + + const uint32_t count = + lilv_plugin_get_num_ports_of_class_va(me, class_1, args); + + va_end(args); + return count; + } + + const LilvPlugin* me; +}; + +struct Plugins { + LILV_WRAP_COLL(Plugins, Plugin, plugins); + LILV_WRAP1(Plugin, plugins, get_by_uri, const LilvNode*, uri); +}; + +struct Instance { + inline Instance(LilvInstance* instance) + : me(instance) + {} + + LILV_DEPRECATED + inline Instance(Plugin plugin, double sample_rate) + { + me = lilv_plugin_instantiate(plugin, sample_rate, nullptr); + } + + LILV_DEPRECATED inline Instance(Plugin plugin, + double sample_rate, + LV2_Feature* const* features) + { + me = lilv_plugin_instantiate(plugin, sample_rate, features); + } + + static inline Instance* create(Plugin plugin, + double sample_rate, + LV2_Feature* const* features) + { + LilvInstance* me = lilv_plugin_instantiate(plugin, sample_rate, features); + + return me ? new Instance(me) : nullptr; + } + + LILV_WRAP_CONVERSION(LilvInstance); + + LILV_WRAP2_VOID(instance, + connect_port, + unsigned, + port_index, + void*, + data_location); + + LILV_WRAP0_VOID(instance, activate); + LILV_WRAP1_VOID(instance, run, unsigned, sample_count); + LILV_WRAP0_VOID(instance, deactivate); + + inline const void* get_extension_data(const char* uri) const + { + return lilv_instance_get_extension_data(me, uri); + } + + inline const LV2_Descriptor* get_descriptor() const + { + return lilv_instance_get_descriptor(me); + } + + inline LV2_Handle get_handle() const { return lilv_instance_get_handle(me); } + + LilvInstance* me; +}; + +struct World { + inline World() + : me(lilv_world_new()) + {} + + inline ~World() { lilv_world_free(me); } + + World(const World&) = delete; + World& operator=(const World&) = delete; + + World(World&&) = delete; + World& operator=(World&&) = delete; + + inline LilvNode* new_uri(const char* uri) const + { + return lilv_new_uri(me, uri); + } + + inline LilvNode* new_string(const char* str) const + { + return lilv_new_string(me, str); + } + + inline LilvNode* new_int(int val) const { return lilv_new_int(me, val); } + + inline LilvNode* new_float(float val) const + { + return lilv_new_float(me, val); + } + + inline LilvNode* new_bool(bool val) const { return lilv_new_bool(me, val); } + + inline Nodes find_nodes(const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object) const + { + return lilv_world_find_nodes(me, subject, predicate, object); + } + + LILV_WRAP2_VOID(world, set_option, const char*, uri, LilvNode*, value); + LILV_WRAP0_VOID(world, load_all); + LILV_WRAP1_VOID(world, load_bundle, LilvNode*, bundle_uri); + LILV_WRAP0(const LilvPluginClass*, world, get_plugin_class); + LILV_WRAP0(const LilvPluginClasses*, world, get_plugin_classes); + LILV_WRAP0(Plugins, world, get_all_plugins); + LILV_WRAP1(int, world, load_resource, const LilvNode*, resource); + + LilvWorld* me; +}; + +} /* namespace Lilv */ + +#endif /* LILV_LILVMM_HPP */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c new file mode 100644 index 00000000..c2c752a8 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/collections.c @@ -0,0 +1,240 @@ +/* + Copyright 2008-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "sord/sord.h" +#include "zix/common.h" +#include "zix/tree.h" + +#include +#include +#include + +int +lilv_ptr_cmp(const void* a, const void* b, const void* user_data) +{ + (void)user_data; + + return (intptr_t)a - (intptr_t)b; +} + +int +lilv_resource_node_cmp(const void* a, const void* b, const void* user_data) +{ + (void)user_data; + + const SordNode* an = ((const LilvNode*)a)->node; + const SordNode* bn = ((const LilvNode*)b)->node; + + return (intptr_t)an - (intptr_t)bn; +} + +/* Generic collection functions */ + +static inline LilvCollection* +lilv_collection_new(ZixComparator cmp, ZixDestroyFunc destructor) +{ + return zix_tree_new(false, cmp, NULL, destructor); +} + +void +lilv_collection_free(LilvCollection* collection) +{ + if (collection) { + zix_tree_free((ZixTree*)collection); + } +} + +unsigned +lilv_collection_size(const LilvCollection* collection) +{ + return (collection ? zix_tree_size((const ZixTree*)collection) : 0); +} + +LilvIter* +lilv_collection_begin(const LilvCollection* collection) +{ + return collection ? (LilvIter*)zix_tree_begin((ZixTree*)collection) : NULL; +} + +void* +lilv_collection_get(const LilvCollection* collection, const LilvIter* i) +{ + (void)collection; + + return zix_tree_get((const ZixTreeIter*)i); +} + +/* Constructors */ + +LilvScalePoints* +lilv_scale_points_new(void) +{ + return lilv_collection_new(lilv_ptr_cmp, + (ZixDestroyFunc)lilv_scale_point_free); +} + +LilvNodes* +lilv_nodes_new(void) +{ + return lilv_collection_new(lilv_ptr_cmp, (ZixDestroyFunc)lilv_node_free); +} + +LilvUIs* +lilv_uis_new(void) +{ + return lilv_collection_new(lilv_header_compare_by_uri, + (ZixDestroyFunc)lilv_ui_free); +} + +LilvPluginClasses* +lilv_plugin_classes_new(void) +{ + return lilv_collection_new(lilv_header_compare_by_uri, + (ZixDestroyFunc)lilv_plugin_class_free); +} + +/* URI based accessors (for collections of things with URIs) */ + +const LilvPluginClass* +lilv_plugin_classes_get_by_uri(const LilvPluginClasses* classes, + const LilvNode* uri) +{ + return (LilvPluginClass*)lilv_collection_get_by_uri((const ZixTree*)classes, + uri); +} + +const LilvUI* +lilv_uis_get_by_uri(const LilvUIs* uis, const LilvNode* uri) +{ + return (LilvUI*)lilv_collection_get_by_uri((const ZixTree*)uis, uri); +} + +/* Plugins */ + +LilvPlugins* +lilv_plugins_new(void) +{ + return lilv_collection_new(lilv_header_compare_by_uri, NULL); +} + +const LilvPlugin* +lilv_plugins_get_by_uri(const LilvPlugins* plugins, const LilvNode* uri) +{ + return (LilvPlugin*)lilv_collection_get_by_uri((const ZixTree*)plugins, uri); +} + +/* Nodes */ + +bool +lilv_nodes_contains(const LilvNodes* nodes, const LilvNode* value) +{ + LILV_FOREACH (nodes, i, nodes) { + if (lilv_node_equals(lilv_nodes_get(nodes, i), value)) { + return true; + } + } + + return false; +} + +LilvNodes* +lilv_nodes_merge(const LilvNodes* a, const LilvNodes* b) +{ + LilvNodes* result = lilv_nodes_new(); + + LILV_FOREACH (nodes, i, a) { + zix_tree_insert( + (ZixTree*)result, lilv_node_duplicate(lilv_nodes_get(a, i)), NULL); + } + + LILV_FOREACH (nodes, i, b) { + zix_tree_insert( + (ZixTree*)result, lilv_node_duplicate(lilv_nodes_get(b, i)), NULL); + } + + return result; +} + +/* Iterator */ + +#define LILV_COLLECTION_IMPL(prefix, CT, ET) \ + \ + unsigned prefix##_size(const CT* collection) \ + { \ + return lilv_collection_size(collection); \ + } \ + \ + LilvIter* prefix##_begin(const CT* collection) \ + { \ + return lilv_collection_begin(collection); \ + } \ + \ + const ET* prefix##_get(const CT* collection, LilvIter* i) \ + { \ + return (ET*)lilv_collection_get(collection, i); \ + } \ + \ + LilvIter* prefix##_next(const CT* collection, LilvIter* i) \ + { \ + (void)collection; \ + return zix_tree_iter_next((ZixTreeIter*)i); \ + } \ + \ + bool prefix##_is_end(const CT* collection, LilvIter* i) \ + { \ + (void)collection; \ + return zix_tree_iter_is_end((ZixTreeIter*)i); \ + } + +LILV_COLLECTION_IMPL(lilv_plugin_classes, LilvPluginClasses, LilvPluginClass) +LILV_COLLECTION_IMPL(lilv_scale_points, LilvScalePoints, LilvScalePoint) +LILV_COLLECTION_IMPL(lilv_uis, LilvUIs, LilvUI) +LILV_COLLECTION_IMPL(lilv_nodes, LilvNodes, LilvNode) +LILV_COLLECTION_IMPL(lilv_plugins, LilvPlugins, LilvPlugin) + +void +lilv_plugin_classes_free(LilvPluginClasses* collection) +{ + lilv_collection_free(collection); +} + +void +lilv_scale_points_free(LilvScalePoints* collection) +{ + lilv_collection_free(collection); +} + +void +lilv_uis_free(LilvUIs* collection) +{ + lilv_collection_free(collection); +} + +void +lilv_nodes_free(LilvNodes* collection) +{ + lilv_collection_free(collection); +} + +LilvNode* +lilv_nodes_get_first(const LilvNodes* collection) +{ + return (LilvNode*)lilv_collection_get(collection, + lilv_collection_begin(collection)); +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c new file mode 100644 index 00000000..03614ceb --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.c @@ -0,0 +1,564 @@ +/* + Copyright 2007-2021 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#define _POSIX_C_SOURCE 200809L /* for fileno */ +#define _BSD_SOURCE 1 /* for realpath, symlink */ +#define _DEFAULT_SOURCE 1 /* for realpath, symlink */ + +#ifdef __APPLE__ +# define _DARWIN_C_SOURCE 1 /* for flock */ +#endif + +#include "filesystem.h" +#include "lilv_config.h" +#include "lilv_internal.h" + +#ifdef _WIN32 +# include +# include +# include +# define F_OK 0 +# define mkdir(path, flags) _mkdir(path) +# define S_ISDIR(mode) (((mode)&S_IFMT) == S_IFDIR) +#else +# include +# include +#endif + +#if USE_FLOCK && USE_FILENO +# include +#endif + +#include + +#include +#include +#include +#include +#include + +#ifndef PAGE_SIZE +# define PAGE_SIZE 4096 +#endif + +static bool +lilv_is_dir_sep(const char c) +{ + return c == '/' || c == LILV_DIR_SEP[0]; +} + +#ifdef _WIN32 +static inline bool +is_windows_path(const char* path) +{ + return (isalpha(path[0]) && (path[1] == ':' || path[1] == '|') && + (path[2] == '/' || path[2] == '\\')); +} +#endif + +char* +lilv_temp_directory_path(void) +{ +#ifdef _WIN32 + DWORD len = GetTempPath(0, NULL); + char* buf = (char*)calloc(len, 1); + if (GetTempPath(len, buf) == 0) { + free(buf); + return NULL; + } + + return buf; +#else + const char* const tmpdir = getenv("TMPDIR"); + + return tmpdir ? lilv_strdup(tmpdir) : lilv_strdup("/tmp"); +#endif +} + +bool +lilv_path_is_absolute(const char* path) +{ + if (lilv_is_dir_sep(path[0])) { + return true; + } + +#ifdef _WIN32 + if (is_windows_path(path)) { + return true; + } +#endif + + return false; +} + +bool +lilv_path_is_child(const char* path, const char* dir) +{ + if (path && dir) { + const size_t path_len = strlen(path); + const size_t dir_len = strlen(dir); + return dir && path_len >= dir_len && !strncmp(path, dir, dir_len); + } + return false; +} + +char* +lilv_path_current(void) +{ + return getcwd(NULL, 0); +} + +char* +lilv_path_absolute(const char* path) +{ + if (lilv_path_is_absolute(path)) { + return lilv_strdup(path); + } + + char* cwd = getcwd(NULL, 0); + char* abs_path = lilv_path_join(cwd, path); + free(cwd); + return abs_path; +} + +char* +lilv_path_absolute_child(const char* path, const char* parent) +{ + if (lilv_path_is_absolute(path)) { + return lilv_strdup(path); + } + + return lilv_path_join(parent, path); +} + +char* +lilv_path_relative_to(const char* path, const char* base) +{ + const size_t path_len = strlen(path); + const size_t base_len = strlen(base); + const size_t min_len = (path_len < base_len) ? path_len : base_len; + + // Find the last separator common to both paths + size_t last_shared_sep = 0; + for (size_t i = 0; i < min_len && path[i] == base[i]; ++i) { + if (lilv_is_dir_sep(path[i])) { + last_shared_sep = i; + } + } + + if (last_shared_sep == 0) { + // No common components, return path + return lilv_strdup(path); + } + + // Find the number of up references ("..") required + size_t up = 0; + for (size_t i = last_shared_sep + 1; i < base_len; ++i) { + if (lilv_is_dir_sep(base[i])) { + ++up; + } + } + +#ifdef _WIN32 + const bool use_slash = strchr(path, '/'); +#else + static const bool use_slash = true; +#endif + + // Write up references + const size_t suffix_len = path_len - last_shared_sep; + char* rel = (char*)calloc(1, suffix_len + (up * 3) + 1); + for (size_t i = 0; i < up; ++i) { + if (use_slash) { + memcpy(rel + (i * 3), "../", 3); + } else { + memcpy(rel + (i * 3), "..\\", 3); + } + } + + // Write suffix + memcpy(rel + (up * 3), path + last_shared_sep + 1, suffix_len); + return rel; +} + +char* +lilv_path_parent(const char* path) +{ + const char* s = path + strlen(path) - 1; // Last character + + // Last non-slash + for (; s > path && lilv_is_dir_sep(*s); --s) { + } + + // Last internal slash + for (; s > path && !lilv_is_dir_sep(*s); --s) { + } + + // Skip duplicates + for (; s > path && lilv_is_dir_sep(*s); --s) { + } + + if (s == path) { // Hit beginning + return lilv_is_dir_sep(*s) ? lilv_strdup("/") : lilv_strdup("."); + } + + // Pointing to the last character of the result (inclusive) + char* dirname = (char*)malloc(s - path + 2); + memcpy(dirname, path, s - path + 1); + dirname[s - path + 1] = '\0'; + return dirname; +} + +char* +lilv_path_filename(const char* path) +{ + const size_t path_len = strlen(path); + size_t last_sep = path_len; + for (size_t i = 0; i < path_len; ++i) { + if (lilv_is_dir_sep(path[i])) { + last_sep = i; + } + } + + if (last_sep >= path_len) { + return lilv_strdup(path); + } + + const size_t ret_len = path_len - last_sep; + char* const ret = (char*)calloc(ret_len + 1, 1); + + strncpy(ret, path + last_sep + 1, ret_len); + return ret; +} + +char* +lilv_path_join(const char* a, const char* b) +{ + if (!a) { + return (b && b[0]) ? lilv_strdup(b) : NULL; + } + + const size_t a_len = strlen(a); + const size_t b_len = b ? strlen(b) : 0; + const bool a_end_is_sep = a_len > 0 && lilv_is_dir_sep(a[a_len - 1]); + const size_t pre_len = a_len - (a_end_is_sep ? 1 : 0); + char* path = (char*)calloc(1, a_len + b_len + 2); + memcpy(path, a, pre_len); + +#ifdef _WIN32 + // Use forward slash if it seems that the input paths do + const bool a_has_slash = strchr(a, '/'); + const bool b_has_slash = b && strchr(b, '/'); + if (a_has_slash || b_has_slash) { + path[pre_len] = '/'; + } else { + path[pre_len] = '\\'; + } +#else + path[pre_len] = '/'; +#endif + + if (b) { + memcpy(path + pre_len + 1, + b + (lilv_is_dir_sep(b[0]) ? 1 : 0), + lilv_is_dir_sep(b[0]) ? b_len - 1 : b_len); + } + return path; +} + +char* +lilv_path_canonical(const char* path) +{ + if (!path) { + return NULL; + } + +#if defined(_WIN32) + char* out = (char*)malloc(MAX_PATH); + GetFullPathName(path, MAX_PATH, out, NULL); + return out; +#else + char* real_path = realpath(path, NULL); + return real_path ? real_path : lilv_strdup(path); +#endif +} + +bool +lilv_path_exists(const char* path) +{ +#if USE_LSTAT + struct stat st; + return !lstat(path, &st); +#else + return !access(path, F_OK); +#endif +} + +bool +lilv_is_directory(const char* path) +{ + struct stat st; + return !stat(path, &st) && S_ISDIR(st.st_mode); +} + +int +lilv_copy_file(const char* src, const char* dst) +{ + FILE* in = fopen(src, "r"); + if (!in) { + return errno; + } + + FILE* out = fopen(dst, "w"); + if (!out) { + fclose(in); + return errno; + } + + char* page = (char*)malloc(PAGE_SIZE); + size_t n_read = 0; + int st = 0; + while ((n_read = fread(page, 1, PAGE_SIZE, in)) > 0) { + if (fwrite(page, 1, n_read, out) != n_read) { + st = errno; + break; + } + } + + if (!st && fflush(out)) { + st = errno; + } + + if (!st && (ferror(in) || ferror(out))) { + st = EBADF; + } + + free(page); + fclose(in); + fclose(out); + + return st; +} + +int +lilv_symlink(const char* oldpath, const char* newpath) +{ + int ret = 0; + if (strcmp(oldpath, newpath)) { +#ifdef _WIN32 + ret = !CreateHardLink(newpath, oldpath, 0); +#else + char* target = lilv_path_relative_to(oldpath, newpath); + + ret = symlink(target, newpath); + + free(target); +#endif + } + return ret; +} + +int +lilv_flock(FILE* file, bool lock, bool block) +{ +#ifdef _WIN32 + HANDLE handle = (HANDLE)_get_osfhandle(fileno(file)); + OVERLAPPED overlapped = {0}; + + if (lock) { + const DWORD flags = + (LOCKFILE_EXCLUSIVE_LOCK | (block ? 0 : LOCKFILE_FAIL_IMMEDIATELY)); + + return !LockFileEx(handle, flags, 0, UINT32_MAX, UINT32_MAX, &overlapped); + } else { + return !UnlockFileEx(handle, 0, UINT32_MAX, UINT32_MAX, &overlapped); + } +#elif USE_FLOCK && USE_FILENO + return flock(fileno(file), + (lock ? LOCK_EX : LOCK_UN) | (block ? 0 : LOCK_NB)); +#else + return 0; +#endif +} + +void +lilv_dir_for_each(const char* path, + void* data, + void (*f)(const char* path, const char* name, void* data)) +{ +#ifdef _WIN32 + char* pat = lilv_path_join(path, "*"); + WIN32_FIND_DATA fd; + HANDLE fh = FindFirstFile(pat, &fd); + if (fh != INVALID_HANDLE_VALUE) { + do { + if (strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..")) { + f(path, fd.cFileName, data); + } + } while (FindNextFile(fh, &fd)); + } + FindClose(fh); + free(pat); +#else + DIR* dir = opendir(path); + if (dir) { + for (struct dirent* entry = NULL; (entry = readdir(dir));) { + if (strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) { + f(path, entry->d_name, data); + } + } + closedir(dir); + } +#endif +} + +char* +lilv_create_temporary_directory_in(const char* pattern, const char* parent) +{ +#ifdef _WIN32 + static const char chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + static const int n_chars = sizeof(chars) - 1; + + const size_t pattern_len = strlen(pattern); + if (pattern_len < 7 || strcmp(pattern + pattern_len - 6, "XXXXXX")) { + errno = EINVAL; + return NULL; + } + + char* const path_pattern = lilv_path_join(parent, pattern); + const size_t path_pattern_len = strlen(path_pattern); + char* const suffix = path_pattern + path_pattern_len - 6; + + for (unsigned attempt = 0; attempt < 128; ++attempt) { + for (unsigned i = 0; i < 6; ++i) { + suffix[i] = chars[rand() % n_chars]; + } + + if (!mkdir(path_pattern, 0700)) { + return path_pattern; + } + } + + return NULL; +#else + char* const path_pattern = lilv_path_join(parent, pattern); + + return mkdtemp(path_pattern); // NOLINT (not a leak) +#endif +} + +char* +lilv_create_temporary_directory(const char* pattern) +{ + char* const tmpdir = lilv_temp_directory_path(); + char* const result = lilv_create_temporary_directory_in(pattern, tmpdir); + + free(tmpdir); + + return result; +} + +int +lilv_create_directories(const char* dir_path) +{ + char* path = lilv_strdup(dir_path); + const size_t path_len = strlen(path); + size_t i = 1; + +#ifdef _WIN32 + if (is_windows_path(dir_path)) { + i = 3; + } +#endif + + for (; i <= path_len; ++i) { + const char c = path[i]; + if (c == LILV_DIR_SEP[0] || c == '/' || c == '\0') { + path[i] = '\0'; + if (mkdir(path, 0755) && (errno != EEXIST || !lilv_is_directory(path))) { + free(path); + return errno; + } + path[i] = c; + } + } + + free(path); + return 0; +} + +static off_t +lilv_file_size(const char* path) +{ + struct stat buf; + if (stat(path, &buf)) { + return 0; + } + return buf.st_size; +} + +int +lilv_remove(const char* path) +{ +#ifdef _WIN32 + if (lilv_is_directory(path)) { + return !RemoveDirectory(path); + } +#endif + + return remove(path); +} + +bool +lilv_file_equals(const char* a_path, const char* b_path) +{ + if (!strcmp(a_path, b_path)) { + return true; // Paths match + } + + bool match = false; + FILE* a_file = NULL; + FILE* b_file = NULL; + char* const a_real = lilv_path_canonical(a_path); + char* const b_real = lilv_path_canonical(b_path); + if (!strcmp(a_real, b_real)) { + match = true; // Real paths match + } else if (lilv_file_size(a_path) != lilv_file_size(b_path)) { + match = false; // Sizes differ + } else if (!(a_file = fopen(a_real, "rb")) || + !(b_file = fopen(b_real, "rb"))) { + match = false; // Missing file matches nothing + } else { + // TODO: Improve performance by reading chunks + match = true; + while (!feof(a_file) && !feof(b_file)) { + if (fgetc(a_file) != fgetc(b_file)) { + match = false; + break; + } + } + } + + if (a_file) { + fclose(a_file); + } + if (b_file) { + fclose(b_file); + } + free(a_real); + free(b_real); + return match; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h new file mode 100644 index 00000000..1a8dc680 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/filesystem.h @@ -0,0 +1,182 @@ +/* + Copyright 2007-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include +#include + +/// Return the path to a directory suitable for making temporary files +char* +lilv_temp_directory_path(void); + +/// Return true iff `path` is an absolute path +bool +lilv_path_is_absolute(const char* path); + +/// Return true iff `path` is a child of `dir` +bool +lilv_path_is_child(const char* path, const char* dir); + +/// Return the current working directory +char* +lilv_path_current(void); + +/** + Return `path` as an absolute path. + + If `path` is absolute, an identical copy of it is returned. Otherwise, the + returned path is relative to the current working directory. +*/ +char* +lilv_path_absolute(const char* path); + +/** + Return `path` as an absolute path relative to `parent`. + + If `path` is absolute, an identical copy of it is returned. Otherwise, the + returned path is relative to `parent`. +*/ +char* +lilv_path_absolute_child(const char* path, const char* parent); + +/** + Return `path` relative to `base` if possible. + + If `path` is not within `base`, a copy is returned. Otherwise, an + equivalent path relative to `base` is returned (which may contain + up-references). +*/ +char* +lilv_path_relative_to(const char* path, const char* base); + +/** + Return the path to the directory that contains `path`. + + Returns the root path if `path` is the root path. +*/ +char* +lilv_path_parent(const char* path); + +/** + Return the filename component of `path` without any directories. + + Returns the empty string if `path` is the root path. +*/ +char* +lilv_path_filename(const char* path); + +/// Join path `a` and path `b` with a single directory separator between them +char* +lilv_path_join(const char* a, const char* b); + +/** + Return `path` as a canonicalized absolute path. + + This expands all symbolic links, relative references, and removes extra + directory separators. +*/ +char* +lilv_path_canonical(const char* path); + +/// Return true iff `path` points to an existing file system entry +bool +lilv_path_exists(const char* path); + +/// Return true iff `path` points to an existing directory +bool +lilv_is_directory(const char* path); + +/** + Copy the file at path `src` to path `dst`. + + @return Zero on success, or a standard `errno` error code. +*/ +int +lilv_copy_file(const char* src, const char* dst); + +/** + Create a symlink at `newpath` that points to `oldpath`. + + @return Zero on success, otherwise non-zero and `errno` is set. +*/ +int +lilv_symlink(const char* oldpath, const char* newpath); + +/** + Set or remove an advisory exclusive lock on `file`. + + If the `lock` is true and the file is already locked by another process, or + by this process via a different file handle, then this will not succeed and + non-zero will be returned. + + @param file Handle for open file to lock. + @param lock True to set lock, false to release lock. + @param block If true, then this call will block until the lock is acquired. + @return Zero on success. +*/ +int +lilv_flock(FILE* file, bool lock, bool block); + +/** + Visit every file in the directory at `path`. + + @param path A path to a directory. + + @param data Opaque user data that is passed to `f`. + + @param f A function called on every entry in the directory. The `path` + parameter is always the directory path passed to this function, the `name` + parameter is the name of the directory entry (not its full path). +*/ +void +lilv_dir_for_each(const char* path, + void* data, + void (*f)(const char* path, const char* name, void* data)); + +/** + Create a unique temporary directory in a specific directory. + + The last six characters of `pattern` must be `XXXXXX` and will be replaced + with random characters. This works roughly like mkdtemp, except the pattern + should only be a directory name, not a full path. The created path will be + a child of the given parent directory. +*/ +char* +lilv_create_temporary_directory_in(const char* pattern, const char* parent); + +/** + Create a unique temporary directory. + + This is like lilv_create_temporary_directory_in(), except it creates the + directory in the system temporary directory. +*/ +char* +lilv_create_temporary_directory(const char* pattern); + +/** + Create the directory `dir_path` and any parent directories if necessary. + + @return Zero on success, or an `errno` error code. +*/ +int +lilv_create_directories(const char* dir_path); + +/// Remove the file or empty directory at `path` +int +lilv_remove(const char* path); + +/// Return true iff the given paths point to files with identical contents +bool +lilv_file_equals(const char* a_path, const char* b_path); diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c new file mode 100644 index 00000000..6a2b856e --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/instance.c @@ -0,0 +1,115 @@ +/* + Copyright 2007-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "lv2/core/lv2.h" +#include "serd/serd.h" + +#include +#include +#include +#include +#include + +LilvInstance* +lilv_plugin_instantiate(const LilvPlugin* plugin, + double sample_rate, + const LV2_Feature* const* features) +{ + lilv_plugin_load_if_necessary(plugin); + if (plugin->parse_errors) { + return NULL; + } + + LilvInstance* result = NULL; + const LilvNode* const lib_uri = lilv_plugin_get_library_uri(plugin); + const LilvNode* const bundle_uri = lilv_plugin_get_bundle_uri(plugin); + if (!lib_uri || !bundle_uri) { + return NULL; + } + + char* const bundle_path = + lilv_file_uri_parse(lilv_node_as_uri(bundle_uri), NULL); + + LilvLib* lib = lilv_lib_open(plugin->world, lib_uri, bundle_path, features); + if (!lib) { + serd_free(bundle_path); + return NULL; + } + + const LV2_Feature** local_features = NULL; + if (features == NULL) { + local_features = (const LV2_Feature**)malloc(sizeof(LV2_Feature*)); + local_features[0] = NULL; + } + + // Search for plugin by URI + for (uint32_t i = 0; true; ++i) { + const LV2_Descriptor* ld = lilv_lib_get_plugin(lib, i); + if (!ld) { + LILV_ERRORF("No plugin <%s> in <%s>\n", + lilv_node_as_uri(lilv_plugin_get_uri(plugin)), + lilv_node_as_uri(lib_uri)); + lilv_lib_close(lib); + break; // return NULL + } + + if (!strcmp(ld->URI, lilv_node_as_uri(lilv_plugin_get_uri(plugin)))) { + // Create LilvInstance to return + result = (LilvInstance*)malloc(sizeof(LilvInstance)); + result->lv2_descriptor = ld; + result->lv2_handle = ld->instantiate( + ld, sample_rate, bundle_path, (features) ? features : local_features); + result->pimpl = lib; + break; + } + } + + free(local_features); + serd_free(bundle_path); + + if (result) { + if (result->lv2_handle == NULL) { + // Failed to instantiate + free(result); + lilv_lib_close(lib); + return NULL; + } + + // "Connect" all ports to NULL (catches bugs) + for (uint32_t i = 0; i < lilv_plugin_get_num_ports(plugin); ++i) { + result->lv2_descriptor->connect_port(result->lv2_handle, i, NULL); + } + } + + return result; +} + +void +lilv_instance_free(LilvInstance* instance) +{ + if (!instance) { + return; + } + + instance->lv2_descriptor->cleanup(instance->lv2_handle); + instance->lv2_descriptor = NULL; + lilv_lib_close((LilvLib*)instance->pimpl); + instance->pimpl = NULL; + free(instance); +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c new file mode 100644 index 00000000..adba7320 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lib.c @@ -0,0 +1,127 @@ +/* + Copyright 2012-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "lv2/core/lv2.h" +#include "serd/serd.h" +#include "zix/tree.h" + +#ifndef _WIN32 +# include +#endif + +#include +#include + +LilvLib* +lilv_lib_open(LilvWorld* world, + const LilvNode* uri, + const char* bundle_path, + const LV2_Feature* const* features) +{ + ZixTreeIter* i = NULL; + const LilvLib key = { + world, (LilvNode*)uri, (char*)bundle_path, NULL, NULL, NULL, 0}; + if (!zix_tree_find(world->libs, &key, &i)) { + LilvLib* llib = (LilvLib*)zix_tree_get(i); + ++llib->refs; + return llib; + } + + const char* const lib_uri = lilv_node_as_uri(uri); + char* const lib_path = + (char*)serd_file_uri_parse((const uint8_t*)lib_uri, NULL); + if (!lib_path) { + return NULL; + } + + dlerror(); + void* lib = dlopen(lib_path, RTLD_NOW); + if (!lib) { + LILV_ERRORF("Failed to open library %s (%s)\n", lib_path, dlerror()); + serd_free(lib_path); + return NULL; + } + + LV2_Descriptor_Function df = + (LV2_Descriptor_Function)lilv_dlfunc(lib, "lv2_descriptor"); + + LV2_Lib_Descriptor_Function ldf = + (LV2_Lib_Descriptor_Function)lilv_dlfunc(lib, "lv2_lib_descriptor"); + + const LV2_Lib_Descriptor* desc = NULL; + if (ldf) { + desc = ldf(bundle_path, features); + if (!desc) { + LILV_ERRORF("Call to %s:lv2_lib_descriptor failed\n", lib_path); + dlclose(lib); + serd_free(lib_path); + return NULL; + } + } else if (!df) { + LILV_ERRORF("No `lv2_descriptor' or `lv2_lib_descriptor' in %s\n", + lib_path); + dlclose(lib); + serd_free(lib_path); + return NULL; + } + serd_free(lib_path); + + LilvLib* llib = (LilvLib*)malloc(sizeof(LilvLib)); + llib->world = world; + llib->uri = lilv_node_duplicate(uri); + llib->bundle_path = lilv_strdup(bundle_path); + llib->lib = lib; + llib->lv2_descriptor = df; + llib->desc = desc; + llib->refs = 1; + + zix_tree_insert(world->libs, llib, NULL); + return llib; +} + +const LV2_Descriptor* +lilv_lib_get_plugin(LilvLib* lib, uint32_t index) +{ + if (lib->lv2_descriptor) { + return lib->lv2_descriptor(index); + } + + if (lib->desc) { + return lib->desc->get_plugin(lib->desc->handle, index); + } + + return NULL; +} + +void +lilv_lib_close(LilvLib* lib) +{ + if (--lib->refs == 0) { + dlclose(lib->lib); + + ZixTreeIter* i = NULL; + if (lib->world->libs && !zix_tree_find(lib->world->libs, lib, &i)) { + zix_tree_remove(lib->world->libs, i); + } + + lilv_node_free(lib->uri); + free(lib->bundle_path); + free(lib); + } +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h new file mode 100644 index 00000000..12b56de0 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/lilv_internal.h @@ -0,0 +1,477 @@ +/* + Copyright 2007-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LILV_INTERNAL_H +#define LILV_INTERNAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lilv_config.h" // IWYU pragma: keep + +#include "lilv/lilv.h" +#include "lv2/core/lv2.h" +#include "serd/serd.h" +#include "sord/sord.h" +#include "zix/tree.h" + +#include +#include +#include + +#ifdef _WIN32 +# include +# include +# include +# define dlopen(path, flags) LoadLibrary(path) +# define dlclose(lib) FreeLibrary((HMODULE)lib) +# ifdef _MSC_VER +# define __func__ __FUNCTION__ +# ifndef snprintf +# define snprintf _snprintf +# endif +# endif +# ifndef INFINITY +# define INFINITY DBL_MAX + DBL_MAX +# endif +# ifndef NAN +# define NAN INFINITY - INFINITY +# endif +static inline const char* +dlerror(void) +{ + return "Unknown error"; +} +#else +# include +#endif + +#ifdef LILV_DYN_MANIFEST +# include "lv2/dynmanifest/dynmanifest.h" +#endif + +/* + * + * Types + * + */ + +typedef void LilvCollection; + +struct LilvPortImpl { + LilvNode* node; ///< RDF node + uint32_t index; ///< lv2:index + LilvNode* symbol; ///< lv2:symbol + LilvNodes* classes; ///< rdf:type +}; + +typedef struct LilvSpecImpl { + SordNode* spec; + SordNode* bundle; + LilvNodes* data_uris; + struct LilvSpecImpl* next; +} LilvSpec; + +/** + Header of an LilvPlugin, LilvPluginClass, or LilvUI. + Any of these structs may be safely casted to LilvHeader, which is used to + implement collections using the same comparator. +*/ +struct LilvHeader { + LilvWorld* world; + LilvNode* uri; +}; + +#ifdef LILV_DYN_MANIFEST +typedef struct { + LilvNode* bundle; + void* lib; + LV2_Dyn_Manifest_Handle handle; + uint32_t refs; +} LilvDynManifest; +#endif + +typedef struct { + LilvWorld* world; + LilvNode* uri; + char* bundle_path; + void* lib; + LV2_Descriptor_Function lv2_descriptor; + const LV2_Lib_Descriptor* desc; + uint32_t refs; +} LilvLib; + +struct LilvPluginImpl { + LilvWorld* world; + LilvNode* plugin_uri; + LilvNode* bundle_uri; ///< Bundle plugin was loaded from + LilvNode* binary_uri; ///< lv2:binary +#ifdef LILV_DYN_MANIFEST + LilvDynManifest* dynmanifest; +#endif + const LilvPluginClass* plugin_class; + LilvNodes* data_uris; ///< rdfs::seeAlso + LilvPort** ports; + uint32_t num_ports; + bool loaded; + bool parse_errors; + bool replaced; +}; + +struct LilvPluginClassImpl { + LilvWorld* world; + LilvNode* uri; + LilvNode* parent_uri; + LilvNode* label; +}; + +struct LilvInstancePimpl { + LilvWorld* world; + LilvLib* lib; +}; + +typedef struct { + bool dyn_manifest; + bool filter_language; + char* lv2_path; +} LilvOptions; + +struct LilvWorldImpl { + SordWorld* world; + SordModel* model; + SerdReader* reader; + unsigned n_read_files; + LilvPluginClass* lv2_plugin_class; + LilvPluginClasses* plugin_classes; + LilvSpec* specs; + LilvPlugins* plugins; + LilvPlugins* zombies; + LilvNodes* loaded_files; + ZixTree* libs; + struct { + SordNode* dc_replaces; + SordNode* dman_DynManifest; + SordNode* doap_name; + SordNode* lv2_Plugin; + SordNode* lv2_Specification; + SordNode* lv2_appliesTo; + SordNode* lv2_binary; + SordNode* lv2_default; + SordNode* lv2_designation; + SordNode* lv2_extensionData; + SordNode* lv2_index; + SordNode* lv2_latency; + SordNode* lv2_maximum; + SordNode* lv2_microVersion; + SordNode* lv2_minimum; + SordNode* lv2_minorVersion; + SordNode* lv2_name; + SordNode* lv2_optionalFeature; + SordNode* lv2_port; + SordNode* lv2_portProperty; + SordNode* lv2_reportsLatency; + SordNode* lv2_requiredFeature; + SordNode* lv2_symbol; + SordNode* lv2_prototype; + SordNode* owl_Ontology; + SordNode* pset_value; + SordNode* rdf_a; + SordNode* rdf_value; + SordNode* rdfs_Class; + SordNode* rdfs_label; + SordNode* rdfs_seeAlso; + SordNode* rdfs_subClassOf; + SordNode* xsd_base64Binary; + SordNode* xsd_boolean; + SordNode* xsd_decimal; + SordNode* xsd_double; + SordNode* xsd_integer; + SordNode* null_uri; + } uris; + LilvOptions opt; +}; + +typedef enum { + LILV_VALUE_URI, + LILV_VALUE_STRING, + LILV_VALUE_INT, + LILV_VALUE_FLOAT, + LILV_VALUE_BOOL, + LILV_VALUE_BLANK, + LILV_VALUE_BLOB +} LilvNodeType; + +struct LilvNodeImpl { + LilvWorld* world; + SordNode* node; + LilvNodeType type; + union { + int int_val; + float float_val; + bool bool_val; + } val; +}; + +struct LilvScalePointImpl { + LilvNode* value; + LilvNode* label; +}; + +struct LilvUIImpl { + LilvWorld* world; + LilvNode* uri; + LilvNode* bundle_uri; + LilvNode* binary_uri; + LilvNodes* classes; +}; + +typedef struct LilvVersion { + int minor; + int micro; +} LilvVersion; + +/* + * + * Functions + * + */ + +LilvPort* +lilv_port_new(LilvWorld* world, + const SordNode* node, + uint32_t index, + const char* symbol); +void +lilv_port_free(const LilvPlugin* plugin, LilvPort* port); + +LilvPlugin* +lilv_plugin_new(LilvWorld* world, LilvNode* uri, LilvNode* bundle_uri); + +void +lilv_plugin_clear(LilvPlugin* plugin, LilvNode* bundle_uri); + +void +lilv_plugin_load_if_necessary(const LilvPlugin* plugin); + +void +lilv_plugin_free(LilvPlugin* plugin); + +LilvNode* +lilv_plugin_get_unique(const LilvPlugin* plugin, + const SordNode* subject, + const SordNode* predicate); + +void +lilv_collection_free(LilvCollection* collection); + +unsigned +lilv_collection_size(const LilvCollection* collection); + +LilvIter* +lilv_collection_begin(const LilvCollection* collection); + +void* +lilv_collection_get(const LilvCollection* collection, const LilvIter* i); + +LilvPluginClass* +lilv_plugin_class_new(LilvWorld* world, + const SordNode* parent_node, + const SordNode* uri, + const char* label); + +void +lilv_plugin_class_free(LilvPluginClass* plugin_class); + +LilvLib* +lilv_lib_open(LilvWorld* world, + const LilvNode* uri, + const char* bundle_path, + const LV2_Feature* const* features); + +const LV2_Descriptor* +lilv_lib_get_plugin(LilvLib* lib, uint32_t index); + +void +lilv_lib_close(LilvLib* lib); + +LilvNodes* +lilv_nodes_new(void); + +LilvPlugins* +lilv_plugins_new(void); + +LilvScalePoints* +lilv_scale_points_new(void); + +LilvPluginClasses* +lilv_plugin_classes_new(void); + +LilvUIs* +lilv_uis_new(void); + +LilvNode* +lilv_world_get_manifest_uri(LilvWorld* world, const LilvNode* bundle_uri); + +const uint8_t* +lilv_world_blank_node_prefix(LilvWorld* world); + +SerdStatus +lilv_world_load_file(LilvWorld* world, SerdReader* reader, const LilvNode* uri); + +SerdStatus +lilv_world_load_graph(LilvWorld* world, SordNode* graph, const LilvNode* uri); + +LilvUI* +lilv_ui_new(LilvWorld* world, + LilvNode* uri, + LilvNode* type_uri, + LilvNode* binary_uri); + +void +lilv_ui_free(LilvUI* ui); + +LilvNode* +lilv_node_new(LilvWorld* world, LilvNodeType type, const char* str); + +LilvNode* +lilv_node_new_from_node(LilvWorld* world, const SordNode* node); + +int +lilv_header_compare_by_uri(const void* a, const void* b, const void* user_data); + +int +lilv_lib_compare(const void* a, const void* b, const void* user_data); + +int +lilv_ptr_cmp(const void* a, const void* b, const void* user_data); + +int +lilv_resource_node_cmp(const void* a, const void* b, const void* user_data); + +static inline int +lilv_version_cmp(const LilvVersion* a, const LilvVersion* b) +{ + if (a->minor == b->minor && a->micro == b->micro) { + return 0; + } + + if ((a->minor < b->minor) || (a->minor == b->minor && a->micro < b->micro)) { + return -1; + } + + return 1; +} + +struct LilvHeader* +lilv_collection_get_by_uri(const ZixTree* seq, const LilvNode* uri); + +LilvScalePoint* +lilv_scale_point_new(LilvNode* value, LilvNode* label); + +void +lilv_scale_point_free(LilvScalePoint* point); + +SordIter* +lilv_world_query_internal(LilvWorld* world, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object); + +bool +lilv_world_ask_internal(LilvWorld* world, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object); + +LilvNodes* +lilv_world_find_nodes_internal(LilvWorld* world, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object); + +SordModel* +lilv_world_filter_model(LilvWorld* world, + SordModel* model, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object, + const SordNode* graph); + +#define FOREACH_MATCH(iter) for (; !sord_iter_end(iter); sord_iter_next(iter)) + +LilvNodes* +lilv_nodes_from_stream_objects(LilvWorld* world, + SordIter* stream, + SordQuadIndex field); + +char* +lilv_strjoin(const char* first, ...); + +char* +lilv_strdup(const char* str); + +char* +lilv_get_lang(void); + +char* +lilv_expand(const char* path); + +char* +lilv_get_latest_copy(const char* path, const char* copy_path); + +char* +lilv_find_free_path(const char* in_path, + bool (*exists)(const char*, const void*), + const void* user_data); + +typedef void (*LilvVoidFunc)(void); + +/** dlsym wrapper to return a function pointer (without annoying warning) */ +static inline LilvVoidFunc +lilv_dlfunc(void* handle, const char* symbol) +{ +#ifdef _WIN32 + return (LilvVoidFunc)GetProcAddress((HMODULE)handle, symbol); +#else + typedef LilvVoidFunc (*VoidFuncGetter)(void*, const char*); + VoidFuncGetter dlfunc = (VoidFuncGetter)dlsym; + return dlfunc(handle, symbol); +#endif +} + +#ifdef LILV_DYN_MANIFEST +static const LV2_Feature* const dman_features = {NULL}; + +void +lilv_dynmanifest_free(LilvDynManifest* dynmanifest); +#endif + +#define LILV_ERROR(str) fprintf(stderr, "%s(): error: " str, __func__) +#define LILV_ERRORF(fmt, ...) \ + fprintf(stderr, "%s(): error: " fmt, __func__, __VA_ARGS__) +#define LILV_WARN(str) fprintf(stderr, "%s(): warning: " str, __func__) +#define LILV_WARNF(fmt, ...) \ + fprintf(stderr, "%s(): warning: " fmt, __func__, __VA_ARGS__) +#define LILV_NOTE(str) fprintf(stderr, "%s(): note: " str, __func__) +#define LILV_NOTEF(fmt, ...) \ + fprintf(stderr, "%s(): note: " fmt, __func__, __VA_ARGS__) + +#ifdef __cplusplus +} +#endif + +#endif /* LILV_INTERNAL_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c new file mode 100644 index 00000000..ac47e800 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/node.c @@ -0,0 +1,413 @@ +/* + Copyright 2007-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "filesystem.h" +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "serd/serd.h" +#include "sord/sord.h" + +#include +#include +#include +#include +#include +#include + +static void +lilv_node_set_numerics_from_string(LilvNode* val) +{ + const char* str = (const char*)sord_node_get_string(val->node); + + switch (val->type) { + case LILV_VALUE_URI: + case LILV_VALUE_BLANK: + case LILV_VALUE_STRING: + case LILV_VALUE_BLOB: + break; + case LILV_VALUE_INT: + val->val.int_val = strtol(str, NULL, 10); + break; + case LILV_VALUE_FLOAT: + val->val.float_val = serd_strtod(str, NULL); + break; + case LILV_VALUE_BOOL: + val->val.bool_val = !strcmp(str, "true"); + break; + } +} + +/** Note that if `type` is numeric or boolean, the returned value is corrupt + * until lilv_node_set_numerics_from_string is called. It is not + * automatically called from here to avoid overhead and imprecision when the + * exact string value is known. + */ +LilvNode* +lilv_node_new(LilvWorld* world, LilvNodeType type, const char* str) +{ + LilvNode* val = (LilvNode*)malloc(sizeof(LilvNode)); + val->world = world; + val->type = type; + + const uint8_t* ustr = (const uint8_t*)str; + switch (type) { + case LILV_VALUE_URI: + val->node = sord_new_uri(world->world, ustr); + break; + case LILV_VALUE_BLANK: + val->node = sord_new_blank(world->world, ustr); + break; + case LILV_VALUE_STRING: + val->node = sord_new_literal(world->world, NULL, ustr, NULL); + break; + case LILV_VALUE_INT: + val->node = + sord_new_literal(world->world, world->uris.xsd_integer, ustr, NULL); + break; + case LILV_VALUE_FLOAT: + val->node = + sord_new_literal(world->world, world->uris.xsd_decimal, ustr, NULL); + break; + case LILV_VALUE_BOOL: + val->node = + sord_new_literal(world->world, world->uris.xsd_boolean, ustr, NULL); + break; + case LILV_VALUE_BLOB: + val->node = + sord_new_literal(world->world, world->uris.xsd_base64Binary, ustr, NULL); + break; + } + + if (!val->node) { + free(val); + return NULL; + } + + return val; +} + +/** Create a new LilvNode from `node`, or return NULL if impossible */ +LilvNode* +lilv_node_new_from_node(LilvWorld* world, const SordNode* node) +{ + if (!node) { + return NULL; + } + + LilvNode* result = NULL; + SordNode* datatype_uri = NULL; + LilvNodeType type = LILV_VALUE_STRING; + + switch (sord_node_get_type(node)) { + case SORD_URI: + result = (LilvNode*)malloc(sizeof(LilvNode)); + result->world = world; + result->type = LILV_VALUE_URI; + result->node = sord_node_copy(node); + break; + case SORD_BLANK: + result = (LilvNode*)malloc(sizeof(LilvNode)); + result->world = world; + result->type = LILV_VALUE_BLANK; + result->node = sord_node_copy(node); + break; + case SORD_LITERAL: + datatype_uri = sord_node_get_datatype(node); + if (datatype_uri) { + if (sord_node_equals(datatype_uri, world->uris.xsd_boolean)) { + type = LILV_VALUE_BOOL; + } else if (sord_node_equals(datatype_uri, world->uris.xsd_decimal) || + sord_node_equals(datatype_uri, world->uris.xsd_double)) { + type = LILV_VALUE_FLOAT; + } else if (sord_node_equals(datatype_uri, world->uris.xsd_integer)) { + type = LILV_VALUE_INT; + } else if (sord_node_equals(datatype_uri, world->uris.xsd_base64Binary)) { + type = LILV_VALUE_BLOB; + } else { + LILV_ERRORF("Unknown datatype `%s'\n", + sord_node_get_string(datatype_uri)); + } + } + result = + lilv_node_new(world, type, (const char*)sord_node_get_string(node)); + lilv_node_set_numerics_from_string(result); + break; + } + + return result; +} + +LilvNode* +lilv_new_uri(LilvWorld* world, const char* uri) +{ + return lilv_node_new(world, LILV_VALUE_URI, uri); +} + +LilvNode* +lilv_new_file_uri(LilvWorld* world, const char* host, const char* path) +{ + char* abs_path = lilv_path_absolute(path); + SerdNode s = serd_node_new_file_uri( + (const uint8_t*)abs_path, (const uint8_t*)host, NULL, true); + + LilvNode* ret = lilv_node_new(world, LILV_VALUE_URI, (const char*)s.buf); + serd_node_free(&s); + free(abs_path); + return ret; +} + +LilvNode* +lilv_new_string(LilvWorld* world, const char* str) +{ + return lilv_node_new(world, LILV_VALUE_STRING, str); +} + +LilvNode* +lilv_new_int(LilvWorld* world, int val) +{ + char str[32]; + snprintf(str, sizeof(str), "%d", val); + LilvNode* ret = lilv_node_new(world, LILV_VALUE_INT, str); + if (ret) { + ret->val.int_val = val; + } + return ret; +} + +LilvNode* +lilv_new_float(LilvWorld* world, float val) +{ + char str[32]; + snprintf(str, sizeof(str), "%f", val); + LilvNode* ret = lilv_node_new(world, LILV_VALUE_FLOAT, str); + if (ret) { + ret->val.float_val = val; + } + return ret; +} + +LilvNode* +lilv_new_bool(LilvWorld* world, bool val) +{ + LilvNode* ret = lilv_node_new(world, LILV_VALUE_BOOL, val ? "true" : "false"); + if (ret) { + ret->val.bool_val = val; + } + return ret; +} + +LilvNode* +lilv_node_duplicate(const LilvNode* val) +{ + if (!val) { + return NULL; + } + + LilvNode* result = (LilvNode*)malloc(sizeof(LilvNode)); + result->world = val->world; + result->node = sord_node_copy(val->node); + result->val = val->val; + result->type = val->type; + return result; +} + +void +lilv_node_free(LilvNode* val) +{ + if (val) { + sord_node_free(val->world->world, val->node); + free(val); + } +} + +bool +lilv_node_equals(const LilvNode* value, const LilvNode* other) +{ + if (value == NULL && other == NULL) { + return true; + } + + if (value == NULL || other == NULL || value->type != other->type) { + return false; + } + + switch (value->type) { + case LILV_VALUE_URI: + case LILV_VALUE_BLANK: + case LILV_VALUE_STRING: + case LILV_VALUE_BLOB: + return sord_node_equals(value->node, other->node); + case LILV_VALUE_INT: + return (value->val.int_val == other->val.int_val); + case LILV_VALUE_FLOAT: + return (value->val.float_val == other->val.float_val); + case LILV_VALUE_BOOL: + return (value->val.bool_val == other->val.bool_val); + } + + return false; /* shouldn't get here */ +} + +char* +lilv_node_get_turtle_token(const LilvNode* value) +{ + const char* str = (const char*)sord_node_get_string(value->node); + size_t len = 0; + char* result = NULL; + SerdNode node; + + switch (value->type) { + case LILV_VALUE_URI: + len = strlen(str) + 3; + result = (char*)calloc(len, 1); + snprintf(result, len, "<%s>", str); + break; + case LILV_VALUE_BLANK: + len = strlen(str) + 3; + result = (char*)calloc(len, 1); + snprintf(result, len, "_:%s", str); + break; + case LILV_VALUE_STRING: + case LILV_VALUE_BOOL: + case LILV_VALUE_BLOB: + result = lilv_strdup(str); + break; + case LILV_VALUE_INT: + node = serd_node_new_integer(value->val.int_val); + result = lilv_strdup((char*)node.buf); + serd_node_free(&node); + break; + case LILV_VALUE_FLOAT: + node = serd_node_new_decimal(value->val.float_val, 8); + result = lilv_strdup((char*)node.buf); + serd_node_free(&node); + break; + } + + return result; +} + +bool +lilv_node_is_uri(const LilvNode* value) +{ + return (value && value->type == LILV_VALUE_URI); +} + +const char* +lilv_node_as_uri(const LilvNode* value) +{ + return (lilv_node_is_uri(value) + ? (const char*)sord_node_get_string(value->node) + : NULL); +} + +bool +lilv_node_is_blank(const LilvNode* value) +{ + return (value && value->type == LILV_VALUE_BLANK); +} + +const char* +lilv_node_as_blank(const LilvNode* value) +{ + return (lilv_node_is_blank(value) + ? (const char*)sord_node_get_string(value->node) + : NULL); +} + +bool +lilv_node_is_literal(const LilvNode* value) +{ + if (!value) { + return false; + } + + switch (value->type) { + case LILV_VALUE_STRING: + case LILV_VALUE_INT: + case LILV_VALUE_FLOAT: + case LILV_VALUE_BLOB: + return true; + default: + return false; + } +} + +bool +lilv_node_is_string(const LilvNode* value) +{ + return (value && value->type == LILV_VALUE_STRING); +} + +const char* +lilv_node_as_string(const LilvNode* value) +{ + return value ? (const char*)sord_node_get_string(value->node) : NULL; +} + +bool +lilv_node_is_int(const LilvNode* value) +{ + return (value && value->type == LILV_VALUE_INT); +} + +int +lilv_node_as_int(const LilvNode* value) +{ + return lilv_node_is_int(value) ? value->val.int_val : 0; +} + +bool +lilv_node_is_float(const LilvNode* value) +{ + return (value && value->type == LILV_VALUE_FLOAT); +} + +float +lilv_node_as_float(const LilvNode* value) +{ + if (lilv_node_is_float(value)) { + return value->val.float_val; + } + + if (lilv_node_is_int(value)) { + return (float)value->val.int_val; + } + + return NAN; +} + +bool +lilv_node_is_bool(const LilvNode* value) +{ + return (value && value->type == LILV_VALUE_BOOL); +} + +bool +lilv_node_as_bool(const LilvNode* value) +{ + return lilv_node_is_bool(value) ? value->val.bool_val : false; +} + +char* +lilv_node_get_path(const LilvNode* value, char** hostname) +{ + if (lilv_node_is_uri(value)) { + return lilv_file_uri_parse(lilv_node_as_uri(value), hostname); + } + return NULL; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c new file mode 100644 index 00000000..9c7cbfde --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/plugin.c @@ -0,0 +1,1140 @@ +/* + Copyright 2007-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "serd/serd.h" +#include "sord/sord.h" +#include "zix/tree.h" + +#include "lv2/core/lv2.h" +#include "lv2/ui/ui.h" + +#ifdef LILV_DYN_MANIFEST +# include "lv2/dynmanifest/dynmanifest.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +#define NS_DOAP (const uint8_t*)"http://usefulinc.com/ns/doap#" +#define NS_FOAF (const uint8_t*)"http://xmlns.com/foaf/0.1/" + +static void +lilv_plugin_init(LilvPlugin* plugin, LilvNode* bundle_uri) +{ + plugin->bundle_uri = bundle_uri; + plugin->binary_uri = NULL; +#ifdef LILV_DYN_MANIFEST + plugin->dynmanifest = NULL; +#endif + plugin->plugin_class = NULL; + plugin->data_uris = lilv_nodes_new(); + plugin->ports = NULL; + plugin->num_ports = 0; + plugin->loaded = false; + plugin->parse_errors = false; + plugin->replaced = false; +} + +/** Ownership of `uri` and `bundle` is taken */ +LilvPlugin* +lilv_plugin_new(LilvWorld* world, LilvNode* uri, LilvNode* bundle_uri) +{ + LilvPlugin* plugin = (LilvPlugin*)malloc(sizeof(LilvPlugin)); + + plugin->world = world; + plugin->plugin_uri = uri; + + lilv_plugin_init(plugin, bundle_uri); + return plugin; +} + +void +lilv_plugin_clear(LilvPlugin* plugin, LilvNode* bundle_uri) +{ + lilv_node_free(plugin->bundle_uri); + lilv_node_free(plugin->binary_uri); + lilv_nodes_free(plugin->data_uris); + lilv_plugin_init(plugin, bundle_uri); +} + +static void +lilv_plugin_free_ports(LilvPlugin* plugin) +{ + if (plugin->ports) { + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + lilv_port_free(plugin, plugin->ports[i]); + } + free(plugin->ports); + plugin->num_ports = 0; + plugin->ports = NULL; + } +} + +void +lilv_plugin_free(LilvPlugin* plugin) +{ +#ifdef LILV_DYN_MANIFEST + if (plugin->dynmanifest && --plugin->dynmanifest->refs == 0) { + lilv_dynmanifest_free(plugin->dynmanifest); + } +#endif + + lilv_node_free(plugin->plugin_uri); + plugin->plugin_uri = NULL; + + lilv_node_free(plugin->bundle_uri); + plugin->bundle_uri = NULL; + + lilv_node_free(plugin->binary_uri); + plugin->binary_uri = NULL; + + lilv_plugin_free_ports(plugin); + + lilv_nodes_free(plugin->data_uris); + plugin->data_uris = NULL; + + free(plugin); +} + +static LilvNode* +lilv_plugin_get_one(const LilvPlugin* plugin, + const SordNode* subject, + const SordNode* predicate) +{ + /* TODO: This is slower than it could be in some cases, but it's simpler to + use the existing i18n code. */ + + SordIter* stream = + lilv_world_query_internal(plugin->world, subject, predicate, NULL); + + LilvNodes* nodes = + lilv_nodes_from_stream_objects(plugin->world, stream, SORD_OBJECT); + + if (nodes) { + LilvNode* value = lilv_node_duplicate(lilv_nodes_get_first(nodes)); + lilv_nodes_free(nodes); + return value; + } + + return NULL; +} + +LilvNode* +lilv_plugin_get_unique(const LilvPlugin* plugin, + const SordNode* subject, + const SordNode* predicate) +{ + LilvNode* ret = lilv_plugin_get_one(plugin, subject, predicate); + if (!ret) { + LILV_ERRORF("No value found for (%s %s ...) property\n", + sord_node_get_string(subject), + sord_node_get_string(predicate)); + } + return ret; +} + +static void +lilv_plugin_load(LilvPlugin* plugin) +{ + SordNode* bundle_uri_node = plugin->bundle_uri->node; + const SerdNode* bundle_uri_snode = sord_node_to_serd_node(bundle_uri_node); + + SerdEnv* env = serd_env_new(bundle_uri_snode); + SerdReader* reader = + sord_new_reader(plugin->world->model, env, SERD_TURTLE, bundle_uri_node); + + SordModel* prots = lilv_world_filter_model(plugin->world, + plugin->world->model, + plugin->plugin_uri->node, + plugin->world->uris.lv2_prototype, + NULL, + NULL); + SordModel* skel = sord_new(plugin->world->world, SORD_SPO, false); + SordIter* iter = sord_begin(prots); + for (; !sord_iter_end(iter); sord_iter_next(iter)) { + const SordNode* t = sord_iter_get_node(iter, SORD_OBJECT); + LilvNode* prototype = lilv_node_new_from_node(plugin->world, t); + + lilv_world_load_resource(plugin->world, prototype); + + SordIter* statements = + sord_search(plugin->world->model, prototype->node, NULL, NULL, NULL); + FOREACH_MATCH (statements) { + SordQuad quad; + sord_iter_get(statements, quad); + quad[0] = plugin->plugin_uri->node; + sord_add(skel, quad); + } + + sord_iter_free(statements); + lilv_node_free(prototype); + } + sord_iter_free(iter); + + for (iter = sord_begin(skel); !sord_iter_end(iter); sord_iter_next(iter)) { + SordQuad quad; + sord_iter_get(iter, quad); + sord_add(plugin->world->model, quad); + } + sord_iter_free(iter); + sord_free(skel); + sord_free(prots); + + // Parse all the plugin's data files into RDF model + SerdStatus st = SERD_SUCCESS; + LILV_FOREACH (nodes, i, plugin->data_uris) { + const LilvNode* data_uri = lilv_nodes_get(plugin->data_uris, i); + + serd_env_set_base_uri(env, sord_node_to_serd_node(data_uri->node)); + st = lilv_world_load_file(plugin->world, reader, data_uri); + if (st > SERD_FAILURE) { + break; + } + } + + if (st > SERD_FAILURE) { + plugin->loaded = true; + plugin->parse_errors = true; + serd_reader_free(reader); + serd_env_free(env); + return; + } + +#ifdef LILV_DYN_MANIFEST + // Load and parse dynamic manifest data, if this is a library + if (plugin->dynmanifest) { + typedef int (*GetDataFunc)( + LV2_Dyn_Manifest_Handle handle, FILE * fp, const char* uri); + GetDataFunc get_data_func = (GetDataFunc)lilv_dlfunc( + plugin->dynmanifest->lib, "lv2_dyn_manifest_get_data"); + if (get_data_func) { + const SordNode* bundle = plugin->dynmanifest->bundle->node; + serd_env_set_base_uri(env, sord_node_to_serd_node(bundle)); + FILE* fd = tmpfile(); + get_data_func(plugin->dynmanifest->handle, + fd, + lilv_node_as_string(plugin->plugin_uri)); + rewind(fd); + serd_reader_add_blank_prefix(reader, + lilv_world_blank_node_prefix(plugin->world)); + serd_reader_read_file_handle( + reader, fd, (const uint8_t*)"(dyn-manifest)"); + fclose(fd); + } + } +#endif + serd_reader_free(reader); + serd_env_free(env); + + plugin->loaded = true; +} + +static bool +is_symbol(const char* str) +{ + for (const char* s = str; *s; ++s) { + if (!((*s >= 'a' && *s <= 'z') || (*s >= 'A' && *s <= 'Z') || + (s > str && *s >= '0' && *s <= '9') || *s == '_')) { + return false; + } + } + return true; +} + +static void +lilv_plugin_load_ports_if_necessary(const LilvPlugin* const_plugin) +{ + LilvPlugin* plugin = (LilvPlugin*)const_plugin; + + lilv_plugin_load_if_necessary(plugin); + + if (!plugin->ports) { + plugin->ports = (LilvPort**)malloc(sizeof(LilvPort*)); + plugin->ports[0] = NULL; + + SordIter* ports = lilv_world_query_internal(plugin->world, + plugin->plugin_uri->node, + plugin->world->uris.lv2_port, + NULL); + + FOREACH_MATCH (ports) { + const SordNode* port = sord_iter_get_node(ports, SORD_OBJECT); + + LilvNode* index = + lilv_plugin_get_unique(plugin, port, plugin->world->uris.lv2_index); + + LilvNode* symbol = + lilv_plugin_get_unique(plugin, port, plugin->world->uris.lv2_symbol); + + if (!lilv_node_is_string(symbol) || + !is_symbol((const char*)sord_node_get_string(symbol->node))) { + LILV_ERRORF("Plugin <%s> port symbol `%s' is invalid\n", + lilv_node_as_uri(plugin->plugin_uri), + lilv_node_as_string(symbol)); + lilv_node_free(symbol); + lilv_node_free(index); + lilv_plugin_free_ports(plugin); + break; + } + + if (!lilv_node_is_int(index)) { + LILV_ERRORF("Plugin <%s> port index is not an integer\n", + lilv_node_as_uri(plugin->plugin_uri)); + lilv_node_free(symbol); + lilv_node_free(index); + lilv_plugin_free_ports(plugin); + break; + } + + uint32_t this_index = lilv_node_as_int(index); + LilvPort* this_port = NULL; + if (plugin->num_ports > this_index) { + this_port = plugin->ports[this_index]; + } else { + plugin->ports = (LilvPort**)realloc( + plugin->ports, (this_index + 1) * sizeof(LilvPort*)); + memset(plugin->ports + plugin->num_ports, + '\0', + (this_index - plugin->num_ports) * sizeof(LilvPort*)); + plugin->num_ports = this_index + 1; + } + + // Havn't seen this port yet, add it to array + if (!this_port) { + this_port = lilv_port_new( + plugin->world, port, this_index, lilv_node_as_string(symbol)); + plugin->ports[this_index] = this_port; + } + + SordIter* types = lilv_world_query_internal( + plugin->world, port, plugin->world->uris.rdf_a, NULL); + FOREACH_MATCH (types) { + const SordNode* type = sord_iter_get_node(types, SORD_OBJECT); + if (sord_node_get_type(type) == SORD_URI) { + zix_tree_insert((ZixTree*)this_port->classes, + lilv_node_new_from_node(plugin->world, type), + NULL); + } else { + LILV_WARNF("Plugin <%s> port type is not a URI\n", + lilv_node_as_uri(plugin->plugin_uri)); + } + } + sord_iter_free(types); + + lilv_node_free(symbol); + lilv_node_free(index); + } + sord_iter_free(ports); + + // Check sanity + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + if (!plugin->ports[i]) { + LILV_ERRORF("Plugin <%s> is missing port %u/%u\n", + lilv_node_as_uri(plugin->plugin_uri), + i, + plugin->num_ports); + lilv_plugin_free_ports(plugin); + break; + } + } + } +} + +void +lilv_plugin_load_if_necessary(const LilvPlugin* plugin) +{ + if (!plugin->loaded) { + lilv_plugin_load((LilvPlugin*)plugin); + } +} + +const LilvNode* +lilv_plugin_get_uri(const LilvPlugin* plugin) +{ + return plugin->plugin_uri; +} + +const LilvNode* +lilv_plugin_get_bundle_uri(const LilvPlugin* plugin) +{ + return plugin->bundle_uri; +} + +const LilvNode* +lilv_plugin_get_library_uri(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary((LilvPlugin*)plugin); + if (!plugin->binary_uri) { + // lv2:binary ?binary + SordIter* i = lilv_world_query_internal(plugin->world, + plugin->plugin_uri->node, + plugin->world->uris.lv2_binary, + NULL); + FOREACH_MATCH (i) { + const SordNode* binary_node = sord_iter_get_node(i, SORD_OBJECT); + if (sord_node_get_type(binary_node) == SORD_URI) { + ((LilvPlugin*)plugin)->binary_uri = + lilv_node_new_from_node(plugin->world, binary_node); + break; + } + } + sord_iter_free(i); + } + if (!plugin->binary_uri) { + LILV_WARNF("Plugin <%s> has no lv2:binary\n", + lilv_node_as_uri(lilv_plugin_get_uri(plugin))); + } + return plugin->binary_uri; +} + +const LilvNodes* +lilv_plugin_get_data_uris(const LilvPlugin* plugin) +{ + return plugin->data_uris; +} + +const LilvPluginClass* +lilv_plugin_get_class(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary((LilvPlugin*)plugin); + if (!plugin->plugin_class) { + // a ?class + SordIter* c = lilv_world_query_internal( + plugin->world, plugin->plugin_uri->node, plugin->world->uris.rdf_a, NULL); + FOREACH_MATCH (c) { + const SordNode* class_node = sord_iter_get_node(c, SORD_OBJECT); + if (sord_node_get_type(class_node) != SORD_URI) { + continue; + } + + LilvNode* klass = lilv_node_new_from_node(plugin->world, class_node); + if (!lilv_node_equals(klass, plugin->world->lv2_plugin_class->uri)) { + const LilvPluginClass* pclass = + lilv_plugin_classes_get_by_uri(plugin->world->plugin_classes, klass); + + if (pclass) { + ((LilvPlugin*)plugin)->plugin_class = pclass; + lilv_node_free(klass); + break; + } + } + + lilv_node_free(klass); + } + sord_iter_free(c); + + if (plugin->plugin_class == NULL) { + ((LilvPlugin*)plugin)->plugin_class = plugin->world->lv2_plugin_class; + } + } + return plugin->plugin_class; +} + +static LilvNodes* +lilv_plugin_get_value_internal(const LilvPlugin* plugin, + const SordNode* predicate) +{ + lilv_plugin_load_if_necessary(plugin); + return lilv_world_find_nodes_internal( + plugin->world, plugin->plugin_uri->node, predicate, NULL); +} + +bool +lilv_plugin_verify(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + if (plugin->parse_errors) { + return false; + } + + LilvNode* rdf_type = lilv_new_uri(plugin->world, LILV_NS_RDF "type"); + LilvNodes* results = lilv_plugin_get_value(plugin, rdf_type); + lilv_node_free(rdf_type); + if (!results) { + return false; + } + + lilv_nodes_free(results); + results = + lilv_plugin_get_value_internal(plugin, plugin->world->uris.doap_name); + if (!results) { + return false; + } + + lilv_nodes_free(results); + LilvNode* lv2_port = lilv_new_uri(plugin->world, LV2_CORE__port); + results = lilv_plugin_get_value(plugin, lv2_port); + lilv_node_free(lv2_port); + if (!results) { + return false; + } + + lilv_nodes_free(results); + return true; +} + +LilvNode* +lilv_plugin_get_name(const LilvPlugin* plugin) +{ + LilvNodes* results = + lilv_plugin_get_value_internal(plugin, plugin->world->uris.doap_name); + + LilvNode* ret = NULL; + if (results) { + LilvNode* val = lilv_nodes_get_first(results); + if (lilv_node_is_string(val)) { + ret = lilv_node_duplicate(val); + } + lilv_nodes_free(results); + } + + if (!ret) { + LILV_WARNF("Plugin <%s> has no (mandatory) doap:name\n", + lilv_node_as_string(lilv_plugin_get_uri(plugin))); + } + + return ret; +} + +LilvNodes* +lilv_plugin_get_value(const LilvPlugin* plugin, const LilvNode* predicate) +{ + lilv_plugin_load_if_necessary(plugin); + return lilv_world_find_nodes( + plugin->world, plugin->plugin_uri, predicate, NULL); +} + +uint32_t +lilv_plugin_get_num_ports(const LilvPlugin* plugin) +{ + lilv_plugin_load_ports_if_necessary(plugin); + return plugin->num_ports; +} + +void +lilv_plugin_get_port_ranges_float(const LilvPlugin* plugin, + float* min_values, + float* max_values, + float* def_values) +{ + lilv_plugin_load_ports_if_necessary(plugin); + LilvNode* min = NULL; + LilvNode* max = NULL; + LilvNode* def = NULL; + LilvNode** minptr = min_values ? &min : NULL; + LilvNode** maxptr = max_values ? &max : NULL; + LilvNode** defptr = def_values ? &def : NULL; + + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + lilv_port_get_range(plugin, plugin->ports[i], defptr, minptr, maxptr); + + if (min_values) { + if (lilv_node_is_float(min) || lilv_node_is_int(min)) { + min_values[i] = lilv_node_as_float(min); + } else { + min_values[i] = NAN; + } + } + + if (max_values) { + if (lilv_node_is_float(max) || lilv_node_is_int(max)) { + max_values[i] = lilv_node_as_float(max); + } else { + max_values[i] = NAN; + } + } + + if (def_values) { + if (lilv_node_is_float(def) || lilv_node_is_int(def)) { + def_values[i] = lilv_node_as_float(def); + } else { + def_values[i] = NAN; + } + } + + lilv_node_free(def); + lilv_node_free(min); + lilv_node_free(max); + } +} + +uint32_t +lilv_plugin_get_num_ports_of_class_va(const LilvPlugin* plugin, + const LilvNode* class_1, + va_list args) +{ + lilv_plugin_load_ports_if_necessary(plugin); + + uint32_t count = 0; + + // Build array of classes from args so we can walk it several times + size_t n_classes = 0; + const LilvNode** classes = NULL; + for (LilvNode* c = NULL; (c = va_arg(args, LilvNode*));) { + classes = + (const LilvNode**)realloc(classes, ++n_classes * sizeof(LilvNode*)); + classes[n_classes - 1] = c; + } + + // Check each port against every type + for (unsigned i = 0; i < plugin->num_ports; ++i) { + LilvPort* port = plugin->ports[i]; + if (port && lilv_port_is_a(plugin, port, class_1)) { + bool matches = true; + for (size_t j = 0; j < n_classes; ++j) { + if (!lilv_port_is_a(plugin, port, classes[j])) { + matches = false; + break; + } + } + + if (matches) { + ++count; + } + } + } + + free(classes); + return count; +} + +uint32_t +lilv_plugin_get_num_ports_of_class(const LilvPlugin* plugin, + const LilvNode* class_1, + ...) +{ + va_list args; + va_start(args, class_1); + + uint32_t count = lilv_plugin_get_num_ports_of_class_va(plugin, class_1, args); + + va_end(args); + return count; +} + +bool +lilv_plugin_has_latency(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + SordIter* ports = lilv_world_query_internal(plugin->world, + plugin->plugin_uri->node, + plugin->world->uris.lv2_port, + NULL); + + bool ret = false; + FOREACH_MATCH (ports) { + const SordNode* port = sord_iter_get_node(ports, SORD_OBJECT); + + SordIter* prop = + lilv_world_query_internal(plugin->world, + port, + plugin->world->uris.lv2_portProperty, + plugin->world->uris.lv2_reportsLatency); + + SordIter* des = + lilv_world_query_internal(plugin->world, + port, + plugin->world->uris.lv2_designation, + plugin->world->uris.lv2_latency); + + const bool latent = !sord_iter_end(prop) || !sord_iter_end(des); + sord_iter_free(prop); + sord_iter_free(des); + if (latent) { + ret = true; + break; + } + } + sord_iter_free(ports); + + return ret; +} + +static const LilvPort* +lilv_plugin_get_port_by_property(const LilvPlugin* plugin, + const SordNode* port_property) +{ + lilv_plugin_load_ports_if_necessary(plugin); + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + LilvPort* port = plugin->ports[i]; + SordIter* iter = + lilv_world_query_internal(plugin->world, + port->node->node, + plugin->world->uris.lv2_portProperty, + port_property); + + const bool found = !sord_iter_end(iter); + sord_iter_free(iter); + + if (found) { + return port; + } + } + + return NULL; +} + +const LilvPort* +lilv_plugin_get_port_by_designation(const LilvPlugin* plugin, + const LilvNode* port_class, + const LilvNode* designation) +{ + LilvWorld* world = plugin->world; + lilv_plugin_load_ports_if_necessary(plugin); + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + LilvPort* port = plugin->ports[i]; + SordIter* iter = lilv_world_query_internal( + world, port->node->node, world->uris.lv2_designation, designation->node); + + const bool found = + !sord_iter_end(iter) && + (!port_class || lilv_port_is_a(plugin, port, port_class)); + sord_iter_free(iter); + + if (found) { + return port; + } + } + + return NULL; +} + +uint32_t +lilv_plugin_get_latency_port_index(const LilvPlugin* plugin) +{ + LilvNode* lv2_OutputPort = lilv_new_uri(plugin->world, LV2_CORE__OutputPort); + LilvNode* lv2_latency = lilv_new_uri(plugin->world, LV2_CORE__latency); + + const LilvPort* prop_port = lilv_plugin_get_port_by_property( + plugin, plugin->world->uris.lv2_reportsLatency); + const LilvPort* des_port = + lilv_plugin_get_port_by_designation(plugin, lv2_OutputPort, lv2_latency); + + lilv_node_free(lv2_latency); + lilv_node_free(lv2_OutputPort); + + if (prop_port) { + return prop_port->index; + } + + if (des_port) { + return des_port->index; + } + + return (uint32_t)-1; +} + +bool +lilv_plugin_has_feature(const LilvPlugin* plugin, const LilvNode* feature) +{ + lilv_plugin_load_if_necessary(plugin); + const SordNode* predicates[] = {plugin->world->uris.lv2_requiredFeature, + plugin->world->uris.lv2_optionalFeature, + NULL}; + + for (const SordNode** pred = predicates; *pred; ++pred) { + if (lilv_world_ask_internal( + plugin->world, plugin->plugin_uri->node, *pred, feature->node)) { + return true; + } + } + return false; +} + +LilvNodes* +lilv_plugin_get_supported_features(const LilvPlugin* plugin) +{ + LilvNodes* optional = lilv_plugin_get_optional_features(plugin); + LilvNodes* required = lilv_plugin_get_required_features(plugin); + LilvNodes* result = lilv_nodes_merge(optional, required); + lilv_nodes_free(optional); + lilv_nodes_free(required); + return result; +} + +LilvNodes* +lilv_plugin_get_optional_features(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + return lilv_world_find_nodes_internal(plugin->world, + plugin->plugin_uri->node, + plugin->world->uris.lv2_optionalFeature, + NULL); +} + +LilvNodes* +lilv_plugin_get_required_features(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + return lilv_world_find_nodes_internal(plugin->world, + plugin->plugin_uri->node, + plugin->world->uris.lv2_requiredFeature, + NULL); +} + +bool +lilv_plugin_has_extension_data(const LilvPlugin* plugin, const LilvNode* uri) +{ + if (!lilv_node_is_uri(uri)) { + LILV_ERRORF("Extension data `%s' is not a URI\n", + sord_node_get_string(uri->node)); + return false; + } + + lilv_plugin_load_if_necessary(plugin); + return lilv_world_ask_internal(plugin->world, + plugin->plugin_uri->node, + plugin->world->uris.lv2_extensionData, + uri->node); +} + +LilvNodes* +lilv_plugin_get_extension_data(const LilvPlugin* plugin) +{ + return lilv_plugin_get_value_internal(plugin, + plugin->world->uris.lv2_extensionData); +} + +const LilvPort* +lilv_plugin_get_port_by_index(const LilvPlugin* plugin, uint32_t index) +{ + lilv_plugin_load_ports_if_necessary(plugin); + if (index < plugin->num_ports) { + return plugin->ports[index]; + } + + return NULL; +} + +const LilvPort* +lilv_plugin_get_port_by_symbol(const LilvPlugin* plugin, const LilvNode* symbol) +{ + lilv_plugin_load_ports_if_necessary(plugin); + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + LilvPort* port = plugin->ports[i]; + if (lilv_node_equals(port->symbol, symbol)) { + return port; + } + } + + return NULL; +} + +LilvNode* +lilv_plugin_get_project(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + + SordNode* lv2_project = + sord_new_uri(plugin->world->world, (const uint8_t*)LV2_CORE__project); + + SordIter* projects = lilv_world_query_internal( + plugin->world, plugin->plugin_uri->node, lv2_project, NULL); + + sord_node_free(plugin->world->world, lv2_project); + + if (sord_iter_end(projects)) { + sord_iter_free(projects); + return NULL; + } + + const SordNode* project = sord_iter_get_node(projects, SORD_OBJECT); + + sord_iter_free(projects); + return lilv_node_new_from_node(plugin->world, project); +} + +static const SordNode* +lilv_plugin_get_author(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + + SordNode* doap_maintainer = + sord_new_uri(plugin->world->world, NS_DOAP "maintainer"); + + SordIter* maintainers = lilv_world_query_internal( + plugin->world, plugin->plugin_uri->node, doap_maintainer, NULL); + + if (sord_iter_end(maintainers)) { + sord_iter_free(maintainers); + + LilvNode* project = lilv_plugin_get_project(plugin); + if (!project) { + sord_node_free(plugin->world->world, doap_maintainer); + return NULL; + } + + maintainers = lilv_world_query_internal( + plugin->world, project->node, doap_maintainer, NULL); + + lilv_node_free(project); + } + + sord_node_free(plugin->world->world, doap_maintainer); + + if (sord_iter_end(maintainers)) { + sord_iter_free(maintainers); + return NULL; + } + + const SordNode* author = sord_iter_get_node(maintainers, SORD_OBJECT); + + sord_iter_free(maintainers); + return author; +} + +static LilvNode* +lilv_plugin_get_author_property(const LilvPlugin* plugin, const uint8_t* uri) +{ + const SordNode* author = lilv_plugin_get_author(plugin); + if (author) { + SordWorld* sworld = plugin->world->world; + SordNode* pred = sord_new_uri(sworld, uri); + LilvNode* ret = lilv_plugin_get_one(plugin, author, pred); + sord_node_free(sworld, pred); + return ret; + } + return NULL; +} + +LilvNode* +lilv_plugin_get_author_name(const LilvPlugin* plugin) +{ + return lilv_plugin_get_author_property(plugin, NS_FOAF "name"); +} + +LilvNode* +lilv_plugin_get_author_email(const LilvPlugin* plugin) +{ + return lilv_plugin_get_author_property(plugin, NS_FOAF "mbox"); +} + +LilvNode* +lilv_plugin_get_author_homepage(const LilvPlugin* plugin) +{ + return lilv_plugin_get_author_property(plugin, NS_FOAF "homepage"); +} + +bool +lilv_plugin_is_replaced(const LilvPlugin* plugin) +{ + return plugin->replaced; +} + +LilvUIs* +lilv_plugin_get_uis(const LilvPlugin* plugin) +{ + lilv_plugin_load_if_necessary(plugin); + + SordNode* ui_ui_node = + sord_new_uri(plugin->world->world, (const uint8_t*)LV2_UI__ui); + SordNode* ui_binary_node = + sord_new_uri(plugin->world->world, (const uint8_t*)LV2_UI__binary); + + LilvUIs* result = lilv_uis_new(); + SordIter* uis = lilv_world_query_internal( + plugin->world, plugin->plugin_uri->node, ui_ui_node, NULL); + + FOREACH_MATCH (uis) { + const SordNode* ui = sord_iter_get_node(uis, SORD_OBJECT); + + LilvNode* type = + lilv_plugin_get_unique(plugin, ui, plugin->world->uris.rdf_a); + LilvNode* binary = + lilv_plugin_get_one(plugin, ui, plugin->world->uris.lv2_binary); + if (!binary) { + binary = lilv_plugin_get_unique(plugin, ui, ui_binary_node); + } + + if (sord_node_get_type(ui) != SORD_URI || !lilv_node_is_uri(type) || + !lilv_node_is_uri(binary)) { + lilv_node_free(binary); + lilv_node_free(type); + LILV_ERRORF("Corrupt UI <%s>\n", sord_node_get_string(ui)); + continue; + } + + LilvUI* lilv_ui = lilv_ui_new( + plugin->world, lilv_node_new_from_node(plugin->world, ui), type, binary); + + zix_tree_insert((ZixTree*)result, lilv_ui, NULL); + } + sord_iter_free(uis); + + sord_node_free(plugin->world->world, ui_binary_node); + sord_node_free(plugin->world->world, ui_ui_node); + + if (lilv_uis_size(result) > 0) { + return result; + } + + lilv_uis_free(result); + return NULL; +} + +LilvNodes* +lilv_plugin_get_related(const LilvPlugin* plugin, const LilvNode* type) +{ + lilv_plugin_load_if_necessary(plugin); + + LilvWorld* const world = plugin->world; + LilvNodes* const related = lilv_world_find_nodes_internal( + world, NULL, world->uris.lv2_appliesTo, lilv_plugin_get_uri(plugin)->node); + + if (!type) { + return related; + } + + LilvNodes* matches = lilv_nodes_new(); + LILV_FOREACH (nodes, i, related) { + LilvNode* node = (LilvNode*)lilv_collection_get((ZixTree*)related, i); + if (lilv_world_ask_internal( + world, node->node, world->uris.rdf_a, type->node)) { + zix_tree_insert( + (ZixTree*)matches, lilv_node_new_from_node(world, node->node), NULL); + } + } + + lilv_nodes_free(related); + return matches; +} + +static SerdEnv* +new_lv2_env(const SerdNode* base) +{ + SerdEnv* env = serd_env_new(base); + +#define USTR(s) ((const uint8_t*)(s)) + + serd_env_set_prefix_from_strings(env, USTR("doap"), USTR(LILV_NS_DOAP)); + serd_env_set_prefix_from_strings(env, USTR("foaf"), USTR(LILV_NS_FOAF)); + serd_env_set_prefix_from_strings(env, USTR("lv2"), USTR(LILV_NS_LV2)); + serd_env_set_prefix_from_strings(env, USTR("owl"), USTR(LILV_NS_OWL)); + serd_env_set_prefix_from_strings(env, USTR("rdf"), USTR(LILV_NS_RDF)); + serd_env_set_prefix_from_strings(env, USTR("rdfs"), USTR(LILV_NS_RDFS)); + serd_env_set_prefix_from_strings(env, USTR("xsd"), USTR(LILV_NS_XSD)); + + return env; +} + +static void +maybe_write_prefixes(SerdWriter* writer, SerdEnv* env, FILE* file) +{ + fseek(file, 0, SEEK_END); + if (ftell(file) == 0) { + serd_env_foreach(env, (SerdPrefixSink)serd_writer_set_prefix, writer); + } else { + fprintf(file, "\n"); + } +} + +void +lilv_plugin_write_description(LilvWorld* world, + const LilvPlugin* plugin, + const LilvNode* base_uri, + FILE* plugin_file) +{ + const LilvNode* subject = lilv_plugin_get_uri(plugin); + const uint32_t num_ports = lilv_plugin_get_num_ports(plugin); + const SerdNode* base = sord_node_to_serd_node(base_uri->node); + SerdEnv* env = new_lv2_env(base); + + SerdWriter* writer = + serd_writer_new(SERD_TURTLE, + (SerdStyle)(SERD_STYLE_ABBREVIATED | SERD_STYLE_CURIED), + env, + NULL, + serd_file_sink, + plugin_file); + + // Write prefixes if this is a new file + maybe_write_prefixes(writer, env, plugin_file); + + // Write plugin description + SordIter* plug_iter = + lilv_world_query_internal(world, subject->node, NULL, NULL); + sord_write_iter(plug_iter, writer); + + // Write port descriptions + for (uint32_t i = 0; i < num_ports; ++i) { + const LilvPort* port = plugin->ports[i]; + SordIter* port_iter = + lilv_world_query_internal(world, port->node->node, NULL, NULL); + sord_write_iter(port_iter, writer); + } + + serd_writer_free(writer); + serd_env_free(env); +} + +void +lilv_plugin_write_manifest_entry(LilvWorld* world, + const LilvPlugin* plugin, + const LilvNode* base_uri, + FILE* manifest_file, + const char* plugin_file_path) +{ + (void)world; + + const LilvNode* subject = lilv_plugin_get_uri(plugin); + const SerdNode* base = sord_node_to_serd_node(base_uri->node); + SerdEnv* env = new_lv2_env(base); + + SerdWriter* writer = + serd_writer_new(SERD_TURTLE, + (SerdStyle)(SERD_STYLE_ABBREVIATED | SERD_STYLE_CURIED), + env, + NULL, + serd_file_sink, + manifest_file); + + // Write prefixes if this is a new file + maybe_write_prefixes(writer, env, manifest_file); + + // Write manifest entry + serd_writer_write_statement( + writer, + 0, + NULL, + sord_node_to_serd_node(subject->node), + sord_node_to_serd_node(plugin->world->uris.rdf_a), + sord_node_to_serd_node(plugin->world->uris.lv2_Plugin), + 0, + 0); + + const SerdNode file_node = + serd_node_from_string(SERD_URI, (const uint8_t*)plugin_file_path); + serd_writer_write_statement( + writer, + 0, + NULL, + sord_node_to_serd_node(subject->node), + sord_node_to_serd_node(plugin->world->uris.rdfs_seeAlso), + &file_node, + 0, + 0); + + serd_writer_free(writer); + serd_env_free(env); +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c new file mode 100644 index 00000000..2f0afe74 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/pluginclass.c @@ -0,0 +1,91 @@ +/* + Copyright 2007-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "sord/sord.h" +#include "zix/tree.h" + +#include +#include + +LilvPluginClass* +lilv_plugin_class_new(LilvWorld* world, + const SordNode* parent_node, + const SordNode* uri, + const char* label) +{ + LilvPluginClass* pc = (LilvPluginClass*)malloc(sizeof(LilvPluginClass)); + pc->world = world; + pc->uri = lilv_node_new_from_node(world, uri); + pc->label = lilv_node_new(world, LILV_VALUE_STRING, label); + pc->parent_uri = + (parent_node ? lilv_node_new_from_node(world, parent_node) : NULL); + return pc; +} + +void +lilv_plugin_class_free(LilvPluginClass* plugin_class) +{ + if (!plugin_class) { + return; + } + + lilv_node_free(plugin_class->uri); + lilv_node_free(plugin_class->parent_uri); + lilv_node_free(plugin_class->label); + free(plugin_class); +} + +const LilvNode* +lilv_plugin_class_get_parent_uri(const LilvPluginClass* plugin_class) +{ + return plugin_class->parent_uri ? plugin_class->parent_uri : NULL; +} + +const LilvNode* +lilv_plugin_class_get_uri(const LilvPluginClass* plugin_class) +{ + return plugin_class->uri; +} + +const LilvNode* +lilv_plugin_class_get_label(const LilvPluginClass* plugin_class) +{ + return plugin_class->label; +} + +LilvPluginClasses* +lilv_plugin_class_get_children(const LilvPluginClass* plugin_class) +{ + // Returned list doesn't own categories + LilvPluginClasses* all = plugin_class->world->plugin_classes; + LilvPluginClasses* result = zix_tree_new(false, lilv_ptr_cmp, NULL, NULL); + + for (ZixTreeIter* i = zix_tree_begin((ZixTree*)all); + i != zix_tree_end((ZixTree*)all); + i = zix_tree_iter_next(i)) { + const LilvPluginClass* c = (LilvPluginClass*)zix_tree_get(i); + const LilvNode* parent = lilv_plugin_class_get_parent_uri(c); + if (parent && + lilv_node_equals(lilv_plugin_class_get_uri(plugin_class), parent)) { + zix_tree_insert((ZixTree*)result, (LilvPluginClass*)c, NULL); + } + } + + return result; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c new file mode 100644 index 00000000..71edaf19 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/port.c @@ -0,0 +1,272 @@ +/* + Copyright 2007-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lilv_internal.h" + +#include "lv2/atom/atom.h" +#include "lv2/core/lv2.h" +#include "lv2/event/event.h" + +#include "lilv/lilv.h" +#include "sord/sord.h" +#include "zix/tree.h" + +#include +#include +#include +#include +#include + +LilvPort* +lilv_port_new(LilvWorld* world, + const SordNode* node, + uint32_t index, + const char* symbol) +{ + LilvPort* port = (LilvPort*)malloc(sizeof(LilvPort)); + port->node = lilv_node_new_from_node(world, node); + port->index = index; + port->symbol = lilv_node_new(world, LILV_VALUE_STRING, symbol); + port->classes = lilv_nodes_new(); + return port; +} + +void +lilv_port_free(const LilvPlugin* plugin, LilvPort* port) +{ + (void)plugin; + + if (port) { + lilv_node_free(port->node); + lilv_nodes_free(port->classes); + lilv_node_free(port->symbol); + free(port); + } +} + +bool +lilv_port_is_a(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* port_class) +{ + (void)plugin; + + LILV_FOREACH (nodes, i, port->classes) { + if (lilv_node_equals(lilv_nodes_get(port->classes, i), port_class)) { + return true; + } + } + + return false; +} + +bool +lilv_port_has_property(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* property) +{ + return lilv_world_ask_internal(plugin->world, + port->node->node, + plugin->world->uris.lv2_portProperty, + property->node); +} + +bool +lilv_port_supports_event(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* event_type) +{ + const uint8_t* predicates[] = {(const uint8_t*)LV2_EVENT__supportsEvent, + (const uint8_t*)LV2_ATOM__supports, + NULL}; + + for (const uint8_t** pred = predicates; *pred; ++pred) { + if (lilv_world_ask_internal(plugin->world, + port->node->node, + sord_new_uri(plugin->world->world, *pred), + event_type->node)) { + return true; + } + } + return false; +} + +static LilvNodes* +lilv_port_get_value_by_node(const LilvPlugin* plugin, + const LilvPort* port, + const SordNode* predicate) +{ + return lilv_world_find_nodes_internal( + plugin->world, port->node->node, predicate, NULL); +} + +const LilvNode* +lilv_port_get_node(const LilvPlugin* plugin, const LilvPort* port) +{ + (void)plugin; + + return port->node; +} + +LilvNodes* +lilv_port_get_value(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* predicate) +{ + if (!lilv_node_is_uri(predicate)) { + LILV_ERRORF("Predicate `%s' is not a URI\n", + sord_node_get_string(predicate->node)); + return NULL; + } + + return lilv_port_get_value_by_node(plugin, port, predicate->node); +} + +LilvNode* +lilv_port_get(const LilvPlugin* plugin, + const LilvPort* port, + const LilvNode* predicate) +{ + LilvNodes* values = lilv_port_get_value(plugin, port, predicate); + + LilvNode* value = + lilv_node_duplicate(values ? lilv_nodes_get_first(values) : NULL); + + lilv_nodes_free(values); + return value; +} + +uint32_t +lilv_port_get_index(const LilvPlugin* plugin, const LilvPort* port) +{ + (void)plugin; + + return port->index; +} + +const LilvNode* +lilv_port_get_symbol(const LilvPlugin* plugin, const LilvPort* port) +{ + (void)plugin; + + return port->symbol; +} + +LilvNode* +lilv_port_get_name(const LilvPlugin* plugin, const LilvPort* port) +{ + LilvNodes* results = + lilv_port_get_value_by_node(plugin, port, plugin->world->uris.lv2_name); + + LilvNode* ret = NULL; + if (results) { + LilvNode* val = lilv_nodes_get_first(results); + if (lilv_node_is_string(val)) { + ret = lilv_node_duplicate(val); + } + lilv_nodes_free(results); + } + + if (!ret) { + LILV_WARNF("Plugin <%s> port has no (mandatory) doap:name\n", + lilv_node_as_string(lilv_plugin_get_uri(plugin))); + } + + return ret; +} + +const LilvNodes* +lilv_port_get_classes(const LilvPlugin* plugin, const LilvPort* port) +{ + (void)plugin; + + return port->classes; +} + +void +lilv_port_get_range(const LilvPlugin* plugin, + const LilvPort* port, + LilvNode** def, + LilvNode** min, + LilvNode** max) +{ + if (def) { + LilvNodes* defaults = lilv_port_get_value_by_node( + plugin, port, plugin->world->uris.lv2_default); + *def = + defaults ? lilv_node_duplicate(lilv_nodes_get_first(defaults)) : NULL; + lilv_nodes_free(defaults); + } + + if (min) { + LilvNodes* minimums = lilv_port_get_value_by_node( + plugin, port, plugin->world->uris.lv2_minimum); + *min = + minimums ? lilv_node_duplicate(lilv_nodes_get_first(minimums)) : NULL; + lilv_nodes_free(minimums); + } + + if (max) { + LilvNodes* maximums = lilv_port_get_value_by_node( + plugin, port, plugin->world->uris.lv2_maximum); + *max = + maximums ? lilv_node_duplicate(lilv_nodes_get_first(maximums)) : NULL; + lilv_nodes_free(maximums); + } +} + +LilvScalePoints* +lilv_port_get_scale_points(const LilvPlugin* plugin, const LilvPort* port) +{ + SordIter* points = lilv_world_query_internal( + plugin->world, + port->node->node, + sord_new_uri(plugin->world->world, (const uint8_t*)LV2_CORE__scalePoint), + NULL); + + LilvScalePoints* ret = NULL; + if (!sord_iter_end(points)) { + ret = lilv_scale_points_new(); + } + + FOREACH_MATCH (points) { + const SordNode* point = sord_iter_get_node(points, SORD_OBJECT); + + LilvNode* value = + lilv_plugin_get_unique(plugin, point, plugin->world->uris.rdf_value); + + LilvNode* label = + lilv_plugin_get_unique(plugin, point, plugin->world->uris.rdfs_label); + + if (value && label) { + zix_tree_insert((ZixTree*)ret, lilv_scale_point_new(value, label), NULL); + } + } + sord_iter_free(points); + + assert(!ret || lilv_nodes_size(ret) > 0); + return ret; +} + +LilvNodes* +lilv_port_get_properties(const LilvPlugin* plugin, const LilvPort* port) +{ + LilvNode* pred = lilv_node_new_from_node( + plugin->world, plugin->world->uris.lv2_portProperty); + LilvNodes* ret = lilv_port_get_value(plugin, port, pred); + lilv_node_free(pred); + return ret; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c new file mode 100644 index 00000000..eb179f22 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/query.c @@ -0,0 +1,144 @@ +/* + Copyright 2007-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "sord/sord.h" +#include "zix/tree.h" + +#include +#include + +typedef enum { + LILV_LANG_MATCH_NONE, ///< Language does not match at all + LILV_LANG_MATCH_PARTIAL, ///< Partial (language, but not country) match + LILV_LANG_MATCH_EXACT ///< Exact (language and country) match +} LilvLangMatch; + +static LilvLangMatch +lilv_lang_matches(const char* a, const char* b) +{ + if (!a || !b) { + return LILV_LANG_MATCH_NONE; + } + + if (!strcmp(a, b)) { + return LILV_LANG_MATCH_EXACT; + } + + const char* a_dash = strchr(a, '-'); + const size_t a_lang_len = a_dash ? (size_t)(a_dash - a) : strlen(a); + const char* b_dash = strchr(b, '-'); + const size_t b_lang_len = b_dash ? (size_t)(b_dash - b) : strlen(b); + + if (a_lang_len == b_lang_len && !strncmp(a, b, a_lang_len)) { + return LILV_LANG_MATCH_PARTIAL; + } + + return LILV_LANG_MATCH_NONE; +} + +static LilvNodes* +lilv_nodes_from_stream_objects_i18n(LilvWorld* world, + SordIter* stream, + SordQuadIndex field) +{ + LilvNodes* values = lilv_nodes_new(); + const SordNode* nolang = NULL; // Untranslated value + const SordNode* partial = NULL; // Partial language match + char* syslang = lilv_get_lang(); + FOREACH_MATCH (stream) { + const SordNode* value = sord_iter_get_node(stream, field); + if (sord_node_get_type(value) == SORD_LITERAL) { + const char* lang = sord_node_get_language(value); + + if (!lang) { + nolang = value; + } else { + switch (lilv_lang_matches(lang, syslang)) { + case LILV_LANG_MATCH_EXACT: + // Exact language match, add to results + zix_tree_insert( + (ZixTree*)values, lilv_node_new_from_node(world, value), NULL); + break; + case LILV_LANG_MATCH_PARTIAL: + // Partial language match, save in case we find no exact + partial = value; + break; + case LILV_LANG_MATCH_NONE: + break; + } + } + } else { + zix_tree_insert( + (ZixTree*)values, lilv_node_new_from_node(world, value), NULL); + } + } + sord_iter_free(stream); + free(syslang); + + if (lilv_nodes_size(values) > 0) { + return values; + } + + const SordNode* best = nolang; + if (syslang && partial) { + // Partial language match for system language + best = partial; + } else if (!best) { + // No languages matches at all, and no untranslated value + // Use any value, if possible + best = partial; + } + + if (best) { + zix_tree_insert( + (ZixTree*)values, lilv_node_new_from_node(world, best), NULL); + } else { + // No matches whatsoever + lilv_nodes_free(values); + values = NULL; + } + + return values; +} + +LilvNodes* +lilv_nodes_from_stream_objects(LilvWorld* world, + SordIter* stream, + SordQuadIndex field) +{ + if (sord_iter_end(stream)) { + sord_iter_free(stream); + return NULL; + } + + if (world->opt.filter_language) { + return lilv_nodes_from_stream_objects_i18n(world, stream, field); + } + + LilvNodes* values = lilv_nodes_new(); + FOREACH_MATCH (stream) { + const SordNode* value = sord_iter_get_node(stream, field); + LilvNode* node = lilv_node_new_from_node(world, value); + if (node) { + zix_tree_insert((ZixTree*)values, node, NULL); + } + } + sord_iter_free(stream); + return values; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c new file mode 100644 index 00000000..e2db9485 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/scalepoint.c @@ -0,0 +1,53 @@ +/* + Copyright 2007-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" + +#include + +/** Ownership of value and label is taken */ +LilvScalePoint* +lilv_scale_point_new(LilvNode* value, LilvNode* label) +{ + LilvScalePoint* point = (LilvScalePoint*)malloc(sizeof(LilvScalePoint)); + point->value = value; + point->label = label; + return point; +} + +void +lilv_scale_point_free(LilvScalePoint* point) +{ + if (point) { + lilv_node_free(point->value); + lilv_node_free(point->label); + free(point); + } +} + +const LilvNode* +lilv_scale_point_get_value(const LilvScalePoint* point) +{ + return point->value; +} + +const LilvNode* +lilv_scale_point_get_label(const LilvScalePoint* point) +{ + return point->label; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c new file mode 100644 index 00000000..47608188 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/state.c @@ -0,0 +1,1541 @@ +/* + Copyright 2007-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "filesystem.h" +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "serd/serd.h" +#include "sord/sord.h" +#include "sratom/sratom.h" +#include "zix/tree.h" + +#include "lv2/atom/atom.h" +#include "lv2/atom/forge.h" +#include "lv2/core/lv2.h" +#include "lv2/presets/presets.h" +#include "lv2/state/state.h" +#include "lv2/urid/urid.h" + +#include +#include +#include +#include +#include +#include +#include + +#define USTR(s) ((const uint8_t*)(s)) + +typedef struct { + void* value; ///< Value/Object + size_t size; ///< Size of value + uint32_t key; ///< Key/Predicate (URID) + uint32_t type; ///< Type of value (URID) + uint32_t flags; ///< State flags (POD, etc) +} Property; + +typedef struct { + char* symbol; ///< Symbol of port + LV2_Atom* atom; ///< Value in port +} PortValue; + +typedef struct { + char* abs; ///< Absolute path of actual file + char* rel; ///< Abstract path (relative path in state dir) +} PathMap; + +typedef struct { + size_t n; + Property* props; +} PropertyArray; + +struct LilvStateImpl { + LilvNode* plugin_uri; ///< Plugin URI + LilvNode* uri; ///< State/preset URI + char* dir; ///< Save directory (if saved) + char* scratch_dir; ///< Directory for files created by plugin + char* copy_dir; ///< Directory for snapshots of external files + char* link_dir; ///< Directory for links to external files + char* label; ///< State/Preset label + ZixTree* abs2rel; ///< PathMap sorted by abs + ZixTree* rel2abs; ///< PathMap sorted by rel + PropertyArray props; ///< State properties + PropertyArray metadata; ///< State metadata + PortValue* values; ///< Port values + uint32_t atom_Path; ///< atom:Path URID + uint32_t n_values; ///< Number of port values +}; + +static int +abs_cmp(const void* a, const void* b, const void* user_data) +{ + (void)user_data; + + return strcmp(((const PathMap*)a)->abs, ((const PathMap*)b)->abs); +} + +static int +rel_cmp(const void* a, const void* b, const void* user_data) +{ + (void)user_data; + + return strcmp(((const PathMap*)a)->rel, ((const PathMap*)b)->rel); +} + +static int +property_cmp(const void* a, const void* b) +{ + const uint32_t a_key = ((const Property*)a)->key; + const uint32_t b_key = ((const Property*)b)->key; + + if (a_key < b_key) { + return -1; + } + + if (b_key < a_key) { + return 1; + } + + return 0; +} + +static int +value_cmp(const void* a, const void* b) +{ + return strcmp(((const PortValue*)a)->symbol, ((const PortValue*)b)->symbol); +} + +static void +path_rel_free(void* ptr) +{ + free(((PathMap*)ptr)->abs); + free(((PathMap*)ptr)->rel); + free(ptr); +} + +static PortValue* +append_port_value(LilvState* state, + const char* port_symbol, + const void* value, + uint32_t size, + uint32_t type) +{ + PortValue* pv = NULL; + if (value) { + state->values = (PortValue*)realloc( + state->values, (++state->n_values) * sizeof(PortValue)); + + pv = &state->values[state->n_values - 1]; + pv->symbol = lilv_strdup(port_symbol); + pv->atom = (LV2_Atom*)malloc(sizeof(LV2_Atom) + size); + pv->atom->size = size; + pv->atom->type = type; + memcpy(pv->atom + 1, value, size); + } + return pv; +} + +static const char* +lilv_state_rel2abs(const LilvState* state, const char* path) +{ + ZixTreeIter* iter = NULL; + const PathMap key = {NULL, (char*)path}; + if (state->rel2abs && !zix_tree_find(state->rel2abs, &key, &iter)) { + return ((const PathMap*)zix_tree_get(iter))->abs; + } + return path; +} + +static void +append_property(LilvState* state, + PropertyArray* array, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags) +{ + array->props = + (Property*)realloc(array->props, (++array->n) * sizeof(Property)); + + Property* const prop = &array->props[array->n - 1]; + if ((flags & LV2_STATE_IS_POD) || type == state->atom_Path) { + prop->value = malloc(size); + memcpy(prop->value, value, size); + } else { + prop->value = (void*)value; + } + + prop->size = size; + prop->key = key; + prop->type = type; + prop->flags = flags; +} + +static const Property* +find_property(const LilvState* const state, const uint32_t key) +{ + if (!state->props.props) { + return NULL; + } + + const Property search_key = {NULL, 0, key, 0, 0}; + + return (const Property*)bsearch(&search_key, + state->props.props, + state->props.n, + sizeof(Property), + property_cmp); +} + +static LV2_State_Status +store_callback(LV2_State_Handle handle, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags) +{ + LilvState* const state = (LilvState*)handle; + + if (!key) { + return LV2_STATE_ERR_UNKNOWN; // TODO: Add status for bad arguments + } + + if (find_property((const LilvState*)handle, key)) { + return LV2_STATE_ERR_UNKNOWN; // TODO: Add status for duplicate keys + } + + append_property(state, &state->props, key, value, size, type, flags); + return LV2_STATE_SUCCESS; +} + +static const void* +retrieve_callback(LV2_State_Handle handle, + uint32_t key, + size_t* size, + uint32_t* type, + uint32_t* flags) +{ + const Property* const prop = find_property((const LilvState*)handle, key); + + if (prop) { + *size = prop->size; + *type = prop->type; + *flags = prop->flags; + return prop->value; + } + return NULL; +} + +static bool +path_exists(const char* path, const void* ignored) +{ + (void)ignored; + + return lilv_path_exists(path); +} + +static bool +lilv_state_has_path(const char* path, const void* state) +{ + return lilv_state_rel2abs((const LilvState*)state, path) != path; +} + +static char* +make_path(LV2_State_Make_Path_Handle handle, const char* path) +{ + LilvState* state = (LilvState*)handle; + lilv_create_directories(state->dir); + + return lilv_path_join(state->dir, path); +} + +static char* +abstract_path(LV2_State_Map_Path_Handle handle, const char* abs_path) +{ + LilvState* state = (LilvState*)handle; + char* path = NULL; + char* real_path = lilv_path_canonical(abs_path); + const PathMap key = {real_path, NULL}; + ZixTreeIter* iter = NULL; + + if (abs_path[0] == '\0') { + return lilv_strdup(abs_path); + } + + if (!zix_tree_find(state->abs2rel, &key, &iter)) { + // Already mapped path in a previous call + PathMap* pm = (PathMap*)zix_tree_get(iter); + free(real_path); + return lilv_strdup(pm->rel); + } + + if (lilv_path_is_child(real_path, state->dir)) { + // File in state directory (loaded, or created by plugin during save) + path = lilv_path_relative_to(real_path, state->dir); + } else if (lilv_path_is_child(real_path, state->scratch_dir)) { + // File created by plugin earlier + path = lilv_path_relative_to(real_path, state->scratch_dir); + if (state->copy_dir) { + int st = lilv_create_directories(state->copy_dir); + if (st) { + LILV_ERRORF( + "Error creating directory %s (%s)\n", state->copy_dir, strerror(st)); + } + + char* cpath = lilv_path_join(state->copy_dir, path); + char* copy = lilv_get_latest_copy(real_path, cpath); + if (!copy || !lilv_file_equals(real_path, copy)) { + // No recent enough copy, make a new one + free(copy); + copy = lilv_find_free_path(cpath, path_exists, NULL); + if ((st = lilv_copy_file(real_path, copy))) { + LILV_ERRORF("Error copying state file %s (%s)\n", copy, strerror(st)); + } + } + free(real_path); + free(cpath); + + // Refer to the latest copy in plugin state + real_path = copy; + } + } else if (state->link_dir) { + // New path outside state directory, make a link + char* const name = lilv_path_filename(real_path); + + // Find a free name in the (virtual) state directory + path = lilv_find_free_path(name, lilv_state_has_path, state); + + free(name); + } else { + // No link directory, preserve absolute path + path = lilv_strdup(abs_path); + } + + // Add record to path mapping + PathMap* pm = (PathMap*)malloc(sizeof(PathMap)); + pm->abs = real_path; + pm->rel = lilv_strdup(path); + zix_tree_insert(state->abs2rel, pm, NULL); + zix_tree_insert(state->rel2abs, pm, NULL); + + return path; +} + +static char* +absolute_path(LV2_State_Map_Path_Handle handle, const char* state_path) +{ + LilvState* state = (LilvState*)handle; + char* path = NULL; + if (lilv_path_is_absolute(state_path)) { + // Absolute path, return identical path + path = lilv_strdup(state_path); + } else if (state->dir) { + // Relative path inside state directory + path = lilv_path_join(state->dir, state_path); + } else { + // State has not been saved, unmap + path = lilv_strdup(lilv_state_rel2abs(state, state_path)); + } + + return path; +} + +/** Return a new features array with built-in features added to `features`. */ +static const LV2_Feature** +add_features(const LV2_Feature* const* features, + const LV2_Feature* map, + const LV2_Feature* make, + const LV2_Feature* free) +{ + size_t n_features = 0; + for (; features && features[n_features]; ++n_features) { + } + + const LV2_Feature** ret = + (const LV2_Feature**)calloc(n_features + 4, sizeof(LV2_Feature*)); + + if (features) { + memcpy(ret, features, n_features * sizeof(LV2_Feature*)); + } + + size_t i = n_features; + if (map) { + ret[i++] = map; + } + if (make) { + ret[i++] = make; + } + if (free) { + ret[i++] = free; + } + + return ret; +} + +/// Return the canonical path for a directory with a trailing separator +static char* +real_dir(const char* path) +{ + char* abs_path = lilv_path_canonical(path); + char* base = lilv_path_join(abs_path, NULL); + free(abs_path); + return base; +} + +static const char* +state_strerror(LV2_State_Status st) +{ + switch (st) { + case LV2_STATE_SUCCESS: + return "Completed successfully"; + case LV2_STATE_ERR_BAD_TYPE: + return "Unsupported type"; + case LV2_STATE_ERR_BAD_FLAGS: + return "Unsupported flags"; + case LV2_STATE_ERR_NO_FEATURE: + return "Missing features"; + case LV2_STATE_ERR_NO_PROPERTY: + return "Missing property"; + default: + return "Unknown error"; + } +} + +static void +lilv_free_path(LV2_State_Free_Path_Handle handle, char* path) +{ + (void)handle; + + lilv_free(path); +} + +LilvState* +lilv_state_new_from_instance(const LilvPlugin* plugin, + LilvInstance* instance, + LV2_URID_Map* map, + const char* scratch_dir, + const char* copy_dir, + const char* link_dir, + const char* save_dir, + LilvGetPortValueFunc get_value, + void* user_data, + uint32_t flags, + const LV2_Feature* const* features) +{ + const LV2_Feature** sfeatures = NULL; + LilvWorld* const world = plugin->world; + LilvState* const state = (LilvState*)calloc(1, sizeof(LilvState)); + state->plugin_uri = lilv_node_duplicate(lilv_plugin_get_uri(plugin)); + state->abs2rel = zix_tree_new(false, abs_cmp, NULL, path_rel_free); + state->rel2abs = zix_tree_new(false, rel_cmp, NULL, NULL); + state->scratch_dir = scratch_dir ? real_dir(scratch_dir) : NULL; + state->copy_dir = copy_dir ? real_dir(copy_dir) : NULL; + state->link_dir = link_dir ? real_dir(link_dir) : NULL; + state->dir = save_dir ? real_dir(save_dir) : NULL; + state->atom_Path = map->map(map->handle, LV2_ATOM__Path); + + LV2_State_Map_Path pmap = {state, abstract_path, absolute_path}; + LV2_Feature pmap_feature = {LV2_STATE__mapPath, &pmap}; + LV2_State_Make_Path pmake = {state, make_path}; + LV2_Feature pmake_feature = {LV2_STATE__makePath, &pmake}; + LV2_State_Free_Path pfree = {NULL, lilv_free_path}; + LV2_Feature pfree_feature = {LV2_STATE__freePath, &pfree}; + features = sfeatures = add_features( + features, &pmap_feature, save_dir ? &pmake_feature : NULL, &pfree_feature); + + // Store port values + if (get_value) { + LilvNode* lv2_ControlPort = lilv_new_uri(world, LILV_URI_CONTROL_PORT); + LilvNode* lv2_InputPort = lilv_new_uri(world, LILV_URI_INPUT_PORT); + for (uint32_t i = 0; i < plugin->num_ports; ++i) { + const LilvPort* const port = plugin->ports[i]; + if (lilv_port_is_a(plugin, port, lv2_ControlPort) && + lilv_port_is_a(plugin, port, lv2_InputPort)) { + uint32_t size = 0; + uint32_t type = 0; + const char* sym = lilv_node_as_string(port->symbol); + const void* value = get_value(sym, user_data, &size, &type); + append_port_value(state, sym, value, size, type); + } + } + lilv_node_free(lv2_ControlPort); + lilv_node_free(lv2_InputPort); + } + + // Store properties + const LV2_Descriptor* desc = instance->lv2_descriptor; + const LV2_State_Interface* iface = + (desc->extension_data) + ? (const LV2_State_Interface*)desc->extension_data(LV2_STATE__interface) + : NULL; + + if (iface) { + LV2_State_Status st = + iface->save(instance->lv2_handle, store_callback, state, flags, features); + if (st) { + LILV_ERRORF("Error saving plugin state: %s\n", state_strerror(st)); + free(state->props.props); + state->props.props = NULL; + state->props.n = 0; + } else { + qsort(state->props.props, state->props.n, sizeof(Property), property_cmp); + } + } + + if (state->values) { + qsort(state->values, state->n_values, sizeof(PortValue), value_cmp); + } + + free(sfeatures); + return state; +} + +void +lilv_state_emit_port_values(const LilvState* state, + LilvSetPortValueFunc set_value, + void* user_data) +{ + for (uint32_t i = 0; i < state->n_values; ++i) { + const PortValue* value = &state->values[i]; + const LV2_Atom* atom = value->atom; + set_value(value->symbol, user_data, atom + 1, atom->size, atom->type); + } +} + +void +lilv_state_restore(const LilvState* state, + LilvInstance* instance, + LilvSetPortValueFunc set_value, + void* user_data, + uint32_t flags, + const LV2_Feature* const* features) +{ + if (!state) { + LILV_ERROR("lilv_state_restore() called on NULL state\n"); + return; + } + + LV2_State_Map_Path map_path = { + (LilvState*)state, abstract_path, absolute_path}; + LV2_Feature map_feature = {LV2_STATE__mapPath, &map_path}; + + LV2_State_Free_Path free_path = {NULL, lilv_free_path}; + LV2_Feature free_feature = {LV2_STATE__freePath, &free_path}; + + if (instance) { + const LV2_Descriptor* desc = instance->lv2_descriptor; + if (desc->extension_data) { + const LV2_State_Interface* iface = + (const LV2_State_Interface*)desc->extension_data(LV2_STATE__interface); + + if (iface && iface->restore) { + const LV2_Feature** sfeatures = + add_features(features, &map_feature, NULL, &free_feature); + + iface->restore(instance->lv2_handle, + retrieve_callback, + (LV2_State_Handle)state, + flags, + sfeatures); + + free(sfeatures); + } + } + } + + if (set_value) { + lilv_state_emit_port_values(state, set_value, user_data); + } +} + +static void +set_state_dir_from_model(LilvState* state, const SordNode* graph) +{ + if (!state->dir && graph) { + const char* uri = (const char*)sord_node_get_string(graph); + char* path = lilv_file_uri_parse(uri, NULL); + + state->dir = lilv_path_join(path, NULL); + free(path); + } + assert(!state->dir || lilv_path_is_absolute(state->dir)); +} + +static LilvState* +new_state_from_model(LilvWorld* world, + LV2_URID_Map* map, + SordModel* model, + const SordNode* node, + const char* dir) +{ + // Check that we know at least something about this state subject + if (!sord_ask(model, node, 0, 0, 0)) { + return NULL; + } + + // Allocate state + LilvState* const state = (LilvState*)calloc(1, sizeof(LilvState)); + state->dir = lilv_path_join(dir, NULL); + state->atom_Path = map->map(map->handle, LV2_ATOM__Path); + state->uri = lilv_node_new_from_node(world, node); + + // Get the plugin URI this state applies to + SordIter* i = sord_search(model, node, world->uris.lv2_appliesTo, 0, 0); + if (i) { + const SordNode* object = sord_iter_get_node(i, SORD_OBJECT); + const SordNode* graph = sord_iter_get_node(i, SORD_GRAPH); + state->plugin_uri = lilv_node_new_from_node(world, object); + set_state_dir_from_model(state, graph); + sord_iter_free(i); + } else if (sord_ask( + model, node, world->uris.rdf_a, world->uris.lv2_Plugin, 0)) { + // Loading plugin description as state (default state) + state->plugin_uri = lilv_node_new_from_node(world, node); + } else { + LILV_ERRORF("State %s missing lv2:appliesTo property\n", + sord_node_get_string(node)); + } + + // Get the state label + i = sord_search(model, node, world->uris.rdfs_label, NULL, NULL); + if (i) { + const SordNode* object = sord_iter_get_node(i, SORD_OBJECT); + const SordNode* graph = sord_iter_get_node(i, SORD_GRAPH); + state->label = lilv_strdup((const char*)sord_node_get_string(object)); + set_state_dir_from_model(state, graph); + sord_iter_free(i); + } + + Sratom* sratom = sratom_new(map); + SerdChunk chunk = {NULL, 0}; + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, map); + lv2_atom_forge_set_sink( + &forge, sratom_forge_sink, sratom_forge_deref, &chunk); + + // Get port values + SordIter* ports = sord_search(model, node, world->uris.lv2_port, 0, 0); + FOREACH_MATCH (ports) { + const SordNode* port = sord_iter_get_node(ports, SORD_OBJECT); + + SordNode* label = sord_get(model, port, world->uris.rdfs_label, 0, 0); + SordNode* symbol = sord_get(model, port, world->uris.lv2_symbol, 0, 0); + SordNode* value = sord_get(model, port, world->uris.pset_value, 0, 0); + if (!value) { + value = sord_get(model, port, world->uris.lv2_default, 0, 0); + } + if (!symbol) { + LILV_ERRORF("State `%s' port missing symbol.\n", + sord_node_get_string(node)); + } else if (value) { + chunk.len = 0; + sratom_read(sratom, &forge, world->world, model, value); + const LV2_Atom* atom = (const LV2_Atom*)chunk.buf; + + append_port_value(state, + (const char*)sord_node_get_string(symbol), + LV2_ATOM_BODY_CONST(atom), + atom->size, + atom->type); + + if (label) { + lilv_state_set_label(state, (const char*)sord_node_get_string(label)); + } + } + sord_node_free(world->world, value); + sord_node_free(world->world, symbol); + sord_node_free(world->world, label); + } + sord_iter_free(ports); + + // Get properties + SordNode* statep = sord_new_uri(world->world, USTR(LV2_STATE__state)); + SordNode* state_node = sord_get(model, node, statep, NULL, NULL); + if (state_node) { + SordIter* props = sord_search(model, state_node, 0, 0, 0); + FOREACH_MATCH (props) { + const SordNode* p = sord_iter_get_node(props, SORD_PREDICATE); + const SordNode* o = sord_iter_get_node(props, SORD_OBJECT); + const char* key = (const char*)sord_node_get_string(p); + + chunk.len = 0; + lv2_atom_forge_set_sink( + &forge, sratom_forge_sink, sratom_forge_deref, &chunk); + + sratom_read(sratom, &forge, world->world, model, o); + const LV2_Atom* atom = (const LV2_Atom*)chunk.buf; + uint32_t flags = LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE; + Property prop = {NULL, 0, 0, 0, flags}; + + prop.key = map->map(map->handle, key); + prop.type = atom->type; + prop.size = atom->size; + prop.value = malloc(atom->size); + memcpy(prop.value, LV2_ATOM_BODY_CONST(atom), atom->size); + if (atom->type == forge.Path) { + prop.flags = LV2_STATE_IS_POD; + } + + if (prop.value) { + state->props.props = (Property*)realloc( + state->props.props, (++state->props.n) * sizeof(Property)); + state->props.props[state->props.n - 1] = prop; + } + } + sord_iter_free(props); + } + sord_node_free(world->world, state_node); + sord_node_free(world->world, statep); + + serd_free((void*)chunk.buf); + sratom_free(sratom); + + if (state->props.props) { + qsort(state->props.props, state->props.n, sizeof(Property), property_cmp); + } + if (state->values) { + qsort(state->values, state->n_values, sizeof(PortValue), value_cmp); + } + + return state; +} + +LilvState* +lilv_state_new_from_world(LilvWorld* world, + LV2_URID_Map* map, + const LilvNode* node) +{ + if (!lilv_node_is_uri(node) && !lilv_node_is_blank(node)) { + LILV_ERRORF("Subject `%s' is not a URI or blank node.\n", + lilv_node_as_string(node)); + return NULL; + } + + return new_state_from_model(world, map, world->model, node->node, NULL); +} + +LilvState* +lilv_state_new_from_file(LilvWorld* world, + LV2_URID_Map* map, + const LilvNode* subject, + const char* path) +{ + if (subject && !lilv_node_is_uri(subject) && !lilv_node_is_blank(subject)) { + LILV_ERRORF("Subject `%s' is not a URI or blank node.\n", + lilv_node_as_string(subject)); + return NULL; + } + + uint8_t* abs_path = (uint8_t*)lilv_path_absolute(path); + SerdNode node = serd_node_new_file_uri(abs_path, NULL, NULL, true); + SerdEnv* env = serd_env_new(&node); + SordModel* model = sord_new(world->world, SORD_SPO, false); + SerdReader* reader = sord_new_reader(model, env, SERD_TURTLE, NULL); + + serd_reader_read_file(reader, node.buf); + + SordNode* subject_node = + (subject) ? subject->node + : sord_node_from_serd_node(world->world, env, &node, NULL, NULL); + + char* dirname = lilv_path_parent(path); + char* real_path = lilv_path_canonical(dirname); + char* dir_path = lilv_path_join(real_path, NULL); + LilvState* state = + new_state_from_model(world, map, model, subject_node, dir_path); + free(dir_path); + free(real_path); + free(dirname); + + serd_node_free(&node); + free(abs_path); + serd_reader_free(reader); + sord_free(model); + serd_env_free(env); + return state; +} + +static void +set_prefixes(SerdEnv* env) +{ +#define SET_PSET(e, p, u) serd_env_set_prefix_from_strings(e, p, u) + SET_PSET(env, USTR("atom"), USTR(LV2_ATOM_PREFIX)); + SET_PSET(env, USTR("lv2"), USTR(LV2_CORE_PREFIX)); + SET_PSET(env, USTR("pset"), USTR(LV2_PRESETS_PREFIX)); + SET_PSET(env, USTR("rdf"), USTR(LILV_NS_RDF)); + SET_PSET(env, USTR("rdfs"), USTR(LILV_NS_RDFS)); + SET_PSET(env, USTR("state"), USTR(LV2_STATE_PREFIX)); + SET_PSET(env, USTR("xsd"), USTR(LILV_NS_XSD)); +} + +LilvState* +lilv_state_new_from_string(LilvWorld* world, LV2_URID_Map* map, const char* str) +{ + if (!str) { + return NULL; + } + + SerdNode base = SERD_NODE_NULL; + SerdEnv* env = serd_env_new(&base); + SordModel* model = sord_new(world->world, SORD_SPO | SORD_OPS, false); + SerdReader* reader = sord_new_reader(model, env, SERD_TURTLE, NULL); + + set_prefixes(env); + serd_reader_read_string(reader, USTR(str)); + + SordNode* o = sord_new_uri(world->world, USTR(LV2_PRESETS__Preset)); + SordNode* s = sord_get(model, NULL, world->uris.rdf_a, o, NULL); + + LilvState* state = new_state_from_model(world, map, model, s, NULL); + + sord_node_free(world->world, s); + sord_node_free(world->world, o); + serd_reader_free(reader); + sord_free(model); + serd_env_free(env); + + return state; +} + +static SerdWriter* +ttl_writer(SerdSink sink, void* stream, const SerdNode* base, SerdEnv** new_env) +{ + SerdURI base_uri = SERD_URI_NULL; + if (base && base->buf) { + serd_uri_parse(base->buf, &base_uri); + } + + SerdEnv* env = *new_env ? *new_env : serd_env_new(base); + set_prefixes(env); + + SerdWriter* writer = + serd_writer_new(SERD_TURTLE, + (SerdStyle)(SERD_STYLE_RESOLVED | SERD_STYLE_ABBREVIATED | + SERD_STYLE_CURIED), + env, + &base_uri, + sink, + stream); + + if (!*new_env) { + *new_env = env; + } + + return writer; +} + +static SerdWriter* +ttl_file_writer(FILE* fd, const SerdNode* node, SerdEnv** env) +{ + SerdWriter* writer = ttl_writer(serd_file_sink, fd, node, env); + + fseek(fd, 0, SEEK_END); + if (ftell(fd) == 0) { + serd_env_foreach(*env, (SerdPrefixSink)serd_writer_set_prefix, writer); + } else { + fprintf(fd, "\n"); + } + + return writer; +} + +static void +add_to_model(SordWorld* world, + SerdEnv* env, + SordModel* model, + const SerdNode s, + const SerdNode p, + const SerdNode o) +{ + SordNode* ss = sord_node_from_serd_node(world, env, &s, NULL, NULL); + SordNode* sp = sord_node_from_serd_node(world, env, &p, NULL, NULL); + SordNode* so = sord_node_from_serd_node(world, env, &o, NULL, NULL); + + SordQuad quad = {ss, sp, so, NULL}; + sord_add(model, quad); + + sord_node_free(world, ss); + sord_node_free(world, sp); + sord_node_free(world, so); +} + +static void +remove_manifest_entry(SordWorld* world, SordModel* model, const char* subject) +{ + SordNode* s = sord_new_uri(world, USTR(subject)); + SordIter* i = sord_search(model, s, NULL, NULL, NULL); + while (!sord_iter_end(i)) { + sord_erase(model, i); + } + sord_iter_free(i); + sord_node_free(world, s); +} + +static int +write_manifest(LilvWorld* world, + SerdEnv* env, + SordModel* model, + const SerdNode* file_uri) +{ + (void)world; + + char* const path = (char*)serd_file_uri_parse(file_uri->buf, NULL); + FILE* const wfd = fopen(path, "w"); + if (!wfd) { + LILV_ERRORF("Failed to open %s for writing (%s)\n", path, strerror(errno)); + + serd_free(path); + return 1; + } + + SerdWriter* writer = ttl_file_writer(wfd, file_uri, &env); + sord_write(model, writer, NULL); + serd_writer_free(writer); + fclose(wfd); + serd_free(path); + return 0; +} + +static int +add_state_to_manifest(LilvWorld* lworld, + const LilvNode* plugin_uri, + const char* manifest_path, + const char* state_uri, + const char* state_path) +{ + SordWorld* world = lworld->world; + SerdNode manifest = serd_node_new_file_uri(USTR(manifest_path), 0, 0, 1); + SerdNode file = serd_node_new_file_uri(USTR(state_path), 0, 0, 1); + SerdEnv* env = serd_env_new(&manifest); + SordModel* model = sord_new(world, SORD_SPO, false); + + if (lilv_path_exists(manifest_path)) { + // Read manifest into model + SerdReader* reader = sord_new_reader(model, env, SERD_TURTLE, NULL); + SerdStatus st = serd_reader_read_file(reader, manifest.buf); + if (st) { + LILV_WARNF("Failed to read manifest (%s)\n", serd_strerror(st)); + } + serd_reader_free(reader); + } + + // Choose state URI (use file URI if not given) + if (!state_uri) { + state_uri = (const char*)file.buf; + } + + // Remove any existing manifest entries for this state + remove_manifest_entry(world, model, state_uri); + + // Add manifest entry for this state to model + SerdNode s = serd_node_from_string(SERD_URI, USTR(state_uri)); + + // a pset:Preset + add_to_model(world, + env, + model, + s, + serd_node_from_string(SERD_URI, USTR(LILV_NS_RDF "type")), + serd_node_from_string(SERD_URI, USTR(LV2_PRESETS__Preset))); + + // a pset:Preset + add_to_model(world, + env, + model, + s, + serd_node_from_string(SERD_URI, USTR(LILV_NS_RDF "type")), + serd_node_from_string(SERD_URI, USTR(LV2_PRESETS__Preset))); + + // rdfs:seeAlso + add_to_model(world, + env, + model, + s, + serd_node_from_string(SERD_URI, USTR(LILV_NS_RDFS "seeAlso")), + file); + + // lv2:appliesTo + add_to_model( + world, + env, + model, + s, + serd_node_from_string(SERD_URI, USTR(LV2_CORE__appliesTo)), + serd_node_from_string(SERD_URI, USTR(lilv_node_as_string(plugin_uri)))); + + /* Re-open manifest for locked writing. We need to do this because it may + need to be truncated, and the file can only be open once on Windows. */ + + FILE* wfd = fopen(manifest_path, "wb"); + int r = 0; + if (!wfd) { + LILV_ERRORF( + "Failed to open %s for writing (%s)\n", manifest_path, strerror(errno)); + r = 1; + } + + SerdWriter* writer = ttl_file_writer(wfd, &manifest, &env); + lilv_flock(wfd, true, true); + sord_write(model, writer, NULL); + lilv_flock(wfd, false, true); + serd_writer_free(writer); + fclose(wfd); + + sord_free(model); + serd_node_free(&file); + serd_node_free(&manifest); + serd_env_free(env); + + return r; +} + +static bool +link_exists(const char* path, const void* data) +{ + const char* target = (const char*)data; + if (!lilv_path_exists(path)) { + return false; + } + char* real_path = lilv_path_canonical(path); + bool matches = !strcmp(real_path, target); + free(real_path); + return !matches; +} + +static int +maybe_symlink(const char* oldpath, const char* newpath) +{ + if (link_exists(newpath, oldpath)) { + return 0; + } + + const int st = lilv_symlink(oldpath, newpath); + if (st) { + LILV_ERRORF( + "Failed to link %s => %s (%s)\n", newpath, oldpath, strerror(errno)); + } + + return st; +} + +static void +write_property_array(const LilvState* state, + const PropertyArray* array, + Sratom* sratom, + uint32_t flags, + const SerdNode* subject, + LV2_URID_Unmap* unmap, + const char* dir) +{ + for (uint32_t i = 0; i < array->n; ++i) { + Property* prop = &array->props[i]; + const char* key = unmap->unmap(unmap->handle, prop->key); + + const SerdNode p = serd_node_from_string(SERD_URI, USTR(key)); + if (prop->type == state->atom_Path && !dir) { + const char* path = (const char*)prop->value; + const char* abs_path = lilv_state_rel2abs(state, path); + LILV_WARNF("Writing absolute path %s\n", abs_path); + sratom_write(sratom, + unmap, + flags, + subject, + &p, + prop->type, + strlen(abs_path) + 1, + abs_path); + } else if (prop->flags & LV2_STATE_IS_POD || + prop->type == state->atom_Path) { + sratom_write( + sratom, unmap, flags, subject, &p, prop->type, prop->size, prop->value); + } else { + LILV_WARNF("Lost non-POD property <%s> on save\n", key); + } + } +} + +static int +lilv_state_write(LilvWorld* world, + LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + const LilvState* state, + SerdWriter* writer, + const char* uri, + const char* dir) +{ + (void)world; + + SerdNode lv2_appliesTo = + serd_node_from_string(SERD_CURIE, USTR("lv2:appliesTo")); + + const SerdNode* plugin_uri = sord_node_to_serd_node(state->plugin_uri->node); + + SerdNode subject = serd_node_from_string(SERD_URI, USTR(uri ? uri : "")); + + // a pset:Preset + SerdNode p = serd_node_from_string(SERD_URI, USTR(LILV_NS_RDF "type")); + + SerdNode o = serd_node_from_string(SERD_URI, USTR(LV2_PRESETS__Preset)); + serd_writer_write_statement(writer, 0, NULL, &subject, &p, &o, NULL, NULL); + + // lv2:appliesTo + serd_writer_write_statement( + writer, 0, NULL, &subject, &lv2_appliesTo, plugin_uri, NULL, NULL); + + // rdfs:label label + if (state->label) { + p = serd_node_from_string(SERD_URI, USTR(LILV_NS_RDFS "label")); + o = serd_node_from_string(SERD_LITERAL, USTR(state->label)); + serd_writer_write_statement(writer, 0, NULL, &subject, &p, &o, NULL, NULL); + } + + SerdEnv* env = serd_writer_get_env(writer); + const SerdNode* base = serd_env_get_base_uri(env, NULL); + + Sratom* sratom = sratom_new(map); + sratom_set_sink(sratom, + (const char*)base->buf, + (SerdStatementSink)serd_writer_write_statement, + (SerdEndSink)serd_writer_end_anon, + writer); + + // Write metadata + sratom_set_pretty_numbers(sratom, false); // Use precise types + write_property_array( + state, &state->metadata, sratom, 0, &subject, unmap, dir); + + // Write port values + sratom_set_pretty_numbers(sratom, true); // Use pretty numbers + for (uint32_t i = 0; i < state->n_values; ++i) { + PortValue* const value = &state->values[i]; + + const SerdNode port = + serd_node_from_string(SERD_BLANK, USTR(value->symbol)); + + // <> lv2:port _:symbol + p = serd_node_from_string(SERD_URI, USTR(LV2_CORE__port)); + serd_writer_write_statement( + writer, SERD_ANON_O_BEGIN, NULL, &subject, &p, &port, NULL, NULL); + + // _:symbol lv2:symbol "symbol" + p = serd_node_from_string(SERD_URI, USTR(LV2_CORE__symbol)); + o = serd_node_from_string(SERD_LITERAL, USTR(value->symbol)); + serd_writer_write_statement( + writer, SERD_ANON_CONT, NULL, &port, &p, &o, NULL, NULL); + + // _:symbol pset:value value + p = serd_node_from_string(SERD_URI, USTR(LV2_PRESETS__value)); + sratom_write(sratom, + unmap, + SERD_ANON_CONT, + &port, + &p, + value->atom->type, + value->atom->size, + value->atom + 1); + + serd_writer_end_anon(writer, &port); + } + + // Write properties + const SerdNode body = serd_node_from_string(SERD_BLANK, USTR("body")); + if (state->props.n > 0) { + p = serd_node_from_string(SERD_URI, USTR(LV2_STATE__state)); + serd_writer_write_statement( + writer, SERD_ANON_O_BEGIN, NULL, &subject, &p, &body, NULL, NULL); + } + sratom_set_pretty_numbers(sratom, false); // Use precise types + write_property_array( + state, &state->props, sratom, SERD_ANON_CONT, &body, unmap, dir); + + if (state->props.n > 0) { + serd_writer_end_anon(writer, &body); + } + + sratom_free(sratom); + return 0; +} + +static void +lilv_state_make_links(const LilvState* state, const char* dir) +{ + // Create symlinks to files + for (ZixTreeIter* i = zix_tree_begin(state->abs2rel); + i != zix_tree_end(state->abs2rel); + i = zix_tree_iter_next(i)) { + const PathMap* pm = (const PathMap*)zix_tree_get(i); + + char* path = lilv_path_absolute_child(pm->rel, dir); + if (lilv_path_is_child(pm->abs, state->copy_dir) && + strcmp(state->copy_dir, dir)) { + // Link directly to snapshot in the copy directory + maybe_symlink(pm->abs, path); + } else if (!lilv_path_is_child(pm->abs, dir)) { + const char* link_dir = state->link_dir ? state->link_dir : dir; + char* pat = lilv_path_absolute_child(pm->rel, link_dir); + if (!strcmp(dir, link_dir)) { + // Link directory is save directory, make link at exact path + remove(pat); + maybe_symlink(pm->abs, pat); + } else { + // Make a link in the link directory to external file + char* lpath = lilv_find_free_path(pat, link_exists, pm->abs); + if (!lilv_path_exists(lpath)) { + if (lilv_symlink(pm->abs, lpath)) { + LILV_ERRORF("Failed to link %s => %s (%s)\n", + pm->abs, + lpath, + strerror(errno)); + } + } + + // Make a link in the save directory to the external link + char* target = lilv_path_relative_to(lpath, dir); + maybe_symlink(lpath, path); + free(target); + free(lpath); + } + free(pat); + } + free(path); + } +} + +int +lilv_state_save(LilvWorld* world, + LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + const LilvState* state, + const char* uri, + const char* dir, + const char* filename) +{ + if (!filename || !dir || lilv_create_directories(dir)) { + return 1; + } + + char* abs_dir = real_dir(dir); + char* const path = lilv_path_join(abs_dir, filename); + FILE* fd = fopen(path, "w"); + if (!fd) { + LILV_ERRORF("Failed to open %s (%s)\n", path, strerror(errno)); + free(abs_dir); + free(path); + return 4; + } + + // Create symlinks to files if necessary + lilv_state_make_links(state, abs_dir); + + // Write state to Turtle file + SerdNode file = serd_node_new_file_uri(USTR(path), NULL, NULL, true); + SerdNode node = uri ? serd_node_from_string(SERD_URI, USTR(uri)) : file; + SerdEnv* env = NULL; + SerdWriter* ttl = ttl_file_writer(fd, &file, &env); + int ret = + lilv_state_write(world, map, unmap, state, ttl, (const char*)node.buf, dir); + + // Set saved dir and uri (FIXME: const violation) + free(state->dir); + lilv_node_free(state->uri); + ((LilvState*)state)->dir = lilv_strdup(abs_dir); + ((LilvState*)state)->uri = lilv_new_uri(world, (const char*)node.buf); + + serd_node_free(&file); + serd_writer_free(ttl); + serd_env_free(env); + fclose(fd); + + // Add entry to manifest + if (!ret) { + char* const manifest = lilv_path_join(abs_dir, "manifest.ttl"); + + ret = add_state_to_manifest(world, state->plugin_uri, manifest, uri, path); + + free(manifest); + } + + free(abs_dir); + free(path); + return ret; +} + +char* +lilv_state_to_string(LilvWorld* world, + LV2_URID_Map* map, + LV2_URID_Unmap* unmap, + const LilvState* state, + const char* uri, + const char* base_uri) +{ + if (!uri) { + LILV_ERROR("Attempt to serialise state with no URI\n"); + return NULL; + } + + SerdChunk chunk = {NULL, 0}; + SerdEnv* env = NULL; + SerdNode base = serd_node_from_string(SERD_URI, USTR(base_uri)); + SerdWriter* writer = ttl_writer(serd_chunk_sink, &chunk, &base, &env); + + lilv_state_write(world, map, unmap, state, writer, uri, NULL); + + serd_writer_free(writer); + serd_env_free(env); + char* str = (char*)serd_chunk_sink_finish(&chunk); + char* result = lilv_strdup(str); + serd_free(str); + return result; +} + +static void +try_unlink(const char* state_dir, const char* path) +{ + if (!strncmp(state_dir, path, strlen(state_dir))) { + if (lilv_path_exists(path) && lilv_remove(path)) { + LILV_ERRORF("Failed to remove %s (%s)\n", path, strerror(errno)); + } + } +} + +static char* +get_canonical_path(const LilvNode* const node) +{ + char* const path = lilv_node_get_path(node, NULL); + char* const real_path = lilv_path_canonical(path); + + free(path); + return real_path; +} + +int +lilv_state_delete(LilvWorld* world, const LilvState* state) +{ + if (!state->dir) { + LILV_ERROR("Attempt to delete unsaved state\n"); + return -1; + } + + LilvNode* bundle = lilv_new_file_uri(world, NULL, state->dir); + LilvNode* manifest = lilv_world_get_manifest_uri(world, bundle); + char* manifest_path = get_canonical_path(manifest); + const bool has_manifest = lilv_path_exists(manifest_path); + SordModel* model = sord_new(world->world, SORD_SPO, false); + + if (has_manifest) { + // Read manifest into temporary local model + SerdEnv* env = serd_env_new(sord_node_to_serd_node(manifest->node)); + SerdReader* ttl = sord_new_reader(model, env, SERD_TURTLE, NULL); + serd_reader_read_file(ttl, USTR(manifest_path)); + serd_reader_free(ttl); + serd_env_free(env); + } + + if (state->uri) { + SordNode* file = + sord_get(model, state->uri->node, world->uris.rdfs_seeAlso, NULL, NULL); + if (file) { + // Remove state file + const uint8_t* uri = sord_node_get_string(file); + char* path = (char*)serd_file_uri_parse(uri, NULL); + char* real_path = lilv_path_canonical(path); + if (path) { + try_unlink(state->dir, real_path); + } + serd_free(real_path); + serd_free(path); + } + + // Remove any existing manifest entries for this state + const char* state_uri_str = lilv_node_as_string(state->uri); + remove_manifest_entry(world->world, model, state_uri_str); + remove_manifest_entry(world->world, world->model, state_uri_str); + } + + // Drop bundle from model + lilv_world_unload_bundle(world, bundle); + + if (sord_num_quads(model) == 0) { + // Manifest is empty, attempt to remove bundle entirely + if (has_manifest) { + try_unlink(state->dir, manifest_path); + } + + // Remove all known files from state bundle + if (state->abs2rel) { + // State created from instance, get paths from map + for (ZixTreeIter* i = zix_tree_begin(state->abs2rel); + i != zix_tree_end(state->abs2rel); + i = zix_tree_iter_next(i)) { + const PathMap* pm = (const PathMap*)zix_tree_get(i); + char* path = lilv_path_join(state->dir, pm->rel); + try_unlink(state->dir, path); + free(path); + } + } else { + // State loaded from model, get paths from loaded properties + for (uint32_t i = 0; i < state->props.n; ++i) { + const Property* const p = &state->props.props[i]; + if (p->type == state->atom_Path) { + try_unlink(state->dir, (const char*)p->value); + } + } + } + + if (lilv_remove(state->dir)) { + LILV_ERRORF( + "Failed to remove directory %s (%s)\n", state->dir, strerror(errno)); + } + } else { + // Still something in the manifest, update and reload bundle + const SerdNode* manifest_node = sord_node_to_serd_node(manifest->node); + SerdEnv* env = serd_env_new(manifest_node); + + write_manifest(world, env, model, manifest_node); + lilv_world_load_bundle(world, bundle); + serd_env_free(env); + } + + sord_free(model); + lilv_free(manifest_path); + lilv_node_free(manifest); + lilv_node_free(bundle); + + return 0; +} + +static void +free_property_array(LilvState* state, PropertyArray* array) +{ + for (uint32_t i = 0; i < array->n; ++i) { + Property* prop = &array->props[i]; + if ((prop->flags & LV2_STATE_IS_POD) || prop->type == state->atom_Path) { + free(prop->value); + } + } + free(array->props); +} + +void +lilv_state_free(LilvState* state) +{ + if (state) { + free_property_array(state, &state->props); + free_property_array(state, &state->metadata); + for (uint32_t i = 0; i < state->n_values; ++i) { + free(state->values[i].atom); + free(state->values[i].symbol); + } + lilv_node_free(state->plugin_uri); + lilv_node_free(state->uri); + zix_tree_free(state->abs2rel); + zix_tree_free(state->rel2abs); + free(state->values); + free(state->label); + free(state->dir); + free(state->scratch_dir); + free(state->copy_dir); + free(state->link_dir); + free(state); + } +} + +bool +lilv_state_equals(const LilvState* a, const LilvState* b) +{ + if (!lilv_node_equals(a->plugin_uri, b->plugin_uri) || + (a->label && !b->label) || (b->label && !a->label) || + (a->label && b->label && strcmp(a->label, b->label)) || + a->props.n != b->props.n || a->n_values != b->n_values) { + return false; + } + + for (uint32_t i = 0; i < a->n_values; ++i) { + PortValue* const av = &a->values[i]; + PortValue* const bv = &b->values[i]; + if (av->atom->size != bv->atom->size || av->atom->type != bv->atom->type || + strcmp(av->symbol, bv->symbol) || + memcmp(av->atom + 1, bv->atom + 1, av->atom->size)) { + return false; + } + } + + for (uint32_t i = 0; i < a->props.n; ++i) { + Property* const ap = &a->props.props[i]; + Property* const bp = &b->props.props[i]; + if (ap->key != bp->key || ap->type != bp->type || ap->flags != bp->flags) { + return false; + } + + if (ap->type == a->atom_Path) { + if (!lilv_file_equals(lilv_state_rel2abs(a, (char*)ap->value), + lilv_state_rel2abs(b, (char*)bp->value))) { + return false; + } + } else if (ap->size != bp->size || memcmp(ap->value, bp->value, ap->size)) { + return false; + } + } + + return true; +} + +unsigned +lilv_state_get_num_properties(const LilvState* state) +{ + return state->props.n; +} + +const LilvNode* +lilv_state_get_plugin_uri(const LilvState* state) +{ + return state->plugin_uri; +} + +const LilvNode* +lilv_state_get_uri(const LilvState* state) +{ + return state->uri; +} + +const char* +lilv_state_get_label(const LilvState* state) +{ + return state->label; +} + +void +lilv_state_set_label(LilvState* state, const char* label) +{ + const size_t len = strlen(label); + state->label = (char*)realloc(state->label, len + 1); + memcpy(state->label, label, len + 1); +} + +int +lilv_state_set_metadata(LilvState* state, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags) +{ + append_property(state, &state->metadata, key, value, size, type, flags); + return LV2_STATE_SUCCESS; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c new file mode 100644 index 00000000..84f8cef0 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/ui.c @@ -0,0 +1,115 @@ +/* + Copyright 2007-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "zix/tree.h" + +#include +#include +#include +#include + +LilvUI* +lilv_ui_new(LilvWorld* world, + LilvNode* uri, + LilvNode* type_uri, + LilvNode* binary_uri) +{ + assert(uri); + assert(type_uri); + assert(binary_uri); + + LilvUI* ui = (LilvUI*)malloc(sizeof(LilvUI)); + ui->world = world; + ui->uri = uri; + ui->binary_uri = binary_uri; + + // FIXME: kludge + char* bundle = lilv_strdup(lilv_node_as_string(ui->binary_uri)); + char* last_slash = strrchr(bundle, '/') + 1; + *last_slash = '\0'; + ui->bundle_uri = lilv_new_uri(world, bundle); + free(bundle); + + ui->classes = lilv_nodes_new(); + zix_tree_insert((ZixTree*)ui->classes, type_uri, NULL); + + return ui; +} + +void +lilv_ui_free(LilvUI* ui) +{ + lilv_node_free(ui->uri); + lilv_node_free(ui->bundle_uri); + lilv_node_free(ui->binary_uri); + lilv_nodes_free(ui->classes); + free(ui); +} + +const LilvNode* +lilv_ui_get_uri(const LilvUI* ui) +{ + return ui->uri; +} + +unsigned +lilv_ui_is_supported(const LilvUI* ui, + LilvUISupportedFunc supported_func, + const LilvNode* container_type, + const LilvNode** ui_type) +{ + const LilvNodes* classes = lilv_ui_get_classes(ui); + LILV_FOREACH (nodes, c, classes) { + const LilvNode* type = lilv_nodes_get(classes, c); + const unsigned q = + supported_func(lilv_node_as_uri(container_type), lilv_node_as_uri(type)); + if (q) { + if (ui_type) { + *ui_type = type; + } + return q; + } + } + + return 0; +} + +const LilvNodes* +lilv_ui_get_classes(const LilvUI* ui) +{ + return ui->classes; +} + +bool +lilv_ui_is_a(const LilvUI* ui, const LilvNode* class_uri) +{ + return lilv_nodes_contains(ui->classes, class_uri); +} + +const LilvNode* +lilv_ui_get_bundle_uri(const LilvUI* ui) +{ + return ui->bundle_uri; +} + +const LilvNode* +lilv_ui_get_binary_uri(const LilvUI* ui) +{ + return ui->binary_uri; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c new file mode 100644 index 00000000..92f72b9e --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/util.c @@ -0,0 +1,291 @@ +/* + Copyright 2007-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "filesystem.h" +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "serd/serd.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void +lilv_free(void* ptr) +{ + free(ptr); +} + +char* +lilv_strjoin(const char* first, ...) +{ + size_t len = strlen(first); + char* result = (char*)malloc(len + 1); + + memcpy(result, first, len); + + va_list args; + va_start(args, first); + while (1) { + const char* const s = va_arg(args, const char*); + if (s == NULL) { + break; + } + + const size_t this_len = strlen(s); + char* new_result = (char*)realloc(result, len + this_len + 1); + if (!new_result) { + va_end(args); + free(result); + return NULL; + } + + result = new_result; + memcpy(result + len, s, this_len); + len += this_len; + } + va_end(args); + + result[len] = '\0'; + + return result; +} + +char* +lilv_strdup(const char* str) +{ + if (!str) { + return NULL; + } + + const size_t len = strlen(str); + char* copy = (char*)malloc(len + 1); + memcpy(copy, str, len + 1); + return copy; +} + +const char* +lilv_uri_to_path(const char* uri) +{ +#if defined(__GNUC__) && __GNUC__ > 4 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + + return (const char*)serd_uri_to_path((const uint8_t*)uri); + +#if defined(__GNUC__) && __GNUC__ > 4 +# pragma GCC diagnostic pop +#endif +} + +char* +lilv_file_uri_parse(const char* uri, char** hostname) +{ + return (char*)serd_file_uri_parse((const uint8_t*)uri, (uint8_t**)hostname); +} + +/** Return the current LANG converted to Turtle (i.e. RFC3066) style. + * For example, if LANG is set to "en_CA.utf-8", this returns "en-ca". + */ +char* +lilv_get_lang(void) +{ + const char* const env_lang = getenv("LANG"); + if (!env_lang || !strcmp(env_lang, "") || !strcmp(env_lang, "C") || + !strcmp(env_lang, "POSIX")) { + return NULL; + } + + const size_t env_lang_len = strlen(env_lang); + char* const lang = (char*)malloc(env_lang_len + 1); + for (size_t i = 0; i < env_lang_len + 1; ++i) { + if (env_lang[i] == '_') { + lang[i] = '-'; // Convert _ to - + } else if (env_lang[i] >= 'A' && env_lang[i] <= 'Z') { + lang[i] = env_lang[i] + ('a' - 'A'); // Convert to lowercase + } else if (env_lang[i] >= 'a' && env_lang[i] <= 'z') { + lang[i] = env_lang[i]; // Lowercase letter, copy verbatim + } else if (env_lang[i] >= '0' && env_lang[i] <= '9') { + lang[i] = env_lang[i]; // Digit, copy verbatim + } else if (env_lang[i] == '\0' || env_lang[i] == '.') { + // End, or start of suffix (e.g. en_CA.utf-8), finished + lang[i] = '\0'; + break; + } else { + LILV_ERRORF("Illegal LANG `%s' ignored\n", env_lang); + free(lang); + return NULL; + } + } + + return lang; +} + +#ifndef _WIN32 + +/** Append suffix to dst, update dst_len, and return the realloc'd result. */ +static char* +strappend(char* dst, size_t* dst_len, const char* suffix, size_t suffix_len) +{ + dst = (char*)realloc(dst, *dst_len + suffix_len + 1); + memcpy(dst + *dst_len, suffix, suffix_len); + dst[(*dst_len += suffix_len)] = '\0'; + return dst; +} + +/** Append the value of the environment variable var to dst. */ +static char* +append_var(char* dst, size_t* dst_len, const char* var) +{ + // Get value from environment + const char* val = getenv(var); + if (val) { // Value found, append it + return strappend(dst, dst_len, val, strlen(val)); + } + + // No value found, append variable reference as-is + return strappend(strappend(dst, dst_len, "$", 1), dst_len, var, strlen(var)); +} + +#endif + +/** Expand variables (e.g. POSIX ~ or $FOO, Windows %FOO%) in `path`. */ +char* +lilv_expand(const char* path) +{ +#ifdef _WIN32 + char* out = (char*)malloc(MAX_PATH); + ExpandEnvironmentStrings(path, out, MAX_PATH); +#else + char* out = NULL; + size_t len = 0; + + const char* start = path; // Start of current chunk to copy + for (const char* s = path; *s;) { + if (*s == '$') { + // Hit $ (variable reference, e.g. $VAR_NAME) + for (const char* t = s + 1;; ++t) { + if (!*t || (!isupper(*t) && !isdigit(*t) && *t != '_')) { + // Append preceding chunk + out = strappend(out, &len, start, s - start); + + // Append variable value (or $VAR_NAME if not found) + char* var = (char*)calloc(t - s, 1); + memcpy(var, s + 1, t - s - 1); + out = append_var(out, &len, var); + free(var); + + // Continue after variable reference + start = s = t; + break; + } + } + } else if (*s == '~' && (*(s + 1) == '/' || !*(s + 1))) { + // Hit ~ before slash or end of string (home directory reference) + out = strappend(out, &len, start, s - start); + out = append_var(out, &len, "HOME"); + start = ++s; + } else { + ++s; + } + } + + if (*start) { + out = strappend(out, &len, start, strlen(start)); + } +#endif + + return out; +} + +char* +lilv_find_free_path(const char* in_path, + bool (*exists)(const char*, const void*), + const void* user_data) +{ + const size_t in_path_len = strlen(in_path); + char* path = (char*)malloc(in_path_len + 7); + memcpy(path, in_path, in_path_len + 1); + + for (unsigned i = 2; i < 1000000u; ++i) { + if (!exists(path, user_data)) { + return path; + } + snprintf(path, in_path_len + 7, "%s.%u", in_path, i); + } + + return NULL; +} + +typedef struct { + char* pattern; + time_t time; + char* latest; +} Latest; + +static void +update_latest(const char* path, const char* name, void* data) +{ + Latest* latest = (Latest*)data; + char* entry_path = lilv_path_join(path, name); + unsigned num = 0; + if (sscanf(entry_path, latest->pattern, &num) == 1) { + struct stat st; + if (!stat(entry_path, &st)) { + if (st.st_mtime >= latest->time) { + free(latest->latest); + latest->latest = entry_path; + } + } else { + LILV_ERRORF("stat(%s) (%s)\n", path, strerror(errno)); + } + } + if (entry_path != latest->latest) { + free(entry_path); + } +} + +/** Return the latest copy of the file at `path` that is newer. */ +char* +lilv_get_latest_copy(const char* path, const char* copy_path) +{ + char* copy_dir = lilv_path_parent(copy_path); + Latest latest = {lilv_strjoin(copy_path, ".%u", NULL), 0, NULL}; + + struct stat st; + if (!stat(path, &st)) { + latest.time = st.st_mtime; + } else { + LILV_ERRORF("stat(%s) (%s)\n", path, strerror(errno)); + } + + lilv_dir_for_each(copy_dir, &latest, update_latest); + + free(latest.pattern); + free(copy_dir); + return latest.latest; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c new file mode 100644 index 00000000..0e9bd2e2 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/world.c @@ -0,0 +1,1249 @@ +/* + Copyright 2007-2019 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "filesystem.h" +#include "lilv_config.h" // IWYU pragma: keep +#include "lilv_internal.h" + +#include "lilv/lilv.h" +#include "serd/serd.h" +#include "sord/sord.h" +#include "zix/common.h" +#include "zix/tree.h" + +#include "lv2/core/lv2.h" +#include "lv2/presets/presets.h" + +#ifdef LILV_DYN_MANIFEST +# include "lv2/dynmanifest/dynmanifest.h" +#endif + +#include +#include +#include +#include +#include +#include + +static int +lilv_world_drop_graph(LilvWorld* world, const SordNode* graph); + +LilvWorld* +lilv_world_new(void) +{ + LilvWorld* world = (LilvWorld*)calloc(1, sizeof(LilvWorld)); + + world->world = sord_world_new(); + if (!world->world) { + goto fail; + } + + world->model = sord_new(world->world, SORD_SPO | SORD_OPS, true); + if (!world->model) { + goto fail; + } + + world->specs = NULL; + world->plugin_classes = lilv_plugin_classes_new(); + world->plugins = lilv_plugins_new(); + world->zombies = lilv_plugins_new(); + world->loaded_files = zix_tree_new( + false, lilv_resource_node_cmp, NULL, (ZixDestroyFunc)lilv_node_free); + + world->libs = zix_tree_new(false, lilv_lib_compare, NULL, NULL); + +#define NS_DCTERMS "http://purl.org/dc/terms/" +#define NS_DYNMAN "http://lv2plug.in/ns/ext/dynmanifest#" +#define NS_OWL "http://www.w3.org/2002/07/owl#" + +#define NEW_URI(uri) sord_new_uri(world->world, (const uint8_t*)(uri)) + + world->uris.dc_replaces = NEW_URI(NS_DCTERMS "replaces"); + world->uris.dman_DynManifest = NEW_URI(NS_DYNMAN "DynManifest"); + world->uris.doap_name = NEW_URI(LILV_NS_DOAP "name"); + world->uris.lv2_Plugin = NEW_URI(LV2_CORE__Plugin); + world->uris.lv2_Specification = NEW_URI(LV2_CORE__Specification); + world->uris.lv2_appliesTo = NEW_URI(LV2_CORE__appliesTo); + world->uris.lv2_binary = NEW_URI(LV2_CORE__binary); + world->uris.lv2_default = NEW_URI(LV2_CORE__default); + world->uris.lv2_designation = NEW_URI(LV2_CORE__designation); + world->uris.lv2_extensionData = NEW_URI(LV2_CORE__extensionData); + world->uris.lv2_index = NEW_URI(LV2_CORE__index); + world->uris.lv2_latency = NEW_URI(LV2_CORE__latency); + world->uris.lv2_maximum = NEW_URI(LV2_CORE__maximum); + world->uris.lv2_microVersion = NEW_URI(LV2_CORE__microVersion); + world->uris.lv2_minimum = NEW_URI(LV2_CORE__minimum); + world->uris.lv2_minorVersion = NEW_URI(LV2_CORE__minorVersion); + world->uris.lv2_name = NEW_URI(LV2_CORE__name); + world->uris.lv2_optionalFeature = NEW_URI(LV2_CORE__optionalFeature); + world->uris.lv2_port = NEW_URI(LV2_CORE__port); + world->uris.lv2_portProperty = NEW_URI(LV2_CORE__portProperty); + world->uris.lv2_reportsLatency = NEW_URI(LV2_CORE__reportsLatency); + world->uris.lv2_requiredFeature = NEW_URI(LV2_CORE__requiredFeature); + world->uris.lv2_symbol = NEW_URI(LV2_CORE__symbol); + world->uris.lv2_prototype = NEW_URI(LV2_CORE__prototype); + world->uris.owl_Ontology = NEW_URI(NS_OWL "Ontology"); + world->uris.pset_value = NEW_URI(LV2_PRESETS__value); + world->uris.rdf_a = NEW_URI(LILV_NS_RDF "type"); + world->uris.rdf_value = NEW_URI(LILV_NS_RDF "value"); + world->uris.rdfs_Class = NEW_URI(LILV_NS_RDFS "Class"); + world->uris.rdfs_label = NEW_URI(LILV_NS_RDFS "label"); + world->uris.rdfs_seeAlso = NEW_URI(LILV_NS_RDFS "seeAlso"); + world->uris.rdfs_subClassOf = NEW_URI(LILV_NS_RDFS "subClassOf"); + world->uris.xsd_base64Binary = NEW_URI(LILV_NS_XSD "base64Binary"); + world->uris.xsd_boolean = NEW_URI(LILV_NS_XSD "boolean"); + world->uris.xsd_decimal = NEW_URI(LILV_NS_XSD "decimal"); + world->uris.xsd_double = NEW_URI(LILV_NS_XSD "double"); + world->uris.xsd_integer = NEW_URI(LILV_NS_XSD "integer"); + world->uris.null_uri = NULL; + + world->lv2_plugin_class = + lilv_plugin_class_new(world, NULL, world->uris.lv2_Plugin, "Plugin"); + assert(world->lv2_plugin_class); + + world->n_read_files = 0; + world->opt.filter_language = true; + world->opt.dyn_manifest = true; + + return world; + +fail: + /* keep on rockin' in the */ free(world); + return NULL; +} + +void +lilv_world_free(LilvWorld* world) +{ + if (!world) { + return; + } + + lilv_plugin_class_free(world->lv2_plugin_class); + world->lv2_plugin_class = NULL; + + for (SordNode** n = (SordNode**)&world->uris; *n; ++n) { + sord_node_free(world->world, *n); + } + + for (LilvSpec* spec = world->specs; spec;) { + LilvSpec* next = spec->next; + sord_node_free(world->world, spec->spec); + sord_node_free(world->world, spec->bundle); + lilv_nodes_free(spec->data_uris); + free(spec); + spec = next; + } + world->specs = NULL; + + LILV_FOREACH (plugins, i, world->plugins) { + const LilvPlugin* p = lilv_plugins_get(world->plugins, i); + lilv_plugin_free((LilvPlugin*)p); + } + zix_tree_free((ZixTree*)world->plugins); + world->plugins = NULL; + + LILV_FOREACH (plugins, i, world->zombies) { + const LilvPlugin* p = lilv_plugins_get(world->zombies, i); + lilv_plugin_free((LilvPlugin*)p); + } + zix_tree_free((ZixTree*)world->zombies); + world->zombies = NULL; + + zix_tree_free((ZixTree*)world->loaded_files); + world->loaded_files = NULL; + + zix_tree_free(world->libs); + world->libs = NULL; + + zix_tree_free((ZixTree*)world->plugin_classes); + world->plugin_classes = NULL; + + sord_free(world->model); + world->model = NULL; + + sord_world_free(world->world); + world->world = NULL; + + free(world->opt.lv2_path); + free(world); +} + +void +lilv_world_set_option(LilvWorld* world, const char* uri, const LilvNode* value) +{ + if (!strcmp(uri, LILV_OPTION_DYN_MANIFEST)) { + if (lilv_node_is_bool(value)) { + world->opt.dyn_manifest = lilv_node_as_bool(value); + return; + } + } else if (!strcmp(uri, LILV_OPTION_FILTER_LANG)) { + if (lilv_node_is_bool(value)) { + world->opt.filter_language = lilv_node_as_bool(value); + return; + } + } else if (!strcmp(uri, LILV_OPTION_LV2_PATH)) { + if (lilv_node_is_string(value)) { + world->opt.lv2_path = lilv_strdup(lilv_node_as_string(value)); + return; + } + } + LILV_WARNF("Unrecognized or invalid option `%s'\n", uri); +} + +LilvNodes* +lilv_world_find_nodes(LilvWorld* world, + const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object) +{ + if (subject && !lilv_node_is_uri(subject) && !lilv_node_is_blank(subject)) { + LILV_ERRORF("Subject `%s' is not a resource\n", + sord_node_get_string(subject->node)); + return NULL; + } + + if (!predicate) { + LILV_ERROR("Missing required predicate\n"); + return NULL; + } + + if (!lilv_node_is_uri(predicate)) { + LILV_ERRORF("Predicate `%s' is not a URI\n", + sord_node_get_string(predicate->node)); + return NULL; + } + + if (!subject && !object) { + LILV_ERROR("Both subject and object are NULL\n"); + return NULL; + } + + return lilv_world_find_nodes_internal(world, + subject ? subject->node : NULL, + predicate->node, + object ? object->node : NULL); +} + +LilvNode* +lilv_world_get(LilvWorld* world, + const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object) +{ + if (!object) { + // TODO: Improve performance (see lilv_plugin_get_one) + SordIter* stream = sord_search(world->model, + subject ? subject->node : NULL, + predicate ? predicate->node : NULL, + NULL, + NULL); + + LilvNodes* nodes = + lilv_nodes_from_stream_objects(world, stream, SORD_OBJECT); + + if (nodes) { + LilvNode* value = lilv_node_duplicate(lilv_nodes_get_first(nodes)); + lilv_nodes_free(nodes); + return value; + } + + return NULL; + } + + SordNode* snode = sord_get(world->model, + subject ? subject->node : NULL, + predicate ? predicate->node : NULL, + object ? object->node : NULL, + NULL); + LilvNode* lnode = lilv_node_new_from_node(world, snode); + sord_node_free(world->world, snode); + return lnode; +} + +SordIter* +lilv_world_query_internal(LilvWorld* world, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object) +{ + return sord_search(world->model, subject, predicate, object, NULL); +} + +bool +lilv_world_ask_internal(LilvWorld* world, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object) +{ + return sord_ask(world->model, subject, predicate, object, NULL); +} + +bool +lilv_world_ask(LilvWorld* world, + const LilvNode* subject, + const LilvNode* predicate, + const LilvNode* object) +{ + return sord_ask(world->model, + subject ? subject->node : NULL, + predicate ? predicate->node : NULL, + object ? object->node : NULL, + NULL); +} + +SordModel* +lilv_world_filter_model(LilvWorld* world, + SordModel* model, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object, + const SordNode* graph) +{ + SordModel* results = sord_new(world->world, SORD_SPO, false); + SordIter* i = sord_search(model, subject, predicate, object, graph); + for (; !sord_iter_end(i); sord_iter_next(i)) { + SordQuad quad; + sord_iter_get(i, quad); + sord_add(results, quad); + } + sord_iter_free(i); + return results; +} + +LilvNodes* +lilv_world_find_nodes_internal(LilvWorld* world, + const SordNode* subject, + const SordNode* predicate, + const SordNode* object) +{ + return lilv_nodes_from_stream_objects( + world, + lilv_world_query_internal(world, subject, predicate, object), + (object == NULL) ? SORD_OBJECT : SORD_SUBJECT); +} + +static SerdNode +lilv_new_uri_relative_to_base(const uint8_t* uri_str, + const uint8_t* base_uri_str) +{ + SerdURI base_uri; + serd_uri_parse(base_uri_str, &base_uri); + return serd_node_new_uri_from_string(uri_str, &base_uri, NULL); +} + +const uint8_t* +lilv_world_blank_node_prefix(LilvWorld* world) +{ + static char str[32]; + snprintf(str, sizeof(str), "%u", world->n_read_files++); + return (const uint8_t*)str; +} + +/** Comparator for sequences (e.g. world->plugins). */ +int +lilv_header_compare_by_uri(const void* a, const void* b, const void* user_data) +{ + (void)user_data; + + const struct LilvHeader* const header_a = (const struct LilvHeader*)a; + const struct LilvHeader* const header_b = (const struct LilvHeader*)b; + + return strcmp(lilv_node_as_uri(header_a->uri), + lilv_node_as_uri(header_b->uri)); +} + +/** + Comparator for libraries (world->libs). + + Libraries do have a LilvHeader, but we must also compare the bundle to + handle the case where the same library is loaded with different bundles, and + consequently different contents (mainly plugins). + */ +int +lilv_lib_compare(const void* a, const void* b, const void* user_data) +{ + (void)user_data; + + const LilvLib* const lib_a = (const LilvLib*)a; + const LilvLib* const lib_b = (const LilvLib*)b; + + const int cmp = + strcmp(lilv_node_as_uri(lib_a->uri), lilv_node_as_uri(lib_b->uri)); + + return cmp ? cmp : strcmp(lib_a->bundle_path, lib_b->bundle_path); +} + +/** Get an element of a collection of any object with an LilvHeader by URI. */ +static ZixTreeIter* +lilv_collection_find_by_uri(const ZixTree* seq, const LilvNode* uri) +{ + ZixTreeIter* i = NULL; + if (lilv_node_is_uri(uri)) { + struct LilvHeader key = {NULL, (LilvNode*)uri}; + zix_tree_find(seq, &key, &i); + } + return i; +} + +/** Get an element of a collection of any object with an LilvHeader by URI. */ +struct LilvHeader* +lilv_collection_get_by_uri(const ZixTree* seq, const LilvNode* uri) +{ + ZixTreeIter* const i = lilv_collection_find_by_uri(seq, uri); + + return i ? (struct LilvHeader*)zix_tree_get(i) : NULL; +} + +static void +lilv_world_add_spec(LilvWorld* world, + const SordNode* specification_node, + const SordNode* bundle_node) +{ + LilvSpec* spec = (LilvSpec*)malloc(sizeof(LilvSpec)); + spec->spec = sord_node_copy(specification_node); + spec->bundle = sord_node_copy(bundle_node); + spec->data_uris = lilv_nodes_new(); + + // Add all data files (rdfs:seeAlso) + SordIter* files = sord_search( + world->model, specification_node, world->uris.rdfs_seeAlso, NULL, NULL); + FOREACH_MATCH (files) { + const SordNode* file_node = sord_iter_get_node(files, SORD_OBJECT); + zix_tree_insert((ZixTree*)spec->data_uris, + lilv_node_new_from_node(world, file_node), + NULL); + } + sord_iter_free(files); + + // Add specification to world specification list + spec->next = world->specs; + world->specs = spec; +} + +static void +lilv_world_add_plugin(LilvWorld* world, + const SordNode* plugin_node, + const LilvNode* manifest_uri, + void* dynmanifest, + const SordNode* bundle) +{ + (void)dynmanifest; + + LilvNode* plugin_uri = lilv_node_new_from_node(world, plugin_node); + ZixTreeIter* z = NULL; + LilvPlugin* plugin = + (LilvPlugin*)lilv_plugins_get_by_uri(world->plugins, plugin_uri); + + if (plugin) { + // Existing plugin, if this is different bundle, ignore it + // (use the first plugin found in LV2_PATH) + const LilvNode* last_bundle = lilv_plugin_get_bundle_uri(plugin); + const char* plugin_uri_str = lilv_node_as_uri(plugin_uri); + if (sord_node_equals(bundle, last_bundle->node)) { + LILV_WARNF("Reloading plugin <%s>\n", plugin_uri_str); + plugin->loaded = false; + lilv_node_free(plugin_uri); + } else { + LILV_WARNF("Duplicate plugin <%s>\n", plugin_uri_str); + LILV_WARNF("... found in %s\n", lilv_node_as_string(last_bundle)); + LILV_WARNF("... and %s (ignored)\n", sord_node_get_string(bundle)); + lilv_node_free(plugin_uri); + return; + } + } else if ((z = lilv_collection_find_by_uri((const ZixTree*)world->zombies, + plugin_uri))) { + // Plugin bundle has been re-loaded, move from zombies to plugins + plugin = (LilvPlugin*)zix_tree_get(z); + zix_tree_remove((ZixTree*)world->zombies, z); + zix_tree_insert((ZixTree*)world->plugins, plugin, NULL); + lilv_node_free(plugin_uri); + lilv_plugin_clear(plugin, lilv_node_new_from_node(world, bundle)); + } else { + // Add new plugin to the world + plugin = lilv_plugin_new( + world, plugin_uri, lilv_node_new_from_node(world, bundle)); + + // Add manifest as plugin data file (as if it were rdfs:seeAlso) + zix_tree_insert( + (ZixTree*)plugin->data_uris, lilv_node_duplicate(manifest_uri), NULL); + + // Add plugin to world plugin sequence + zix_tree_insert((ZixTree*)world->plugins, plugin, NULL); + } + +#ifdef LILV_DYN_MANIFEST + // Set dynamic manifest library URI, if applicable + if (dynmanifest) { + plugin->dynmanifest = (LilvDynManifest*)dynmanifest; + ++((LilvDynManifest*)dynmanifest)->refs; + } +#endif + + // Add all plugin data files (rdfs:seeAlso) + SordIter* files = sord_search( + world->model, plugin_node, world->uris.rdfs_seeAlso, NULL, NULL); + FOREACH_MATCH (files) { + const SordNode* file_node = sord_iter_get_node(files, SORD_OBJECT); + zix_tree_insert((ZixTree*)plugin->data_uris, + lilv_node_new_from_node(world, file_node), + NULL); + } + sord_iter_free(files); +} + +SerdStatus +lilv_world_load_graph(LilvWorld* world, SordNode* graph, const LilvNode* uri) +{ + const SerdNode* base = sord_node_to_serd_node(uri->node); + SerdEnv* env = serd_env_new(base); + SerdReader* reader = sord_new_reader(world->model, env, SERD_TURTLE, graph); + + const SerdStatus st = lilv_world_load_file(world, reader, uri); + + serd_env_free(env); + serd_reader_free(reader); + return st; +} + +static void +lilv_world_load_dyn_manifest(LilvWorld* world, + SordNode* bundle_node, + const LilvNode* manifest) +{ +#ifdef LILV_DYN_MANIFEST + if (!world->opt.dyn_manifest) { + return; + } + + LV2_Dyn_Manifest_Handle handle = NULL; + + // ?dman a dynman:DynManifest bundle_node + SordModel* model = lilv_world_filter_model(world, + world->model, + NULL, + world->uris.rdf_a, + world->uris.dman_DynManifest, + bundle_node); + SordIter* iter = sord_begin(model); + for (; !sord_iter_end(iter); sord_iter_next(iter)) { + const SordNode* dmanifest = sord_iter_get_node(iter, SORD_SUBJECT); + + // ?dman lv2:binary ?binary + SordIter* binaries = sord_search( + world->model, dmanifest, world->uris.lv2_binary, NULL, bundle_node); + if (sord_iter_end(binaries)) { + sord_iter_free(binaries); + LILV_ERRORF("Dynamic manifest in <%s> has no binaries, ignored\n", + sord_node_get_string(bundle_node)); + continue; + } + + // Get binary path + const SordNode* binary = sord_iter_get_node(binaries, SORD_OBJECT); + const uint8_t* lib_uri = sord_node_get_string(binary); + char* lib_path = lilv_file_uri_parse((const char*)lib_uri, 0); + if (!lib_path) { + LILV_ERROR("No dynamic manifest library path\n"); + sord_iter_free(binaries); + continue; + } + + // Open library + dlerror(); + void* lib = dlopen(lib_path, RTLD_LAZY); + if (!lib) { + LILV_ERRORF( + "Failed to open dynmanifest library `%s' (%s)\n", lib_path, dlerror()); + sord_iter_free(binaries); + lilv_free(lib_path); + continue; + } + + // Open dynamic manifest + typedef int (*OpenFunc)(LV2_Dyn_Manifest_Handle*, + const LV2_Feature* const*); + OpenFunc dmopen = (OpenFunc)lilv_dlfunc(lib, "lv2_dyn_manifest_open"); + if (!dmopen || dmopen(&handle, &dman_features)) { + LILV_ERRORF("No `lv2_dyn_manifest_open' in `%s'\n", lib_path); + sord_iter_free(binaries); + dlclose(lib); + lilv_free(lib_path); + continue; + } + + // Get subjects (the data that would be in manifest.ttl) + typedef int (*GetSubjectsFunc)(LV2_Dyn_Manifest_Handle, FILE*); + GetSubjectsFunc get_subjects_func = + (GetSubjectsFunc)lilv_dlfunc(lib, "lv2_dyn_manifest_get_subjects"); + if (!get_subjects_func) { + LILV_ERRORF("No `lv2_dyn_manifest_get_subjects' in `%s'\n", lib_path); + sord_iter_free(binaries); + dlclose(lib); + lilv_free(lib_path); + continue; + } + + LilvDynManifest* desc = (LilvDynManifest*)malloc(sizeof(LilvDynManifest)); + desc->bundle = lilv_node_new_from_node(world, bundle_node); + desc->lib = lib; + desc->handle = handle; + desc->refs = 0; + + sord_iter_free(binaries); + + // Generate data file + FILE* fd = tmpfile(); + get_subjects_func(handle, fd); + rewind(fd); + + // Parse generated data file into temporary model + // FIXME + const SerdNode* base = sord_node_to_serd_node(dmanifest); + SerdEnv* env = serd_env_new(base); + SerdReader* reader = sord_new_reader( + world->model, env, SERD_TURTLE, sord_node_copy(dmanifest)); + serd_reader_add_blank_prefix(reader, lilv_world_blank_node_prefix(world)); + serd_reader_read_file_handle(reader, fd, (const uint8_t*)"(dyn-manifest)"); + serd_reader_free(reader); + serd_env_free(env); + + // Close (and automatically delete) temporary data file + fclose(fd); + + // ?plugin a lv2:Plugin + SordModel* plugins = lilv_world_filter_model(world, + world->model, + NULL, + world->uris.rdf_a, + world->uris.lv2_Plugin, + dmanifest); + SordIter* p = sord_begin(plugins); + FOREACH_MATCH (p) { + const SordNode* plug = sord_iter_get_node(p, SORD_SUBJECT); + lilv_world_add_plugin(world, plug, manifest, desc, bundle_node); + } + if (desc->refs == 0) { + lilv_dynmanifest_free(desc); + } + sord_iter_free(p); + sord_free(plugins); + lilv_free(lib_path); + } + sord_iter_free(iter); + sord_free(model); + +#else // LILV_DYN_MANIFEST + (void)world; + (void)bundle_node; + (void)manifest; +#endif +} + +#ifdef LILV_DYN_MANIFEST +void +lilv_dynmanifest_free(LilvDynManifest* dynmanifest) +{ + typedef int (*CloseFunc)(LV2_Dyn_Manifest_Handle); + CloseFunc close_func = + (CloseFunc)lilv_dlfunc(dynmanifest->lib, "lv2_dyn_manifest_close"); + if (close_func) { + close_func(dynmanifest->handle); + } + + dlclose(dynmanifest->lib); + lilv_node_free(dynmanifest->bundle); + free(dynmanifest); +} +#endif // LILV_DYN_MANIFEST + +LilvNode* +lilv_world_get_manifest_uri(LilvWorld* world, const LilvNode* bundle_uri) +{ + SerdNode manifest_uri = lilv_new_uri_relative_to_base( + (const uint8_t*)"manifest.ttl", sord_node_get_string(bundle_uri->node)); + LilvNode* manifest = lilv_new_uri(world, (const char*)manifest_uri.buf); + serd_node_free(&manifest_uri); + return manifest; +} + +static SordModel* +load_plugin_model(LilvWorld* world, + const LilvNode* bundle_uri, + const LilvNode* plugin_uri) +{ + // Create model and reader for loading into it + SordNode* bundle_node = bundle_uri->node; + SordModel* model = sord_new(world->world, SORD_SPO | SORD_OPS, false); + SerdEnv* env = serd_env_new(sord_node_to_serd_node(bundle_node)); + SerdReader* reader = sord_new_reader(model, env, SERD_TURTLE, NULL); + + // Load manifest + LilvNode* manifest_uri = lilv_world_get_manifest_uri(world, bundle_uri); + serd_reader_add_blank_prefix(reader, lilv_world_blank_node_prefix(world)); + serd_reader_read_file(reader, + (const uint8_t*)lilv_node_as_string(manifest_uri)); + + // Load any seeAlso files + SordModel* files = lilv_world_filter_model( + world, model, plugin_uri->node, world->uris.rdfs_seeAlso, NULL, NULL); + + SordIter* f = sord_begin(files); + FOREACH_MATCH (f) { + const SordNode* file = sord_iter_get_node(f, SORD_OBJECT); + const uint8_t* file_str = sord_node_get_string(file); + if (sord_node_get_type(file) == SORD_URI) { + serd_reader_add_blank_prefix(reader, lilv_world_blank_node_prefix(world)); + serd_reader_read_file(reader, file_str); + } + } + + sord_iter_free(f); + sord_free(files); + serd_reader_free(reader); + serd_env_free(env); + lilv_node_free(manifest_uri); + + return model; +} + +static LilvVersion +get_version(LilvWorld* world, SordModel* model, const LilvNode* subject) +{ + const SordNode* minor_node = + sord_get(model, subject->node, world->uris.lv2_minorVersion, NULL, NULL); + const SordNode* micro_node = + sord_get(model, subject->node, world->uris.lv2_microVersion, NULL, NULL); + + LilvVersion version = {0, 0}; + if (minor_node && micro_node) { + version.minor = atoi((const char*)sord_node_get_string(minor_node)); + version.micro = atoi((const char*)sord_node_get_string(micro_node)); + } + + return version; +} + +void +lilv_world_load_bundle(LilvWorld* world, const LilvNode* bundle_uri) +{ + if (!lilv_node_is_uri(bundle_uri)) { + LILV_ERRORF("Bundle URI `%s' is not a URI\n", + sord_node_get_string(bundle_uri->node)); + return; + } + + SordNode* bundle_node = bundle_uri->node; + LilvNode* manifest = lilv_world_get_manifest_uri(world, bundle_uri); + + // Read manifest into model with graph = bundle_node + SerdStatus st = lilv_world_load_graph(world, bundle_node, manifest); + if (st > SERD_FAILURE) { + LILV_ERRORF("Error reading %s\n", lilv_node_as_string(manifest)); + lilv_node_free(manifest); + return; + } + + // ?plugin a lv2:Plugin + SordIter* plug_results = sord_search( + world->model, NULL, world->uris.rdf_a, world->uris.lv2_Plugin, bundle_node); + + // Find any loaded plugins that will be replaced with a newer version + LilvNodes* unload_uris = lilv_nodes_new(); + FOREACH_MATCH (plug_results) { + const SordNode* plug = sord_iter_get_node(plug_results, SORD_SUBJECT); + + LilvNode* plugin_uri = lilv_node_new_from_node(world, plug); + const LilvPlugin* plugin = + lilv_plugins_get_by_uri(world->plugins, plugin_uri); + const LilvNode* last_bundle = + plugin ? lilv_plugin_get_bundle_uri(plugin) : NULL; + if (!plugin || sord_node_equals(bundle_node, last_bundle->node)) { + // No previously loaded version, or it's from the same bundle + lilv_node_free(plugin_uri); + continue; + } + + // Compare versions + SordModel* this_model = load_plugin_model(world, bundle_uri, plugin_uri); + LilvVersion this_version = get_version(world, this_model, plugin_uri); + SordModel* last_model = load_plugin_model(world, last_bundle, plugin_uri); + LilvVersion last_version = get_version(world, last_model, plugin_uri); + sord_free(this_model); + sord_free(last_model); + const int cmp = lilv_version_cmp(&this_version, &last_version); + if (cmp > 0) { + zix_tree_insert( + (ZixTree*)unload_uris, lilv_node_duplicate(plugin_uri), NULL); + LILV_WARNF("Replacing version %d.%d of <%s> from <%s>\n", + last_version.minor, + last_version.micro, + sord_node_get_string(plug), + sord_node_get_string(last_bundle->node)); + LILV_NOTEF("New version %d.%d found in <%s>\n", + this_version.minor, + this_version.micro, + sord_node_get_string(bundle_node)); + } else if (cmp < 0) { + LILV_WARNF("Ignoring bundle <%s>\n", sord_node_get_string(bundle_node)); + LILV_NOTEF("Newer version of <%s> loaded from <%s>\n", + sord_node_get_string(plug), + sord_node_get_string(last_bundle->node)); + lilv_node_free(plugin_uri); + sord_iter_free(plug_results); + lilv_world_drop_graph(world, bundle_node); + lilv_node_free(manifest); + lilv_nodes_free(unload_uris); + return; + } + lilv_node_free(plugin_uri); + } + + sord_iter_free(plug_results); + + // Unload any old conflicting plugins + LilvNodes* unload_bundles = lilv_nodes_new(); + LILV_FOREACH (nodes, i, unload_uris) { + const LilvNode* uri = lilv_nodes_get(unload_uris, i); + const LilvPlugin* plugin = lilv_plugins_get_by_uri(world->plugins, uri); + const LilvNode* bundle = lilv_plugin_get_bundle_uri(plugin); + + // Unload plugin and record bundle for later unloading + lilv_world_unload_resource(world, uri); + zix_tree_insert( + (ZixTree*)unload_bundles, lilv_node_duplicate(bundle), NULL); + } + lilv_nodes_free(unload_uris); + + // Now unload the associated bundles + // This must be done last since several plugins could be in the same bundle + LILV_FOREACH (nodes, i, unload_bundles) { + lilv_world_unload_bundle(world, lilv_nodes_get(unload_bundles, i)); + } + lilv_nodes_free(unload_bundles); + + // Re-search for plugin results now that old plugins are gone + plug_results = sord_search( + world->model, NULL, world->uris.rdf_a, world->uris.lv2_Plugin, bundle_node); + + FOREACH_MATCH (plug_results) { + const SordNode* plug = sord_iter_get_node(plug_results, SORD_SUBJECT); + lilv_world_add_plugin(world, plug, manifest, NULL, bundle_node); + } + sord_iter_free(plug_results); + + lilv_world_load_dyn_manifest(world, bundle_node, manifest); + + // ?spec a lv2:Specification + // ?spec a owl:Ontology + const SordNode* spec_preds[] = { + world->uris.lv2_Specification, world->uris.owl_Ontology, NULL}; + for (const SordNode** p = spec_preds; *p; ++p) { + SordIter* i = + sord_search(world->model, NULL, world->uris.rdf_a, *p, bundle_node); + FOREACH_MATCH (i) { + const SordNode* spec = sord_iter_get_node(i, SORD_SUBJECT); + lilv_world_add_spec(world, spec, bundle_node); + } + sord_iter_free(i); + } + + lilv_node_free(manifest); +} + +static int +lilv_world_drop_graph(LilvWorld* world, const SordNode* graph) +{ + SordIter* i = sord_search(world->model, NULL, NULL, NULL, graph); + while (!sord_iter_end(i)) { + const SerdStatus st = sord_erase(world->model, i); + if (st) { + LILV_ERRORF("Error removing statement from <%s> (%s)\n", + sord_node_get_string(graph), + serd_strerror(st)); + return st; + } + } + sord_iter_free(i); + + return 0; +} + +/** Remove loaded_files entry so file will be reloaded if requested. */ +static int +lilv_world_unload_file(LilvWorld* world, const LilvNode* file) +{ + ZixTreeIter* iter = NULL; + if (!zix_tree_find((ZixTree*)world->loaded_files, file, &iter)) { + zix_tree_remove((ZixTree*)world->loaded_files, iter); + return 0; + } + return 1; +} + +int +lilv_world_unload_bundle(LilvWorld* world, const LilvNode* bundle_uri) +{ + if (!bundle_uri) { + return 0; + } + + // Find all loaded files that are inside the bundle + LilvNodes* files = lilv_nodes_new(); + LILV_FOREACH (nodes, i, world->loaded_files) { + const LilvNode* file = lilv_nodes_get(world->loaded_files, i); + if (!strncmp(lilv_node_as_string(file), + lilv_node_as_string(bundle_uri), + strlen(lilv_node_as_string(bundle_uri)))) { + zix_tree_insert((ZixTree*)files, lilv_node_duplicate(file), NULL); + } + } + + // Unload all loaded files in the bundle + LILV_FOREACH (nodes, i, files) { + const LilvNode* file = lilv_nodes_get(world->plugins, i); + lilv_world_unload_file(world, file); + } + + lilv_nodes_free(files); + + /* Remove any plugins in the bundle from the plugin list. Since the + application may still have a pointer to the LilvPlugin, it can not be + destroyed here. Instead, we move it to the zombie plugin list, so it + will not be in the list returned by lilv_world_get_all_plugins() but can + still be used. + */ + ZixTreeIter* i = zix_tree_begin((ZixTree*)world->plugins); + while (i != zix_tree_end((ZixTree*)world->plugins)) { + LilvPlugin* p = (LilvPlugin*)zix_tree_get(i); + ZixTreeIter* next = zix_tree_iter_next(i); + + if (lilv_node_equals(lilv_plugin_get_bundle_uri(p), bundle_uri)) { + zix_tree_remove((ZixTree*)world->plugins, i); + zix_tree_insert((ZixTree*)world->zombies, p, NULL); + } + + i = next; + } + + // Drop everything in bundle graph + return lilv_world_drop_graph(world, bundle_uri->node); +} + +static void +load_dir_entry(const char* dir, const char* name, void* data) +{ + LilvWorld* world = (LilvWorld*)data; + char* path = lilv_strjoin(dir, "/", name, "/", NULL); + SerdNode suri = serd_node_new_file_uri((const uint8_t*)path, 0, 0, true); + LilvNode* node = lilv_new_uri(world, (const char*)suri.buf); + + lilv_world_load_bundle(world, node); + lilv_node_free(node); + serd_node_free(&suri); + free(path); +} + +/** Load all bundles in the directory at `dir_path`. */ +static void +lilv_world_load_directory(LilvWorld* world, const char* dir_path) +{ + char* path = lilv_expand(dir_path); + if (path) { + lilv_dir_for_each(path, world, load_dir_entry); + free(path); + } +} + +static const char* +first_path_sep(const char* path) +{ + for (const char* p = path; *p != '\0'; ++p) { + if (*p == LILV_PATH_SEP[0]) { + return p; + } + } + return NULL; +} + +/** Load all bundles found in `lv2_path`. + * @param lv2_path A colon-delimited list of directories. These directories + * should contain LV2 bundle directories (ie the search path is a list of + * parent directories of bundles, not a list of bundle directories). + */ +static void +lilv_world_load_path(LilvWorld* world, const char* lv2_path) +{ + while (lv2_path[0] != '\0') { + const char* const sep = first_path_sep(lv2_path); + if (sep) { + const size_t dir_len = sep - lv2_path; + char* const dir = (char*)malloc(dir_len + 1); + memcpy(dir, lv2_path, dir_len); + dir[dir_len] = '\0'; + lilv_world_load_directory(world, dir); + free(dir); + lv2_path += dir_len + 1; + } else { + lilv_world_load_directory(world, lv2_path); + lv2_path = "\0"; + } + } +} + +void +lilv_world_load_specifications(LilvWorld* world) +{ + for (LilvSpec* spec = world->specs; spec; spec = spec->next) { + LILV_FOREACH (nodes, f, spec->data_uris) { + LilvNode* file = (LilvNode*)lilv_collection_get(spec->data_uris, f); + lilv_world_load_graph(world, NULL, file); + } + } +} + +void +lilv_world_load_plugin_classes(LilvWorld* world) +{ + /* FIXME: This loads all classes, not just lv2:Plugin subclasses. + However, if the host gets all the classes via + lilv_plugin_class_get_children starting with lv2:Plugin as the root (which + is e.g. how a host would build a menu), they won't be seen anyway... + */ + + SordIter* classes = sord_search( + world->model, NULL, world->uris.rdf_a, world->uris.rdfs_Class, NULL); + FOREACH_MATCH (classes) { + const SordNode* class_node = sord_iter_get_node(classes, SORD_SUBJECT); + + SordNode* parent = sord_get( + world->model, class_node, world->uris.rdfs_subClassOf, NULL, NULL); + if (!parent || sord_node_get_type(parent) != SORD_URI) { + continue; + } + + SordNode* label = + sord_get(world->model, class_node, world->uris.rdfs_label, NULL, NULL); + if (!label) { + sord_node_free(world->world, parent); + continue; + } + + LilvPluginClass* pclass = lilv_plugin_class_new( + world, parent, class_node, (const char*)sord_node_get_string(label)); + if (pclass) { + zix_tree_insert((ZixTree*)world->plugin_classes, pclass, NULL); + } + + sord_node_free(world->world, label); + sord_node_free(world->world, parent); + } + sord_iter_free(classes); +} + +void +lilv_world_load_all(LilvWorld* world) +{ + const char* lv2_path = world->opt.lv2_path; + if (!lv2_path) { + lv2_path = getenv("LV2_PATH"); + } + if (!lv2_path) { + lv2_path = LILV_DEFAULT_LV2_PATH; + } + + // Discover bundles and read all manifest files into model + lilv_world_load_path(world, lv2_path); + + LILV_FOREACH (plugins, p, world->plugins) { + const LilvPlugin* plugin = + (const LilvPlugin*)lilv_collection_get((ZixTree*)world->plugins, p); + + // ?new dc:replaces plugin + if (sord_ask(world->model, + NULL, + world->uris.dc_replaces, + lilv_plugin_get_uri(plugin)->node, + NULL)) { + // TODO: Check if replacement is a known plugin? (expensive) + ((LilvPlugin*)plugin)->replaced = true; + } + } + + // Query out things to cache + lilv_world_load_specifications(world); + lilv_world_load_plugin_classes(world); +} + +SerdStatus +lilv_world_load_file(LilvWorld* world, SerdReader* reader, const LilvNode* uri) +{ + ZixTreeIter* iter = NULL; + if (!zix_tree_find((ZixTree*)world->loaded_files, uri, &iter)) { + return SERD_FAILURE; // File has already been loaded + } + + size_t uri_len = 0; + const uint8_t* const uri_str = + sord_node_get_string_counted(uri->node, &uri_len); + if (strncmp((const char*)uri_str, "file:", 5)) { + return SERD_FAILURE; // Not a local file + } + + if (strcmp((const char*)uri_str + uri_len - 4, ".ttl")) { + return SERD_FAILURE; // Not a Turtle file + } + + serd_reader_add_blank_prefix(reader, lilv_world_blank_node_prefix(world)); + const SerdStatus st = serd_reader_read_file(reader, uri_str); + if (st) { + LILV_ERRORF("Error loading file `%s'\n", lilv_node_as_string(uri)); + return st; + } + + zix_tree_insert( + (ZixTree*)world->loaded_files, lilv_node_duplicate(uri), NULL); + return SERD_SUCCESS; +} + +int +lilv_world_load_resource(LilvWorld* world, const LilvNode* resource) +{ + if (!lilv_node_is_uri(resource) && !lilv_node_is_blank(resource)) { + LILV_ERRORF("Node `%s' is not a resource\n", + sord_node_get_string(resource->node)); + return -1; + } + + SordModel* files = lilv_world_filter_model( + world, world->model, resource->node, world->uris.rdfs_seeAlso, NULL, NULL); + + SordIter* f = sord_begin(files); + int n_read = 0; + FOREACH_MATCH (f) { + const SordNode* file = sord_iter_get_node(f, SORD_OBJECT); + const uint8_t* file_str = sord_node_get_string(file); + LilvNode* file_node = lilv_node_new_from_node(world, file); + if (sord_node_get_type(file) != SORD_URI) { + LILV_ERRORF("rdfs:seeAlso node `%s' is not a URI\n", file_str); + } else if (!lilv_world_load_graph(world, (SordNode*)file, file_node)) { + ++n_read; + } + lilv_node_free(file_node); + } + sord_iter_free(f); + + sord_free(files); + return n_read; +} + +int +lilv_world_unload_resource(LilvWorld* world, const LilvNode* resource) +{ + if (!lilv_node_is_uri(resource) && !lilv_node_is_blank(resource)) { + LILV_ERRORF("Node `%s' is not a resource\n", + sord_node_get_string(resource->node)); + return -1; + } + + SordModel* files = lilv_world_filter_model( + world, world->model, resource->node, world->uris.rdfs_seeAlso, NULL, NULL); + + SordIter* f = sord_begin(files); + int n_dropped = 0; + FOREACH_MATCH (f) { + const SordNode* file = sord_iter_get_node(f, SORD_OBJECT); + LilvNode* file_node = lilv_node_new_from_node(world, file); + if (sord_node_get_type(file) != SORD_URI) { + LILV_ERRORF("rdfs:seeAlso node `%s' is not a URI\n", + sord_node_get_string(file)); + } else if (!lilv_world_drop_graph(world, file_node->node)) { + lilv_world_unload_file(world, file_node); + ++n_dropped; + } + lilv_node_free(file_node); + } + sord_iter_free(f); + + sord_free(files); + return n_dropped; +} + +const LilvPluginClass* +lilv_world_get_plugin_class(const LilvWorld* world) +{ + return world->lv2_plugin_class; +} + +const LilvPluginClasses* +lilv_world_get_plugin_classes(const LilvWorld* world) +{ + return world->plugin_classes; +} + +const LilvPlugins* +lilv_world_get_all_plugins(const LilvWorld* world) +{ + return world->plugins; +} + +LilvNode* +lilv_world_get_symbol(LilvWorld* world, const LilvNode* subject) +{ + // Check for explicitly given symbol + SordNode* snode = + sord_get(world->model, subject->node, world->uris.lv2_symbol, NULL, NULL); + + if (snode) { + LilvNode* ret = lilv_node_new_from_node(world, snode); + sord_node_free(world->world, snode); + return ret; + } + + if (!lilv_node_is_uri(subject)) { + return NULL; + } + + // Find rightmost segment of URI + SerdURI uri; + serd_uri_parse((const uint8_t*)lilv_node_as_uri(subject), &uri); + const char* str = "_"; + if (uri.fragment.buf) { + str = (const char*)uri.fragment.buf + 1; + } else if (uri.query.buf) { + str = (const char*)uri.query.buf; + } else if (uri.path.buf) { + const char* last_slash = strrchr((const char*)uri.path.buf, '/'); + str = last_slash ? (last_slash + 1) : (const char*)uri.path.buf; + } + + // Replace invalid characters + const size_t len = strlen(str); + char* const sym = (char*)calloc(1, len + 1); + for (size_t i = 0; i < len; ++i) { + const char c = str[i]; + if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c == '_') || + (i > 0 && c >= '0' && c <= '9'))) { + sym[i] = '_'; + } else { + sym[i] = str[i]; + } + } + + LilvNode* ret = lilv_new_string(world, sym); + free(sym); + return ret; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h new file mode 100644 index 00000000..d47586c6 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/common.h @@ -0,0 +1,138 @@ +/* + Copyright 2016-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef ZIX_COMMON_H +#define ZIX_COMMON_H + +#include + +/** + @addtogroup zix + @{ +*/ + +/** @cond */ +#if defined(_WIN32) && !defined(ZIX_STATIC) && defined(ZIX_INTERNAL) +# define ZIX_API __declspec(dllexport) +#elif defined(_WIN32) && !defined(ZIX_STATIC) +# define ZIX_API __declspec(dllimport) +#elif defined(__GNUC__) +# define ZIX_API __attribute__((visibility("default"))) +#else +# define ZIX_API +#endif + +#ifdef __GNUC__ +# define ZIX_PURE_FUNC __attribute__((pure)) +# define ZIX_CONST_FUNC __attribute__((const)) +# define ZIX_MALLOC_FUNC __attribute__((malloc)) +#else +# define ZIX_PURE_FUNC +# define ZIX_CONST_FUNC +# define ZIX_MALLOC_FUNC +#endif + +#define ZIX_PURE_API \ + ZIX_API \ + ZIX_PURE_FUNC + +#define ZIX_CONST_API \ + ZIX_API \ + ZIX_CONST_FUNC + +#define ZIX_MALLOC_API \ + ZIX_API \ + ZIX_MALLOC_FUNC + +/** @endcond */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __GNUC__ +# define ZIX_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define ZIX_LOG_FUNC(fmt, arg1) +#endif + +// Unused parameter macro to suppresses warnings and make it impossible to use +#if defined(__cplusplus) +# define ZIX_UNUSED(name) +#elif defined(__GNUC__) +# define ZIX_UNUSED(name) name##_unused __attribute__((__unused__)) +#else +# define ZIX_UNUSED(name) name +#endif + +typedef enum { + ZIX_STATUS_SUCCESS, + ZIX_STATUS_ERROR, + ZIX_STATUS_NO_MEM, + ZIX_STATUS_NOT_FOUND, + ZIX_STATUS_EXISTS, + ZIX_STATUS_BAD_ARG, + ZIX_STATUS_BAD_PERMS +} ZixStatus; + +static inline const char* +zix_strerror(const ZixStatus status) +{ + switch (status) { + case ZIX_STATUS_SUCCESS: + return "Success"; + case ZIX_STATUS_ERROR: + return "Unknown error"; + case ZIX_STATUS_NO_MEM: + return "Out of memory"; + case ZIX_STATUS_NOT_FOUND: + return "Not found"; + case ZIX_STATUS_EXISTS: + return "Exists"; + case ZIX_STATUS_BAD_ARG: + return "Bad argument"; + case ZIX_STATUS_BAD_PERMS: + return "Bad permissions"; + } + return "Unknown error"; +} + +/** + Function for comparing two elements. +*/ +typedef int (*ZixComparator)(const void* a, + const void* b, + const void* user_data); + +/** + Function for testing equality of two elements. +*/ +typedef bool (*ZixEqualFunc)(const void* a, const void* b); + +/** + Function to destroy an element. +*/ +typedef void (*ZixDestroyFunc)(void* ptr); + +/** + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_COMMON_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c new file mode 100644 index 00000000..9faf13cf --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.c @@ -0,0 +1,727 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "zix/tree.h" + +#include "zix/common.h" + +#include +#include +#include + +typedef struct ZixTreeNodeImpl ZixTreeNode; + +struct ZixTreeImpl { + ZixTreeNode* root; + ZixDestroyFunc destroy; + ZixComparator cmp; + void* cmp_data; + size_t size; + bool allow_duplicates; +}; + +struct ZixTreeNodeImpl { + void* data; + struct ZixTreeNodeImpl* left; + struct ZixTreeNodeImpl* right; + struct ZixTreeNodeImpl* parent; + int balance; +}; + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) + +// Uncomment these for debugging features +// #define ZIX_TREE_DUMP 1 +// #define ZIX_TREE_VERIFY 1 +// #define ZIX_TREE_HYPER_VERIFY 1 + +#if defined(ZIX_TREE_VERIFY) || defined(ZIX_TREE_HYPER_VERIFY) +# include "tree_debug.h" +# define ASSERT_BALANCE(n) assert(verify_balance(n)) +#else +# define ASSERT_BALANCE(n) +#endif + +#ifdef ZIX_TREE_DUMP +# include "tree_debug.h" +# define DUMP(t) zix_tree_print(t->root, 0) +# define DEBUG_PRINTF(fmt, ...) printf(fmt, __VA_ARGS__) +#else +# define DUMP(t) +# define DEBUG_PRINTF(fmt, ...) +#endif + +ZixTree* +zix_tree_new(bool allow_duplicates, + ZixComparator cmp, + void* cmp_data, + ZixDestroyFunc destroy) +{ + ZixTree* t = (ZixTree*)malloc(sizeof(ZixTree)); + t->root = NULL; + t->destroy = destroy; + t->cmp = cmp; + t->cmp_data = cmp_data; + t->size = 0; + t->allow_duplicates = allow_duplicates; + return t; +} + +static void +zix_tree_free_rec(ZixTree* t, ZixTreeNode* n) +{ + if (n) { + zix_tree_free_rec(t, n->left); + zix_tree_free_rec(t, n->right); + if (t->destroy) { + t->destroy(n->data); + } + free(n); + } +} + +void +zix_tree_free(ZixTree* t) +{ + if (t) { + zix_tree_free_rec(t, t->root); + free(t); + } +} + +size_t +zix_tree_size(const ZixTree* t) +{ + return t->size; +} + +static void +rotate(ZixTreeNode* p, ZixTreeNode* q) +{ + assert(q->parent == p); + assert(p->left == q || p->right == q); + + q->parent = p->parent; + if (q->parent) { + if (q->parent->left == p) { + q->parent->left = q; + } else { + q->parent->right = q; + } + } + + if (p->right == q) { + // Rotate left + p->right = q->left; + q->left = p; + if (p->right) { + p->right->parent = p; + } + } else { + // Rotate right + assert(p->left == q); + p->left = q->right; + q->right = p; + if (p->left) { + p->left->parent = p; + } + } + + p->parent = q; +} + +/** + * Rotate left about `p`. + * + * p q + * / \ / \ + * A q => p C + * / \ / \ + * B C A B + */ +static ZixTreeNode* +rotate_left(ZixTreeNode* p, int* height_change) +{ + ZixTreeNode* const q = p->right; + *height_change = (q->balance == 0) ? 0 : -1; + + DEBUG_PRINTF("LL %ld\n", (intptr_t)p->data); + + assert(p->balance == 2); + assert(q->balance == 0 || q->balance == 1); + + rotate(p, q); + + // p->balance -= 1 + MAX(0, q->balance); + // q->balance -= 1 - MIN(0, p->balance); + --q->balance; + p->balance = -(q->balance); + + ASSERT_BALANCE(p); + ASSERT_BALANCE(q); + return q; +} + +/** + * Rotate right about `p`. + * + * p q + * / \ / \ + * q C => A p + * / \ / \ + * A B B C + * + */ +static ZixTreeNode* +rotate_right(ZixTreeNode* p, int* height_change) +{ + ZixTreeNode* const q = p->left; + *height_change = (q->balance == 0) ? 0 : -1; + + DEBUG_PRINTF("RR %ld\n", (intptr_t)p->data); + + assert(p->balance == -2); + assert(q->balance == 0 || q->balance == -1); + + rotate(p, q); + + // p->balance += 1 - MIN(0, q->balance); + // q->balance += 1 + MAX(0, p->balance); + ++q->balance; + p->balance = -(q->balance); + + ASSERT_BALANCE(p); + ASSERT_BALANCE(q); + return q; +} + +/** + * Rotate left about `p->left` then right about `p`. + * + * p r + * / \ / \ + * q D => q p + * / \ / \ / \ + * A r A B C D + * / \ + * B C + * + */ +static ZixTreeNode* +rotate_left_right(ZixTreeNode* p, int* height_change) +{ + ZixTreeNode* const q = p->left; + ZixTreeNode* const r = q->right; + + assert(p->balance == -2); + assert(q->balance == 1); + assert(r->balance == -1 || r->balance == 0 || r->balance == 1); + + DEBUG_PRINTF("LR %ld P: %2d Q: %2d R: %2d\n", + (intptr_t)p->data, + p->balance, + q->balance, + r->balance); + + rotate(q, r); + rotate(p, r); + + q->balance -= 1 + MAX(0, r->balance); + p->balance += 1 - MIN(MIN(0, r->balance) - 1, r->balance + q->balance); + // r->balance += MAX(0, p->balance) + MIN(0, q->balance); + + // p->balance = (p->left && p->right) ? -MIN(r->balance, 0) : 0; + // q->balance = - MAX(r->balance, 0); + r->balance = 0; + + *height_change = -1; + + ASSERT_BALANCE(p); + ASSERT_BALANCE(q); + ASSERT_BALANCE(r); + return r; +} + +/** + * Rotate right about `p->right` then right about `p`. + * + * p r + * / \ / \ + * A q => p q + * / \ / \ / \ + * r D A B C D + * / \ + * B C + * + */ +static ZixTreeNode* +rotate_right_left(ZixTreeNode* p, int* height_change) +{ + ZixTreeNode* const q = p->right; + ZixTreeNode* const r = q->left; + + assert(p->balance == 2); + assert(q->balance == -1); + assert(r->balance == -1 || r->balance == 0 || r->balance == 1); + + DEBUG_PRINTF("RL %ld P: %2d Q: %2d R: %2d\n", + (intptr_t)p->data, + p->balance, + q->balance, + r->balance); + + rotate(q, r); + rotate(p, r); + + q->balance += 1 - MIN(0, r->balance); + p->balance -= 1 + MAX(MAX(0, r->balance) + 1, r->balance + q->balance); + // r->balance += MAX(0, q->balance) + MIN(0, p->balance); + + // p->balance = (p->left && p->right) ? -MAX(r->balance, 0) : 0; + // q->balance = - MIN(r->balance, 0); + r->balance = 0; + // assert(r->balance == 0); + + *height_change = -1; + + ASSERT_BALANCE(p); + ASSERT_BALANCE(q); + ASSERT_BALANCE(r); + return r; +} + +static ZixTreeNode* +zix_tree_rebalance(ZixTree* t, ZixTreeNode* node, int* height_change) +{ +#ifdef ZIX_TREE_HYPER_VERIFY + const size_t old_height = height(node); +#endif + DEBUG_PRINTF("REBALANCE %ld (%d)\n", (intptr_t)node->data, node->balance); + *height_change = 0; + const bool is_root = !node->parent; + assert((is_root && t->root == node) || (!is_root && t->root != node)); + ZixTreeNode* replacement = node; + if (node->balance == -2) { + assert(node->left); + if (node->left->balance == 1) { + replacement = rotate_left_right(node, height_change); + } else { + replacement = rotate_right(node, height_change); + } + } else if (node->balance == 2) { + assert(node->right); + if (node->right->balance == -1) { + replacement = rotate_right_left(node, height_change); + } else { + replacement = rotate_left(node, height_change); + } + } + if (is_root) { + assert(!replacement->parent); + t->root = replacement; + } + DUMP(t); +#ifdef ZIX_TREE_HYPER_VERIFY + assert(old_height + *height_change == height(replacement)); +#endif + return replacement; +} + +ZixStatus +zix_tree_insert(ZixTree* t, void* e, ZixTreeIter** ti) +{ + DEBUG_PRINTF("**** INSERT %ld\n", (intptr_t)e); + int cmp = 0; + ZixTreeNode* n = t->root; + ZixTreeNode* p = NULL; + + // Find the parent p of e + while (n) { + p = n; + cmp = t->cmp(e, n->data, t->cmp_data); + if (cmp < 0) { + n = n->left; + } else if (cmp > 0 || t->allow_duplicates) { + n = n->right; + } else { + if (ti) { + *ti = n; + } + DEBUG_PRINTF("%ld EXISTS!\n", (intptr_t)e); + return ZIX_STATUS_EXISTS; + } + } + + // Allocate a new node n + if (!(n = (ZixTreeNode*)malloc(sizeof(ZixTreeNode)))) { + return ZIX_STATUS_NO_MEM; + } + memset(n, '\0', sizeof(ZixTreeNode)); + n->data = e; + n->balance = 0; + if (ti) { + *ti = n; + } + + bool p_height_increased = false; + + // Make p the parent of n + n->parent = p; + if (!p) { + t->root = n; + } else { + if (cmp < 0) { + assert(!p->left); + assert(p->balance == 0 || p->balance == 1); + p->left = n; + --p->balance; + p_height_increased = !p->right; + } else { + assert(!p->right); + assert(p->balance == 0 || p->balance == -1); + p->right = n; + ++p->balance; + p_height_increased = !p->left; + } + } + + DUMP(t); + + // Rebalance if necessary (at most 1 rotation) + assert(!p || p->balance == -1 || p->balance == 0 || p->balance == 1); + if (p && p_height_increased) { + int height_change = 0; + for (ZixTreeNode* i = p; i && i->parent; i = i->parent) { + if (i == i->parent->left) { + if (--i->parent->balance == -2) { + zix_tree_rebalance(t, i->parent, &height_change); + break; + } + } else { + assert(i == i->parent->right); + if (++i->parent->balance == 2) { + zix_tree_rebalance(t, i->parent, &height_change); + break; + } + } + + if (i->parent->balance == 0) { + break; + } + } + } + + DUMP(t); + + ++t->size; + +#ifdef ZIX_TREE_VERIFY + if (!verify(t, t->root)) { + return ZIX_STATUS_ERROR; + } +#endif + + return ZIX_STATUS_SUCCESS; +} + +ZixStatus +zix_tree_remove(ZixTree* t, ZixTreeIter* ti) +{ + ZixTreeNode* const n = ti; + ZixTreeNode** pp = NULL; // parent pointer + ZixTreeNode* to_balance = n->parent; // lowest node to balance + int d_balance = 0; // delta(balance) for n->parent + + DEBUG_PRINTF("*** REMOVE %ld\n", (intptr_t)n->data); + + if ((n == t->root) && !n->left && !n->right) { + t->root = NULL; + if (t->destroy) { + t->destroy(n->data); + } + free(n); + --t->size; + assert(t->size == 0); + return ZIX_STATUS_SUCCESS; + } + + // Set pp to the parent pointer to n, if applicable + if (n->parent) { + assert(n->parent->left == n || n->parent->right == n); + if (n->parent->left == n) { // n is left child + pp = &n->parent->left; + d_balance = 1; + } else { // n is right child + assert(n->parent->right == n); + pp = &n->parent->right; + d_balance = -1; + } + } + + assert(!pp || *pp == n); + + int height_change = 0; + if (!n->left && !n->right) { + // n is a leaf, just remove it + if (pp) { + *pp = NULL; + to_balance = n->parent; + height_change = (!n->parent->left && !n->parent->right) ? -1 : 0; + } + + } else if (!n->left) { + // Replace n with right (only) child + if (pp) { + *pp = n->right; + to_balance = n->parent; + } else { + t->root = n->right; + } + n->right->parent = n->parent; + height_change = -1; + + } else if (!n->right) { + // Replace n with left (only) child + if (pp) { + *pp = n->left; + to_balance = n->parent; + } else { + t->root = n->left; + } + n->left->parent = n->parent; + height_change = -1; + + } else { + // Replace n with in-order successor (leftmost child of right subtree) + ZixTreeNode* replace = n->right; + while (replace->left) { + assert(replace->left->parent == replace); + replace = replace->left; + } + + // Remove replace from parent (replace_p) + if (replace->parent->left == replace) { + height_change = replace->parent->right ? 0 : -1; + d_balance = 1; + to_balance = replace->parent; + replace->parent->left = replace->right; + } else { + assert(replace->parent == n); + height_change = replace->parent->left ? 0 : -1; + d_balance = -1; + to_balance = replace->parent; + replace->parent->right = replace->right; + } + + if (to_balance == n) { + to_balance = replace; + } + + if (replace->right) { + replace->right->parent = replace->parent; + } + + replace->balance = n->balance; + + // Swap node to delete with replace + if (pp) { + *pp = replace; + } else { + assert(t->root == n); + t->root = replace; + } + + replace->parent = n->parent; + replace->left = n->left; + n->left->parent = replace; + replace->right = n->right; + if (n->right) { + n->right->parent = replace; + } + + assert(!replace->parent || replace->parent->left == replace || + replace->parent->right == replace); + } + + // Rebalance starting at to_balance upwards. + for (ZixTreeNode* i = to_balance; i; i = i->parent) { + i->balance += d_balance; + if (d_balance == 0 || i->balance == -1 || i->balance == 1) { + break; + } + + assert(i != n); + i = zix_tree_rebalance(t, i, &height_change); + if (i->balance == 0) { + height_change = -1; + } + + if (i->parent) { + if (i == i->parent->left) { + d_balance = height_change * -1; + } else { + assert(i == i->parent->right); + d_balance = height_change; + } + } + } + + DUMP(t); + + if (t->destroy) { + t->destroy(n->data); + } + free(n); + + --t->size; + +#ifdef ZIX_TREE_VERIFY + if (!verify(t, t->root)) { + return ZIX_STATUS_ERROR; + } +#endif + + return ZIX_STATUS_SUCCESS; +} + +ZixStatus +zix_tree_find(const ZixTree* t, const void* e, ZixTreeIter** ti) +{ + ZixTreeNode* n = t->root; + while (n) { + const int cmp = t->cmp(e, n->data, t->cmp_data); + if (cmp == 0) { + break; + } + + if (cmp < 0) { + n = n->left; + } else { + n = n->right; + } + } + + *ti = n; + return (n) ? ZIX_STATUS_SUCCESS : ZIX_STATUS_NOT_FOUND; +} + +void* +zix_tree_get(const ZixTreeIter* ti) +{ + return ti ? ti->data : NULL; +} + +ZixTreeIter* +zix_tree_begin(ZixTree* t) +{ + if (!t->root) { + return NULL; + } + + ZixTreeNode* n = t->root; + while (n->left) { + n = n->left; + } + + return n; +} + +ZixTreeIter* +zix_tree_end(ZixTree* ZIX_UNUSED(t)) +{ + return NULL; +} + +ZixTreeIter* +zix_tree_rbegin(ZixTree* t) +{ + if (!t->root) { + return NULL; + } + + ZixTreeNode* n = t->root; + while (n->right) { + n = n->right; + } + + return n; +} + +ZixTreeIter* +zix_tree_rend(ZixTree* ZIX_UNUSED(t)) +{ + return NULL; +} + +bool +zix_tree_iter_is_end(const ZixTreeIter* i) +{ + return !i; +} + +bool +zix_tree_iter_is_rend(const ZixTreeIter* i) +{ + return !i; +} + +ZixTreeIter* +zix_tree_iter_next(ZixTreeIter* i) +{ + if (!i) { + return NULL; + } + + if (i->right) { + i = i->right; + while (i->left) { + i = i->left; + } + } else { + while (i->parent && i->parent->right == i) { // i is a right child + i = i->parent; + } + + i = i->parent; + } + + return i; +} + +ZixTreeIter* +zix_tree_iter_prev(ZixTreeIter* i) +{ + if (!i) { + return NULL; + } + + if (i->left) { + i = i->left; + while (i->right) { + i = i->right; + } + + } else { + while (i->parent && i->parent->left == i) { // i is a left child + i = i->parent; + } + + i = i->parent; + } + + return i; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h new file mode 100644 index 00000000..a2d5fe79 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv/src/zix/tree.h @@ -0,0 +1,164 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef ZIX_TREE_H +#define ZIX_TREE_H + +#include "zix/common.h" + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + @addtogroup zix + @{ + @name Tree + @{ +*/ + +/** + A balanced binary search tree. +*/ +typedef struct ZixTreeImpl ZixTree; + +/** + An iterator over a @ref ZixTree. +*/ +typedef struct ZixTreeNodeImpl ZixTreeIter; + +/** + Create a new (empty) tree. +*/ +ZIX_API +ZixTree* +zix_tree_new(bool allow_duplicates, + ZixComparator cmp, + void* cmp_data, + ZixDestroyFunc destroy); + +/** + Free `t`. +*/ +ZIX_API +void +zix_tree_free(ZixTree* t); + +/** + Return the number of elements in `t`. +*/ +ZIX_PURE_API +size_t +zix_tree_size(const ZixTree* t); + +/** + Insert the element `e` into `t` and point `ti` at the new element. +*/ +ZIX_API +ZixStatus +zix_tree_insert(ZixTree* t, void* e, ZixTreeIter** ti); + +/** + Remove the item pointed at by `ti` from `t`. +*/ +ZIX_API +ZixStatus +zix_tree_remove(ZixTree* t, ZixTreeIter* ti); + +/** + Set `ti` to an element equal to `e` in `t`. + If no such item exists, `ti` is set to NULL. +*/ +ZIX_API +ZixStatus +zix_tree_find(const ZixTree* t, const void* e, ZixTreeIter** ti); + +/** + Return the data associated with the given tree item. +*/ +ZIX_PURE_API +void* +zix_tree_get(const ZixTreeIter* ti); + +/** + Return an iterator to the first (smallest) element in `t`. +*/ +ZIX_PURE_API +ZixTreeIter* +zix_tree_begin(ZixTree* t); + +/** + Return an iterator the the element one past the last element in `t`. +*/ +ZIX_CONST_API +ZixTreeIter* +zix_tree_end(ZixTree* t); + +/** + Return true iff `i` is an iterator to the end of its tree. +*/ +ZIX_CONST_API +bool +zix_tree_iter_is_end(const ZixTreeIter* i); + +/** + Return an iterator to the last (largest) element in `t`. +*/ +ZIX_PURE_API +ZixTreeIter* +zix_tree_rbegin(ZixTree* t); + +/** + Return an iterator the the element one before the first element in `t`. +*/ +ZIX_CONST_API +ZixTreeIter* +zix_tree_rend(ZixTree* t); + +/** + Return true iff `i` is an iterator to the reverse end of its tree. +*/ +ZIX_CONST_API +bool +zix_tree_iter_is_rend(const ZixTreeIter* i); + +/** + Return an iterator that points to the element one past `i`. +*/ +ZIX_PURE_API +ZixTreeIter* +zix_tree_iter_next(ZixTreeIter* i); + +/** + Return an iterator that points to the element one before `i`. +*/ +ZIX_PURE_API +ZixTreeIter* +zix_tree_iter_prev(ZixTreeIter* i); + +/** + @} + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ZIX_TREE_H */ diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h b/modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h new file mode 100644 index 00000000..1a3e2865 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lilv_config.h @@ -0,0 +1,33 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +/* + Instead of providing a config header per lv2-related library, we put all + of the config in a single file, which is included below. +*/ + +#pragma once + +#include "juce_lv2_config.h" diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/COPYING b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/COPYING new file mode 100644 index 00000000..4d594524 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/COPYING @@ -0,0 +1,16 @@ +Copyright 2006-2012 Steve Harris, David Robillard. + +Based on LADSPA, Copyright 2000-2002 Richard W.E. Furse, +Paul Barton-Davis, Stefan Westerfeld. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c new file mode 100644 index 00000000..ae368c89 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test-utils.c @@ -0,0 +1,73 @@ +/* + Copyright 2012-2018 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lv2/atom/atom.h" +#include "lv2/atom/forge.h" +#include "lv2/atom/util.h" +#include "lv2/log/log.h" +#include "lv2/urid/urid.h" + +#include +#include +#include + +static char** uris = NULL; +static uint32_t n_uris = 0; + +static char* +copy_string(const char* str) +{ + const size_t len = strlen(str); + char* dup = (char*)malloc(len + 1); + memcpy(dup, str, len + 1); + return dup; +} + +static LV2_URID +urid_map(LV2_URID_Map_Handle handle, const char* uri) +{ + for (uint32_t i = 0; i < n_uris; ++i) { + if (!strcmp(uris[i], uri)) { + return i + 1; + } + } + + uris = (char**)realloc(uris, ++n_uris * sizeof(char*)); + uris[n_uris - 1] = copy_string(uri); + return n_uris; +} + +static void +free_urid_map(void) +{ + for (uint32_t i = 0; i < n_uris; ++i) { + free(uris[i]); + } + + free(uris); +} + +LV2_LOG_FUNC(1, 2) +static int +test_fail(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, args); + va_end(args); + return 1; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c new file mode 100644 index 00000000..64f89530 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom-test.c @@ -0,0 +1,367 @@ +/* + Copyright 2012-2015 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lv2/atom/atom-test-utils.c" +#include "lv2/atom/atom.h" +#include "lv2/atom/forge.h" +#include "lv2/atom/util.h" +#include "lv2/urid/urid.h" + +#include +#include +#include +#include +#include + +int +main(void) +{ + LV2_URID_Map map = {NULL, urid_map}; + LV2_Atom_Forge forge; + lv2_atom_forge_init(&forge, &map); + + LV2_URID eg_Object = urid_map(NULL, "http://example.org/Object"); + LV2_URID eg_one = urid_map(NULL, "http://example.org/one"); + LV2_URID eg_two = urid_map(NULL, "http://example.org/two"); + LV2_URID eg_three = urid_map(NULL, "http://example.org/three"); + LV2_URID eg_four = urid_map(NULL, "http://example.org/four"); + LV2_URID eg_true = urid_map(NULL, "http://example.org/true"); + LV2_URID eg_false = urid_map(NULL, "http://example.org/false"); + LV2_URID eg_path = urid_map(NULL, "http://example.org/path"); + LV2_URID eg_uri = urid_map(NULL, "http://example.org/uri"); + LV2_URID eg_urid = urid_map(NULL, "http://example.org/urid"); + LV2_URID eg_string = urid_map(NULL, "http://example.org/string"); + LV2_URID eg_literal = urid_map(NULL, "http://example.org/literal"); + LV2_URID eg_tuple = urid_map(NULL, "http://example.org/tuple"); + LV2_URID eg_vector = urid_map(NULL, "http://example.org/vector"); + LV2_URID eg_vector2 = urid_map(NULL, "http://example.org/vector2"); + LV2_URID eg_seq = urid_map(NULL, "http://example.org/seq"); + +#define BUF_SIZE 1024 +#define NUM_PROPS 15 + + uint8_t buf[BUF_SIZE]; + lv2_atom_forge_set_buffer(&forge, buf, BUF_SIZE); + + LV2_Atom_Forge_Frame obj_frame; + LV2_Atom* obj = lv2_atom_forge_deref( + &forge, lv2_atom_forge_object(&forge, &obj_frame, 0, eg_Object)); + + // eg_one = (Int)1 + lv2_atom_forge_key(&forge, eg_one); + LV2_Atom_Int* one = + (LV2_Atom_Int*)lv2_atom_forge_deref(&forge, lv2_atom_forge_int(&forge, 1)); + if (one->body != 1) { + return test_fail("%d != 1\n", one->body); + } + + // eg_two = (Long)2 + lv2_atom_forge_key(&forge, eg_two); + LV2_Atom_Long* two = (LV2_Atom_Long*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_long(&forge, 2)); + if (two->body != 2) { + return test_fail("%" PRId64 " != 2\n", two->body); + } + + // eg_three = (Float)3.0 + lv2_atom_forge_key(&forge, eg_three); + LV2_Atom_Float* three = (LV2_Atom_Float*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_float(&forge, 3.0f)); + if (three->body != 3) { + return test_fail("%f != 3\n", three->body); + } + + // eg_four = (Double)4.0 + lv2_atom_forge_key(&forge, eg_four); + LV2_Atom_Double* four = (LV2_Atom_Double*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_double(&forge, 4.0)); + if (four->body != 4) { + return test_fail("%f != 4\n", four->body); + } + + // eg_true = (Bool)1 + lv2_atom_forge_key(&forge, eg_true); + LV2_Atom_Bool* t = (LV2_Atom_Bool*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_bool(&forge, true)); + if (t->body != 1) { + return test_fail("%d != 1 (true)\n", t->body); + } + + // eg_false = (Bool)0 + lv2_atom_forge_key(&forge, eg_false); + LV2_Atom_Bool* f = (LV2_Atom_Bool*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_bool(&forge, false)); + if (f->body != 0) { + return test_fail("%d != 0 (false)\n", f->body); + } + + // eg_path = (Path)"/foo/bar" + const char* pstr = "/foo/bar"; + const uint32_t pstr_len = (uint32_t)strlen(pstr); + lv2_atom_forge_key(&forge, eg_path); + LV2_Atom_String* path = (LV2_Atom_String*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_uri(&forge, pstr, pstr_len)); + char* pbody = (char*)LV2_ATOM_BODY(path); + if (strcmp(pbody, pstr)) { + return test_fail("%s != \"%s\"\n", pbody, pstr); + } + + // eg_uri = (URI)"http://example.org/value" + const char* ustr = "http://example.org/value"; + const uint32_t ustr_len = (uint32_t)strlen(ustr); + lv2_atom_forge_key(&forge, eg_uri); + LV2_Atom_String* uri = (LV2_Atom_String*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_uri(&forge, ustr, ustr_len)); + char* ubody = (char*)LV2_ATOM_BODY(uri); + if (strcmp(ubody, ustr)) { + return test_fail("%s != \"%s\"\n", ubody, ustr); + } + + // eg_urid = (URID)"http://example.org/value" + LV2_URID eg_value = urid_map(NULL, "http://example.org/value"); + lv2_atom_forge_key(&forge, eg_urid); + LV2_Atom_URID* urid = (LV2_Atom_URID*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_urid(&forge, eg_value)); + if (urid->body != eg_value) { + return test_fail("%u != %u\n", urid->body, eg_value); + } + + // eg_string = (String)"hello" + lv2_atom_forge_key(&forge, eg_string); + LV2_Atom_String* string = (LV2_Atom_String*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_string(&forge, "hello", strlen("hello"))); + char* sbody = (char*)LV2_ATOM_BODY(string); + if (strcmp(sbody, "hello")) { + return test_fail("%s != \"hello\"\n", sbody); + } + + // eg_literal = (Literal)"hello"@fr + lv2_atom_forge_key(&forge, eg_literal); + LV2_Atom_Literal* literal = (LV2_Atom_Literal*)lv2_atom_forge_deref( + &forge, + lv2_atom_forge_literal(&forge, + "bonjour", + strlen("bonjour"), + 0, + urid_map(NULL, "http://lexvo.org/id/term/fr"))); + char* lbody = (char*)LV2_ATOM_CONTENTS(LV2_Atom_Literal, literal); + if (strcmp(lbody, "bonjour")) { + return test_fail("%s != \"bonjour\"\n", lbody); + } + + // eg_tuple = "foo",true + lv2_atom_forge_key(&forge, eg_tuple); + LV2_Atom_Forge_Frame tuple_frame; + LV2_Atom_Tuple* tuple = (LV2_Atom_Tuple*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_tuple(&forge, &tuple_frame)); + LV2_Atom_String* tup0 = (LV2_Atom_String*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_string(&forge, "foo", strlen("foo"))); + LV2_Atom_Bool* tup1 = (LV2_Atom_Bool*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_bool(&forge, true)); + lv2_atom_forge_pop(&forge, &tuple_frame); + LV2_Atom* i = lv2_atom_tuple_begin(tuple); + if (lv2_atom_tuple_is_end(LV2_ATOM_BODY(tuple), tuple->atom.size, i)) { + return test_fail("Tuple iterator is empty\n"); + } + LV2_Atom* tup0i = i; + if (!lv2_atom_equals((LV2_Atom*)tup0, tup0i)) { + return test_fail("Corrupt tuple element 0\n"); + } + i = lv2_atom_tuple_next(i); + if (lv2_atom_tuple_is_end(LV2_ATOM_BODY(tuple), tuple->atom.size, i)) { + return test_fail("Premature end of tuple iterator\n"); + } + LV2_Atom* tup1i = i; + if (!lv2_atom_equals((LV2_Atom*)tup1, tup1i)) { + return test_fail("Corrupt tuple element 1\n"); + } + i = lv2_atom_tuple_next(i); + if (!lv2_atom_tuple_is_end(LV2_ATOM_BODY(tuple), tuple->atom.size, i)) { + return test_fail("Tuple iter is not at end\n"); + } + + // eg_vector = (Vector)1,2,3,4 + lv2_atom_forge_key(&forge, eg_vector); + int32_t elems[] = {1, 2, 3, 4}; + LV2_Atom_Vector* vector = (LV2_Atom_Vector*)lv2_atom_forge_deref( + &forge, + lv2_atom_forge_vector(&forge, sizeof(int32_t), forge.Int, 4, elems)); + void* vec_body = LV2_ATOM_CONTENTS(LV2_Atom_Vector, vector); + if (memcmp(elems, vec_body, sizeof(elems))) { + return test_fail("Corrupt vector\n"); + } + + // eg_vector2 = (Vector)1,2,3,4 + lv2_atom_forge_key(&forge, eg_vector2); + LV2_Atom_Forge_Frame vec_frame; + LV2_Atom_Vector* vector2 = (LV2_Atom_Vector*)lv2_atom_forge_deref( + &forge, + lv2_atom_forge_vector_head(&forge, &vec_frame, sizeof(int32_t), forge.Int)); + for (unsigned e = 0; e < sizeof(elems) / sizeof(int32_t); ++e) { + lv2_atom_forge_int(&forge, elems[e]); + } + lv2_atom_forge_pop(&forge, &vec_frame); + if (!lv2_atom_equals(&vector->atom, &vector2->atom)) { + return test_fail("Vector != Vector2\n"); + } + + // eg_seq = (Sequence)1, 2 + lv2_atom_forge_key(&forge, eg_seq); + LV2_Atom_Forge_Frame seq_frame; + LV2_Atom_Sequence* seq = (LV2_Atom_Sequence*)lv2_atom_forge_deref( + &forge, lv2_atom_forge_sequence_head(&forge, &seq_frame, 0)); + lv2_atom_forge_frame_time(&forge, 0); + lv2_atom_forge_int(&forge, 1); + lv2_atom_forge_frame_time(&forge, 1); + lv2_atom_forge_int(&forge, 2); + lv2_atom_forge_pop(&forge, &seq_frame); + + lv2_atom_forge_pop(&forge, &obj_frame); + + // Test equality + LV2_Atom_Int itwo = {{forge.Int, sizeof(int32_t)}, 2}; + if (lv2_atom_equals((LV2_Atom*)one, (LV2_Atom*)two)) { + return test_fail("1 == 2.0\n"); + } else if (lv2_atom_equals((LV2_Atom*)one, (LV2_Atom*)&itwo)) { + return test_fail("1 == 2\n"); + } else if (!lv2_atom_equals((LV2_Atom*)one, (LV2_Atom*)one)) { + return test_fail("1 != 1\n"); + } + + unsigned n_events = 0; + LV2_ATOM_SEQUENCE_FOREACH (seq, ev) { + if (ev->time.frames != n_events) { + return test_fail("Corrupt event %u has bad time\n", n_events); + } else if (ev->body.type != forge.Int) { + return test_fail("Corrupt event %u has bad type\n", n_events); + } else if (((LV2_Atom_Int*)&ev->body)->body != (int)n_events + 1) { + return test_fail("Event %u != %u\n", n_events, n_events + 1); + } + ++n_events; + } + + int n_props = 0; + LV2_ATOM_OBJECT_FOREACH ((LV2_Atom_Object*)obj, prop) { + if (!prop->key) { + return test_fail("Corrupt property %d has no key\n", n_props); + } else if (prop->context) { + return test_fail("Corrupt property %d has context\n", n_props); + } + ++n_props; + } + + if (n_props != NUM_PROPS) { + return test_fail( + "Corrupt object has %d properties != %d\n", n_props, NUM_PROPS); + } + + struct { + const LV2_Atom* one; + const LV2_Atom* two; + const LV2_Atom* three; + const LV2_Atom* four; + const LV2_Atom* affirmative; + const LV2_Atom* negative; + const LV2_Atom* path; + const LV2_Atom* uri; + const LV2_Atom* urid; + const LV2_Atom* string; + const LV2_Atom* literal; + const LV2_Atom* tuple; + const LV2_Atom* vector; + const LV2_Atom* vector2; + const LV2_Atom* seq; + } matches; + + memset(&matches, 0, sizeof(matches)); + + LV2_Atom_Object_Query q[] = {{eg_one, &matches.one}, + {eg_two, &matches.two}, + {eg_three, &matches.three}, + {eg_four, &matches.four}, + {eg_true, &matches.affirmative}, + {eg_false, &matches.negative}, + {eg_path, &matches.path}, + {eg_uri, &matches.uri}, + {eg_urid, &matches.urid}, + {eg_string, &matches.string}, + {eg_literal, &matches.literal}, + {eg_tuple, &matches.tuple}, + {eg_vector, &matches.vector}, + {eg_vector2, &matches.vector2}, + {eg_seq, &matches.seq}, + LV2_ATOM_OBJECT_QUERY_END}; + + int n_matches = lv2_atom_object_query((LV2_Atom_Object*)obj, q); + for (int n = 0; n < 2; ++n) { + if (n_matches != n_props) { + return test_fail("Query failed, %d matches != %d\n", n_matches, n_props); + } else if (!lv2_atom_equals((LV2_Atom*)one, matches.one)) { + return test_fail("Bad match one\n"); + } else if (!lv2_atom_equals((LV2_Atom*)two, matches.two)) { + return test_fail("Bad match two\n"); + } else if (!lv2_atom_equals((LV2_Atom*)three, matches.three)) { + return test_fail("Bad match three\n"); + } else if (!lv2_atom_equals((LV2_Atom*)four, matches.four)) { + return test_fail("Bad match four\n"); + } else if (!lv2_atom_equals((LV2_Atom*)t, matches.affirmative)) { + return test_fail("Bad match true\n"); + } else if (!lv2_atom_equals((LV2_Atom*)f, matches.negative)) { + return test_fail("Bad match false\n"); + } else if (!lv2_atom_equals((LV2_Atom*)path, matches.path)) { + return test_fail("Bad match path\n"); + } else if (!lv2_atom_equals((LV2_Atom*)uri, matches.uri)) { + return test_fail("Bad match URI\n"); + } else if (!lv2_atom_equals((LV2_Atom*)string, matches.string)) { + return test_fail("Bad match string\n"); + } else if (!lv2_atom_equals((LV2_Atom*)literal, matches.literal)) { + return test_fail("Bad match literal\n"); + } else if (!lv2_atom_equals((LV2_Atom*)tuple, matches.tuple)) { + return test_fail("Bad match tuple\n"); + } else if (!lv2_atom_equals((LV2_Atom*)vector, matches.vector)) { + return test_fail("Bad match vector\n"); + } else if (!lv2_atom_equals((LV2_Atom*)vector, matches.vector2)) { + return test_fail("Bad match vector2\n"); + } else if (!lv2_atom_equals((LV2_Atom*)seq, matches.seq)) { + return test_fail("Bad match sequence\n"); + } + memset(&matches, 0, sizeof(matches)); + + // clang-format off + n_matches = lv2_atom_object_get((LV2_Atom_Object*)obj, + eg_one, &matches.one, + eg_two, &matches.two, + eg_three, &matches.three, + eg_four, &matches.four, + eg_true, &matches.affirmative, + eg_false, &matches.negative, + eg_path, &matches.path, + eg_uri, &matches.uri, + eg_urid, &matches.urid, + eg_string, &matches.string, + eg_literal, &matches.literal, + eg_tuple, &matches.tuple, + eg_vector, &matches.vector, + eg_vector2, &matches.vector2, + eg_seq, &matches.seq, + 0); + // clang-format on + } + + free_urid_map(); + + return 0; +} diff --git a/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h new file mode 100644 index 00000000..54831558 --- /dev/null +++ b/modules/juce_audio_processors/format_types/LV2_SDK/lv2/lv2/atom/atom.h @@ -0,0 +1,260 @@ +/* + Copyright 2008-2016 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_ATOM_H +#define LV2_ATOM_H + +/** + @defgroup atom Atom + @ingroup lv2 + + A generic value container and several data types. + + See for details. + + @{ +*/ + +#include + +// clang-format off + +#define LV2_ATOM_URI "http://lv2plug.in/ns/ext/atom" ///< http://lv2plug.in/ns/ext/atom +#define LV2_ATOM_PREFIX LV2_ATOM_URI "#" ///< http://lv2plug.in/ns/ext/atom# + +#define LV2_ATOM__Atom LV2_ATOM_PREFIX "Atom" ///< http://lv2plug.in/ns/ext/atom#Atom +#define LV2_ATOM__AtomPort LV2_ATOM_PREFIX "AtomPort" ///< http://lv2plug.in/ns/ext/atom#AtomPort +#define LV2_ATOM__Blank LV2_ATOM_PREFIX "Blank" ///< http://lv2plug.in/ns/ext/atom#Blank +#define LV2_ATOM__Bool LV2_ATOM_PREFIX "Bool" ///< http://lv2plug.in/ns/ext/atom#Bool +#define LV2_ATOM__Chunk LV2_ATOM_PREFIX "Chunk" ///< http://lv2plug.in/ns/ext/atom#Chunk +#define LV2_ATOM__Double LV2_ATOM_PREFIX "Double" ///< http://lv2plug.in/ns/ext/atom#Double +#define LV2_ATOM__Event LV2_ATOM_PREFIX "Event" ///< http://lv2plug.in/ns/ext/atom#Event +#define LV2_ATOM__Float LV2_ATOM_PREFIX "Float" ///< http://lv2plug.in/ns/ext/atom#Float +#define LV2_ATOM__Int LV2_ATOM_PREFIX "Int" ///< http://lv2plug.in/ns/ext/atom#Int +#define LV2_ATOM__Literal LV2_ATOM_PREFIX "Literal" ///< http://lv2plug.in/ns/ext/atom#Literal +#define LV2_ATOM__Long LV2_ATOM_PREFIX "Long" ///< http://lv2plug.in/ns/ext/atom#Long +#define LV2_ATOM__Number LV2_ATOM_PREFIX "Number" ///< http://lv2plug.in/ns/ext/atom#Number +#define LV2_ATOM__Object LV2_ATOM_PREFIX "Object" ///< http://lv2plug.in/ns/ext/atom#Object +#define LV2_ATOM__Path LV2_ATOM_PREFIX "Path" ///< http://lv2plug.in/ns/ext/atom#Path +#define LV2_ATOM__Property LV2_ATOM_PREFIX "Property" ///< http://lv2plug.in/ns/ext/atom#Property +#define LV2_ATOM__Resource LV2_ATOM_PREFIX "Resource" ///< http://lv2plug.in/ns/ext/atom#Resource +#define LV2_ATOM__Sequence LV2_ATOM_PREFIX "Sequence" ///< http://lv2plug.in/ns/ext/atom#Sequence +#define LV2_ATOM__Sound LV2_ATOM_PREFIX "Sound" ///< http://lv2plug.in/ns/ext/atom#Sound +#define LV2_ATOM__String LV2_ATOM_PREFIX "String" ///< http://lv2plug.in/ns/ext/atom#String +#define LV2_ATOM__Tuple LV2_ATOM_PREFIX "Tuple" ///< http://lv2plug.in/ns/ext/atom#Tuple +#define LV2_ATOM__URI LV2_ATOM_PREFIX "URI" ///< http://lv2plug.in/ns/ext/atom#URI +#define LV2_ATOM__URID LV2_ATOM_PREFIX "URID" ///< http://lv2plug.in/ns/ext/atom#URID +#define LV2_ATOM__Vector LV2_ATOM_PREFIX "Vector" ///< http://lv2plug.in/ns/ext/atom#Vector +#define LV2_ATOM__atomTransfer LV2_ATOM_PREFIX "atomTransfer" ///< http://lv2plug.in/ns/ext/atom#atomTransfer +#define LV2_ATOM__beatTime LV2_ATOM_PREFIX "beatTime" ///< http://lv2plug.in/ns/ext/atom#beatTime +#define LV2_ATOM__bufferType LV2_ATOM_PREFIX "bufferType" ///< http://lv2plug.in/ns/ext/atom#bufferType +#define LV2_ATOM__childType LV2_ATOM_PREFIX "childType" ///< http://lv2plug.in/ns/ext/atom#childType +#define LV2_ATOM__eventTransfer LV2_ATOM_PREFIX "eventTransfer" ///< http://lv2plug.in/ns/ext/atom#eventTransfer +#define LV2_ATOM__frameTime LV2_ATOM_PREFIX "frameTime" ///< http://lv2plug.in/ns/ext/atom#frameTime +#define LV2_ATOM__supports LV2_ATOM_PREFIX "supports" ///< http://lv2plug.in/ns/ext/atom#supports +#define LV2_ATOM__timeUnit LV2_ATOM_PREFIX "timeUnit" ///< http://lv2plug.in/ns/ext/atom#timeUnit + +// clang-format on + +#define LV2_ATOM_REFERENCE_TYPE 0 ///< The special type for a reference atom + +#ifdef __cplusplus +extern "C" { +#endif + +/** @cond */ +/** This expression will fail to compile if double does not fit in 64 bits. */ +typedef char lv2_atom_assert_double_fits_in_64_bits + [((sizeof(double) <= sizeof(uint64_t)) * 2) - 1]; +/** @endcond */ + +/** + Return a pointer to the contents of an Atom. The "contents" of an atom + is the data past the complete type-specific header. + @param type The type of the atom, for example LV2_Atom_String. + @param atom A variable-sized atom. +*/ +#define LV2_ATOM_CONTENTS(type, atom) ((void*)((uint8_t*)(atom) + sizeof(type))) + +/** + Const version of LV2_ATOM_CONTENTS. +*/ +#define LV2_ATOM_CONTENTS_CONST(type, atom) \ + ((const void*)((const uint8_t*)(atom) + sizeof(type))) + +/** + Return a pointer to the body of an Atom. The "body" of an atom is the + data just past the LV2_Atom head (i.e. the same offset for all types). +*/ +#define LV2_ATOM_BODY(atom) LV2_ATOM_CONTENTS(LV2_Atom, atom) + +/** + Const version of LV2_ATOM_BODY. +*/ +#define LV2_ATOM_BODY_CONST(atom) LV2_ATOM_CONTENTS_CONST(LV2_Atom, atom) + +/** The header of an atom:Atom. */ +typedef struct { + uint32_t size; /**< Size in bytes, not including type and size. */ + uint32_t type; /**< Type of this atom (mapped URI). */ +} LV2_Atom; + +/** An atom:Int or atom:Bool. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + int32_t body; /**< Integer value. */ +} LV2_Atom_Int; + +/** An atom:Long. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + int64_t body; /**< Integer value. */ +} LV2_Atom_Long; + +/** An atom:Float. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + float body; /**< Floating point value. */ +} LV2_Atom_Float; + +/** An atom:Double. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + double body; /**< Floating point value. */ +} LV2_Atom_Double; + +/** An atom:Bool. May be cast to LV2_Atom. */ +typedef LV2_Atom_Int LV2_Atom_Bool; + +/** An atom:URID. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + uint32_t body; /**< URID. */ +} LV2_Atom_URID; + +/** An atom:String. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + /* Contents (a null-terminated UTF-8 string) follow here. */ +} LV2_Atom_String; + +/** The body of an atom:Literal. */ +typedef struct { + uint32_t datatype; /**< Datatype URID. */ + uint32_t lang; /**< Language URID. */ + /* Contents (a null-terminated UTF-8 string) follow here. */ +} LV2_Atom_Literal_Body; + +/** An atom:Literal. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Literal_Body body; /**< Body. */ +} LV2_Atom_Literal; + +/** An atom:Tuple. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + /* Contents (a series of complete atoms) follow here. */ +} LV2_Atom_Tuple; + +/** The body of an atom:Vector. */ +typedef struct { + uint32_t child_size; /**< The size of each element in the vector. */ + uint32_t child_type; /**< The type of each element in the vector. */ + /* Contents (a series of packed atom bodies) follow here. */ +} LV2_Atom_Vector_Body; + +/** An atom:Vector. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Vector_Body body; /**< Body. */ +} LV2_Atom_Vector; + +/** The body of an atom:Property (typically in an atom:Object). */ +typedef struct { + uint32_t key; /**< Key (predicate) (mapped URI). */ + uint32_t context; /**< Context URID (may be, and generally is, 0). */ + LV2_Atom value; /**< Value atom header. */ + /* Value atom body follows here. */ +} LV2_Atom_Property_Body; + +/** An atom:Property. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Property_Body body; /**< Body. */ +} LV2_Atom_Property; + +/** The body of an atom:Object. May be cast to LV2_Atom. */ +typedef struct { + uint32_t id; /**< URID, or 0 for blank. */ + uint32_t otype; /**< Type URID (same as rdf:type, for fast dispatch). */ + /* Contents (a series of property bodies) follow here. */ +} LV2_Atom_Object_Body; + +/** An atom:Object. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Object_Body body; /**< Body. */ +} LV2_Atom_Object; + +/** The header of an atom:Event. Note this type is NOT an LV2_Atom. */ +typedef struct { + /** Time stamp. Which type is valid is determined by context. */ + union { + int64_t frames; /**< Time in audio frames. */ + double beats; /**< Time in beats. */ + } time; + LV2_Atom body; /**< Event body atom header. */ + /* Body atom contents follow here. */ +} LV2_Atom_Event; + +/** + The body of an atom:Sequence (a sequence of events). + + The unit field is either a URID that described an appropriate time stamp + type, or may be 0 where a default stamp type is known. For + LV2_Descriptor::run(), the default stamp type is audio frames. + + The contents of a sequence is a series of LV2_Atom_Event, each aligned + to 64-bits, for example: +